summaryrefslogtreecommitdiff
path: root/chip/lm4/i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/lm4/i2c.c')
-rwxr-xr-x[-rw-r--r--]chip/lm4/i2c.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/chip/lm4/i2c.c b/chip/lm4/i2c.c
index 2c6bbab8c4..a1a152030d 100644..100755
--- a/chip/lm4/i2c.c
+++ b/chip/lm4/i2c.c
@@ -161,8 +161,8 @@ int i2c_do_work(int port)
return 0;
}
-int i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size,
- uint8_t *in, int in_size, int flags)
+static int i2c_xfer_unit(int port, int slave_addr, const uint8_t *out,
+ int out_size, uint8_t *in, int in_size, int flags)
{
struct i2c_port_data *pd = pdata + port;
uint32_t reg_mcs = LM4_I2C_MCS(port);
@@ -242,6 +242,26 @@ int i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size,
return pd->err;
}
+#ifndef CONFIG_I2C_RETRY_CNT
+#define CONFIG_I2C_RETRY_CNT 1
+#endif
+
+int i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size,
+ uint8_t *in, int in_size, int flags)
+{
+ int cnt = CONFIG_I2C_RETRY_CNT;
+ int rv;
+
+ for(;cnt > 0; cnt --){
+ rv = i2c_xfer_unit(port, slave_addr, out, out_size, in, in_size, flags);
+ if(rv == 0)
+ break;
+ usleep(100);
+ }
+
+ return rv;
+}
+
int i2c_raw_get_scl(int port)
{
enum gpio_signal g;