diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2017-06-23 17:35:27 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-07-05 14:24:49 -0700 |
commit | 67759f3553555a7ea6c3a5296934cbbed2297c68 (patch) | |
tree | d5ce3d98cca1c0ff9cb7ac2f94dc1bf2d79fe566 /common/i2c_master.c | |
parent | e3336f4c8d4fb59137d35f87f4a42d22848aabcd (diff) | |
download | chrome-ec-67759f3553555a7ea6c3a5296934cbbed2297c68.tar.gz |
virtual_battery: Remove direct i2c access
Virtual battery implements a smart battery interface, but the actual
battery on the system may speak a different protocol. Support such
batteries by removing direct i2c access from the virtual battery driver.
Fetch data from storage when available, and call generic battery
routines when not.
BUG=chromium:717753
BRANCH=None
TEST=Manual on kevin, boot and verify "Unhandled VB reg" prints are not
seen. Verify by-eye that all regs in cros 4.4 kernel sbs-battery.c are
handled (except REG_MANUFACTURER_DATA). Verify that sysfs manufacturer,
model name, time_to_full_avg and time_to_empty_avg values are all sane.
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: Ia8fc0a80ac7576fa8bdcc3b7dac0609d9d754234
Reviewed-on: https://chromium-review.googlesource.com/547004
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'common/i2c_master.c')
-rw-r--r-- | common/i2c_master.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/common/i2c_master.c b/common/i2c_master.c index 1dc1a09b64..25b31613fa 100644 --- a/common/i2c_master.c +++ b/common/i2c_master.c @@ -541,6 +541,7 @@ static int i2c_command_passthru(struct host_cmd_handler_args *args) const uint8_t *out; int in_len; int ret, i; + int port_is_locked = 0; #ifdef CONFIG_BATTERY_CUT_OFF /* @@ -571,8 +572,6 @@ static int i2c_command_passthru(struct host_cmd_handler_args *args) out = args->params + sizeof(*params) + params->num_msgs * sizeof(*msg); in_len = 0; - i2c_lock(params->port, 1); - for (resp->num_msgs = 0, msg = params->msg; resp->num_msgs < params->num_msgs; resp->num_msgs++, msg++) { @@ -609,10 +608,13 @@ static int i2c_command_passthru(struct host_cmd_handler_args *args) #ifdef CONFIG_I2C_PASSTHRU_RESTRICTED if (system_is_locked() && !board_allow_i2c_passthru(params->port)) { - i2c_lock(params->port, 0); + if (port_is_locked) + i2c_lock(params->port, 0); return EC_RES_ACCESS_DENIED; } #endif + if (!port_is_locked) + i2c_lock(params->port, (port_is_locked = 1)); rv = i2c_xfer(params->port, addr, out, write_len, &resp->data[in_len], read_len, xferflags); } @@ -632,7 +634,8 @@ static int i2c_command_passthru(struct host_cmd_handler_args *args) args->response_size = sizeof(*resp) + in_len; /* Unlock port */ - i2c_lock(params->port, 0); + if (port_is_locked) + i2c_lock(params->port, 0); /* * Return success even if transfer failed so response is sent. Host |