summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSheng-Liang Song <ssl@chromium.org>2014-08-19 16:24:11 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-08-26 03:07:03 +0000
commit746743709747cfcd26be7b67df0e7fbc7a9b193f (patch)
tree3dac81d0b0f826e0db9315531e5ea2fb18a67205
parent0535178d29df7779c4caed5d854a7c19d6e0b73c (diff)
downloadchrome-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.c9
-rw-r--r--chip/lm4/registers.h2
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)