diff options
author | Denis Brockus <dbrockus@chromium.org> | 2020-01-09 07:37:46 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-01-09 16:28:47 +0000 |
commit | 890af626b1524e3ca7de09646ea8e16c04bf7bf1 (patch) | |
tree | 05f8e3a9927a92a20c4ff29d143ca8bcea73cce0 | |
parent | b97274ff4d947107ab8dc66d7508e40bde4ed818 (diff) | |
download | chrome-ec-890af626b1524e3ca7de09646ea8e16c04bf7bf1.tar.gz |
i2c: always write on read/modify/write
The optimization was not working as expected on some
hardware. So for safety reasons, just removing the
don't write optimization
BUG=b:147338240
BRANCH=none
TEST=verify I2C works properly on USB-C
Change-Id: I0c65e52c83f787c05ae8e26b37c086d24fb33cc6
Signed-off-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1992835
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Commit-Queue: Tim Wawrzynczak <twawrzynczak@chromium.org>
Tested-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r-- | common/i2c_master.c | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/common/i2c_master.c b/common/i2c_master.c index beae1323e4..ceed58b139 100644 --- a/common/i2c_master.c +++ b/common/i2c_master.c @@ -432,19 +432,16 @@ int i2c_update8(const int port, const enum mask_update_action action) { int rv; - int val, oldval; + int val; - rv = i2c_read8(port, slave_addr_flags, offset, &oldval); + rv = i2c_read8(port, slave_addr_flags, offset, &val); if (rv) return rv; - val = (action == MASK_SET) ? oldval | mask - : oldval & ~mask; + val = (action == MASK_SET) ? val | mask + : val & ~mask; - if (val != oldval) - return i2c_write8(port, slave_addr_flags, offset, val); - - return EC_SUCCESS; + return i2c_write8(port, slave_addr_flags, offset, val); } int i2c_update16(const int port, @@ -454,19 +451,16 @@ int i2c_update16(const int port, const enum mask_update_action action) { int rv; - int val, oldval; + int val; - rv = i2c_read16(port, slave_addr_flags, offset, &oldval); + rv = i2c_read16(port, slave_addr_flags, offset, &val); if (rv) return rv; - val = (action == MASK_SET) ? oldval | mask - : oldval & ~mask; + val = (action == MASK_SET) ? val | mask + : val & ~mask; - if (val != oldval) - return i2c_write16(port, slave_addr_flags, offset, val); - - return EC_SUCCESS; + return i2c_write16(port, slave_addr_flags, offset, val); } int i2c_field_update8(const int port, @@ -476,18 +470,15 @@ int i2c_field_update8(const int port, const uint8_t set_value) { int rv; - int val, oldval; + int val; - rv = i2c_read8(port, slave_addr_flags, offset, &oldval); + rv = i2c_read8(port, slave_addr_flags, offset, &val); if (rv) return rv; - val = (oldval & (~field_mask)) | set_value; + val = (val & (~field_mask)) | set_value; - if (val != oldval) - return i2c_write8(port, slave_addr_flags, offset, val); - - return EC_SUCCESS; + return i2c_write8(port, slave_addr_flags, offset, val); } int i2c_field_update16(const int port, @@ -497,18 +488,15 @@ int i2c_field_update16(const int port, const uint16_t set_value) { int rv; - int val, oldval; + int val; - rv = i2c_read16(port, slave_addr_flags, offset, &oldval); + rv = i2c_read16(port, slave_addr_flags, offset, &val); if (rv) return rv; - val = (oldval & (~field_mask)) | set_value; + val = (val & (~field_mask)) | set_value; - if (val != oldval) - return i2c_write16(port, slave_addr_flags, offset, val); - - return EC_SUCCESS; + return i2c_write16(port, slave_addr_flags, offset, val); } int i2c_read_offset16(const int port, |