summaryrefslogtreecommitdiff
path: root/common/i2c_master.c
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2017-06-23 17:35:27 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-07-05 14:24:49 -0700
commit67759f3553555a7ea6c3a5296934cbbed2297c68 (patch)
treed5ce3d98cca1c0ff9cb7ac2f94dc1bf2d79fe566 /common/i2c_master.c
parente3336f4c8d4fb59137d35f87f4a42d22848aabcd (diff)
downloadchrome-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.c11
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