diff options
author | Sheng-Liang Song <ssl@chromium.org> | 2014-08-19 16:24:11 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-08-26 03:07:03 +0000 |
commit | 746743709747cfcd26be7b67df0e7fbc7a9b193f (patch) | |
tree | 3dac81d0b0f826e0db9315531e5ea2fb18a67205 | |
parent | 0535178d29df7779c4caed5d854a7c19d6e0b73c (diff) | |
download | chrome-ec-746743709747cfcd26be7b67df0e7fbc7a9b193f.tar.gz |
lm4 i2c: fixed lm4 i2c_xfer synchronization issue
Added atomic or/clear when modify a share register
LM4_SYSTEM_SRI2C_ADDR among different i2c ports.
BUG=None
BRANCH=ToT
TEST=Verified on Samus.
Signed-off-by: Sheng-Liang Song <ssl@chromium.org>
Change-Id: Ibf64b05a800ce2b8ddf9735bd3a762ab02031bc8
Reviewed-on: https://chromium-review.googlesource.com/213196
Reviewed-by: Alec Berg <alecaberg@chromium.org>
-rw-r--r-- | chip/lm4/i2c.c | 9 | ||||
-rw-r--r-- | chip/lm4/registers.h | 2 |
2 files changed, 8 insertions, 3 deletions
diff --git a/chip/lm4/i2c.c b/chip/lm4/i2c.c index 0833dfb074..dcb34cfce6 100644 --- a/chip/lm4/i2c.c +++ b/chip/lm4/i2c.c @@ -5,6 +5,7 @@ /* I2C port module for Chrome EC */ +#include "atomic.h" #include "clock.h" #include "common.h" #include "console.h" @@ -187,7 +188,9 @@ int i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size, (i2c_get_line_levels(port) != I2C_LINE_IDLE))) { uint32_t tpr = LM4_I2C_MTPR(port); - CPRINTS("I2C%d bad status 0x%02x, SCL=%d, SDA=%d", port, + CPRINTS("I2C%d Addr:%02X bad status 0x%02x, SCL=%d, SDA=%d", + port, + slave_addr, reg_mcs, i2c_get_line_levels(port) & I2C_LINE_SCL_HIGH, i2c_get_line_levels(port) & I2C_LINE_SDA_HIGH); @@ -196,9 +199,9 @@ int i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size, i2c_unwedge(port); /* Clock timeout or arbitration lost. Reset port to clear. */ - LM4_SYSTEM_SRI2C |= (1 << port); + atomic_or(LM4_SYSTEM_SRI2C_ADDR, (1 << port)); clock_wait_cycles(3); - LM4_SYSTEM_SRI2C &= ~(1 << port); + atomic_clear(LM4_SYSTEM_SRI2C_ADDR, (1 << port)); clock_wait_cycles(3); /* Restore settings */ diff --git a/chip/lm4/registers.h b/chip/lm4/registers.h index 8db3b2c71f..f6e503b208 100644 --- a/chip/lm4/registers.h +++ b/chip/lm4/registers.h @@ -265,6 +265,8 @@ static inline int lm4_fan_addr(int ch, int offset) #define LM4_SYSTEM_SRI2C REG32(0x400fe520) #define LM4_SYSTEM_SREEPROM REG32(0x400fe558) +#define LM4_SYSTEM_SRI2C_ADDR ((uint32_t *)0x400fe520) + #define LM4_SYSTEM_RCGC_BASE ((volatile uint32_t *)0x400fe600) #define LM4_SYSTEM_RCGCGPIO REG32(0x400fe608) #define LM4_SYSTEM_SCGC_BASE ((volatile uint32_t *)0x400fe700) |