summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@chromium.org>2020-01-09 07:37:46 -0700
committerCommit Bot <commit-bot@chromium.org>2020-01-09 16:28:47 +0000
commit890af626b1524e3ca7de09646ea8e16c04bf7bf1 (patch)
tree05f8e3a9927a92a20c4ff29d143ca8bcea73cce0
parentb97274ff4d947107ab8dc66d7508e40bde4ed818 (diff)
downloadchrome-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.c48
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,