Skip to content
Snippets Groups Projects
Commit 3814ea4f authored by Mike Frysinger's avatar Mike Frysinger Committed by Heiko Schocher
Browse files

Blackfin: TWI/I2C: add timeout to transfer


The current transfer code relies on ctrlc() to abort transfers, but this
requires user interactivity.  Naturalize the process with a timeout.

Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
parent f2b4bc04
No related branches found
No related tags found
No related merge requests found
......@@ -60,6 +60,9 @@ struct i2c_msg {
u8 *abuf; /* addr buffer */
};
/* Allow msec timeout per ~byte transfer */
#define I2C_TIMEOUT 10
/**
* wait_for_completion - manage the actual i2c transfer
* @msg: the i2c msg
......@@ -67,8 +70,9 @@ struct i2c_msg {
static int wait_for_completion(struct i2c_msg *msg)
{
uint16_t int_stat;
ulong timebase = get_timer(0);
while (!ctrlc()) {
do {
int_stat = bfin_read_TWI_INT_STAT();
if (int_stat & XMTSERV) {
......@@ -103,7 +107,7 @@ static int wait_for_completion(struct i2c_msg *msg)
debugi("processing MERR");
bfin_write_TWI_INT_STAT(MERR);
SSYNC();
break;
return msg->len;
}
if (int_stat & MCOMP) {
debugi("processing MCOMP");
......@@ -116,7 +120,12 @@ static int wait_for_completion(struct i2c_msg *msg)
} else
break;
}
}
/* If we were able to do something, reset timeout */
if (int_stat)
timebase = get_timer(0);
} while (get_timer(timebase) < I2C_TIMEOUT);
return msg->len;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment