From 15e31390aa8be05e585dabba13fa17b3b9dfc9dc Mon Sep 17 00:00:00 2001 From: yoojin Date: Wed, 16 Jul 2014 16:31:59 +0900 Subject: winky : Add to retry i2c by fail i2c communication. When battery was charging, battery current sometimes set to 256mA by fail i2c communication. So, EC should check i2c communication fail a few more times. When EC checks continual i2c fail 3 times, abnormal current was not occured. BUG=chrome-os-partner:30242 TEST=emerge-winky chromeos-ec Check battery current when battery was charging. Change-Id: Ibcff8b461a3cf0f547b2e1f7e85b7121a0fd543d Reviewed-on: https://chromium-review.googlesource.com/208921 Reviewed-by: Aaron Durbin Reviewed-by: yoojin lee Commit-Queue: yoojin lee Tested-by: yoojin lee Reviewed-by: YongBeum Ha Tested-by: YongBeum Ha --- board/winky/board.h | 1 + chip/lm4/i2c.c | 24 ++++++++++++++++++++++-- include/config.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) mode change 100644 => 100755 chip/lm4/i2c.c mode change 100644 => 100755 include/config.h diff --git a/board/winky/board.h b/board/winky/board.h index acd4aabc5e..9e9700bb24 100755 --- a/board/winky/board.h +++ b/board/winky/board.h @@ -27,6 +27,7 @@ #define CONFIG_CMD_GSV #define CONFIG_EXTPOWER_GPIO #define CONFIG_I2C_PASSTHRU_RESTRICTED +#define CONFIG_I2C_RETRY_CNT 3 #define CONFIG_KEYBOARD_IRQ_GPIO GPIO_KBD_IRQ_L #define CONFIG_KEYBOARD_PROTOCOL_8042 /* TODO(crosbug.com/p/25418): Add LED support */ diff --git a/chip/lm4/i2c.c b/chip/lm4/i2c.c old mode 100644 new mode 100755 index 2c6bbab8c4..a1a152030d --- 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; diff --git a/include/config.h b/include/config.h old mode 100644 new mode 100755 index d9da27867a..7b13bd5a6e --- a/include/config.h +++ b/include/config.h @@ -487,6 +487,7 @@ #undef CONFIG_I2C_DEBUG_PASSTHRU #undef CONFIG_I2C_PASSTHROUGH #undef CONFIG_I2C_PASSTHRU_RESTRICTED +#undef CONFIG_I2C_RETRY_CNT /*****************************************************************************/ -- cgit v1.2.1