summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSheng-Liang Song <ssl@chromium.org>2014-08-26 09:31:34 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-09-04 10:41:56 +0000
commitf269c0b9c42721677c766226cc1bd7a106666792 (patch)
tree2cdf7045a35cd4475a5789c313ed57c1651ca1fd
parentb6096e00165599bdfb7e08b0a8f23dc6f1b03909 (diff)
downloadchrome-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.c37
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;