diff options
author | Sheng-Liang Song <ssl@chromium.org> | 2014-08-26 09:31:34 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-09-04 10:41:56 +0000 |
commit | f269c0b9c42721677c766226cc1bd7a106666792 (patch) | |
tree | 2cdf7045a35cd4475a5789c313ed57c1651ca1fd | |
parent | b6096e00165599bdfb7e08b0a8f23dc6f1b03909 (diff) | |
download | chrome-ec-f269c0b9c42721677c766226cc1bd7a106666792.tar.gz |
EC: smart battery using smbus API
Ref: Common Smart Battery System Inferface Specification v8.0.
Ref: http://smbus.org/specs/smbus20.pdf
Enable smbus read/write APIs with compile options
Ported from ToT CL:209906
BUG=chrome-os-partner:30930
BRANCH=ToT,glimmer
TEST=Verified with LGC & Simplo firmware update.
Signed-off-by: Sheng-Liang Song <ssl@chromium.org>
Change-Id: Ib583b7210394047d63e96a3f6a54d84123174c24
Reviewed-on: https://chromium-review.googlesource.com/214270
Reviewed-by: Shawn Nematbakhsh <shawnn@chromium.org>
-rw-r--r-- | driver/battery/smart.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c index 2d314e5e6f..4265e3329a 100644 --- a/driver/battery/smart.c +++ b/driver/battery/smart.c @@ -9,6 +9,7 @@ #include "battery_smart.h" #include "host_command.h" #include "i2c.h" +#include "smbus.h" #include "timer.h" #include "util.h" @@ -24,12 +25,36 @@ test_mockable int sbc_write(int cmd, int param) int sb_read(int cmd, int *param) { +#ifdef CONFIG_SMBUS + { + int rv; + uint16_t d16 = 0; + rv = smbus_read_word(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, &d16); + *param = d16; + return rv; + } +#else return i2c_read16(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); +#endif } int sb_write(int cmd, int param) { +#ifdef CONFIG_SMBUS + return smbus_write_word(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); +#else return i2c_write16(I2C_PORT_BATTERY, BATTERY_ADDR, cmd, param); +#endif +} + +int sb_read_string(int port, int slave_addr, int offset, uint8_t *data, + int len) +{ +#ifdef CONFIG_SMBUS + return smbus_read_string(port, slave_addr, offset, data, len); +#else + return i2c_read_string(port, slave_addr, offset, data, len); +#endif } int battery_get_mode(int *mode) @@ -192,21 +217,21 @@ test_mockable int battery_manufacture_date(int *year, int *month, int *day) /* Read manufacturer name */ test_mockable int battery_manufacturer_name(char *dest, int size) { - return i2c_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, SB_MANUFACTURER_NAME, dest, size); } /* Read device name */ test_mockable int battery_device_name(char *dest, int size) { - return i2c_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, SB_DEVICE_NAME, dest, size); } /* Read battery type/chemistry */ test_mockable int battery_device_chemistry(char *dest, int size) { - return i2c_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, + return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, SB_DEVICE_CHEMISTRY, dest, size); } @@ -270,7 +295,7 @@ static int host_command_sb_read_word(struct host_cmd_handler_args *args) if (p->reg > 0x1c) return EC_RES_INVALID_PARAM; - rv = i2c_read16(I2C_PORT_BATTERY, BATTERY_ADDR, p->reg, &val); + rv = sb_read(p->reg, &val); if (rv) return EC_RES_ERROR; @@ -290,7 +315,7 @@ static int host_command_sb_write_word(struct host_cmd_handler_args *args) if (p->reg > 0x1c) return EC_RES_INVALID_PARAM; - rv = i2c_write16(I2C_PORT_BATTERY, BATTERY_ADDR, p->reg, p->value); + rv = sb_write(p->reg, p->value); if (rv) return EC_RES_ERROR; @@ -311,7 +336,7 @@ static int host_command_sb_read_block(struct host_cmd_handler_args *args) (p->reg != SB_DEVICE_CHEMISTRY) && (p->reg != SB_MANUFACTURER_DATA)) return EC_RES_INVALID_PARAM; - rv = i2c_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, p->reg, + rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, p->reg, r->data, 32); if (rv) return EC_RES_ERROR; |