summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/eve/battery.c20
-rw-r--r--board/kevin/battery.c20
-rw-r--r--board/pyro/battery.c21
-rw-r--r--board/reef/battery.c21
-rw-r--r--board/samus/battery.c20
-rw-r--r--board/snappy/battery.c21
-rw-r--r--driver/battery/smart.c68
-rw-r--r--include/battery_smart.h6
8 files changed, 81 insertions, 116 deletions
diff --git a/board/eve/battery.c b/board/eve/battery.c
index 1f953fe568..c9dca4abb0 100644
--- a/board/eve/battery.c
+++ b/board/eve/battery.c
@@ -66,16 +66,13 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
if (extpower_is_present()) {
/* Check if battery charging + discharging is disabled. */
- rv = sb_write(SB_MANUFACTURER_ACCESS,
- PARAM_OPERATION_STATUS);
+ rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv)
return BATTERY_DISCONNECT_ERROR;
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
- if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED |
- BATTERY_CHARGING_DISABLED))) {
+ if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
+ BATTERY_CHARGING_DISABLED)) {
not_disconnected = 1;
return BATTERY_NOT_DISCONNECTED;
}
@@ -84,13 +81,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
* Battery is neither charging nor discharging. Verify that
* we didn't enter this state due to a safety fault.
*/
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS);
- if (rv)
- return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
+ rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv || data[2] || data[3] || data[4] || data[5])
return BATTERY_DISCONNECT_ERROR;
diff --git a/board/kevin/battery.c b/board/kevin/battery.c
index c1b2e09c67..50df1d0258 100644
--- a/board/kevin/battery.c
+++ b/board/kevin/battery.c
@@ -80,15 +80,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
if (extpower_is_present()) {
/* Check if battery charging + discharging is disabled. */
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_OPERATION_STATUS);
+ rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv)
return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
- if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED |
- BATTERY_CHARGING_DISABLED))) {
+ if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
+ BATTERY_CHARGING_DISABLED)) {
not_disconnected = 1;
return BATTERY_NOT_DISCONNECTED;
}
@@ -97,13 +94,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
* Battery is neither charging nor discharging. Verify that
* we didn't enter this state due to a safety fault.
*/
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS);
- if (rv)
- return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
+ rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv || data[2] || data[3] || data[4] || data[5])
return BATTERY_DISCONNECT_ERROR;
diff --git a/board/pyro/battery.c b/board/pyro/battery.c
index da5868af8a..a0c9244514 100644
--- a/board/pyro/battery.c
+++ b/board/pyro/battery.c
@@ -159,16 +159,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
if (extpower_is_present()) {
/* Check if battery charging + discharging is disabled. */
- rv = sb_write(SB_MANUFACTURER_ACCESS,
- PARAM_OPERATION_STATUS);
+ rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv)
return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
- if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED |
- BATTERY_CHARGING_DISABLED))) {
+ if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
+ BATTERY_CHARGING_DISABLED)) {
not_disconnected = 1;
return BATTERY_NOT_DISCONNECTED;
}
@@ -177,13 +173,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
* Battery is neither charging nor discharging. Verify that
* we didn't enter this state due to a safety fault.
*/
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS);
- if (rv)
- return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
+ rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv || data[2] || data[3] || data[4] || data[5])
return BATTERY_DISCONNECT_ERROR;
diff --git a/board/reef/battery.c b/board/reef/battery.c
index 689d8cc147..8be335133a 100644
--- a/board/reef/battery.c
+++ b/board/reef/battery.c
@@ -371,16 +371,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
if (extpower_is_present()) {
/* Check if battery charging + discharging is disabled. */
- rv = sb_write(SB_MANUFACTURER_ACCESS,
- PARAM_OPERATION_STATUS);
+ rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv)
return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
- if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED |
- BATTERY_CHARGING_DISABLED))) {
+ if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
+ BATTERY_CHARGING_DISABLED)) {
not_disconnected = 1;
return BATTERY_NOT_DISCONNECTED;
}
@@ -389,13 +385,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
* Battery is neither charging nor discharging. Verify that
* we didn't enter this state due to a safety fault.
*/
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS);
- if (rv)
- return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
+ rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv || data[2] || data[3] || data[4] || data[5])
return BATTERY_DISCONNECT_ERROR;
diff --git a/board/samus/battery.c b/board/samus/battery.c
index ad2c2723ea..64cf417ecc 100644
--- a/board/samus/battery.c
+++ b/board/samus/battery.c
@@ -250,15 +250,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
if (extpower_is_present()) {
/* Check if battery charging + discharging is disabled. */
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_OPERATION_STATUS);
+ rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv)
return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
- if (rv || !(data[3] & BATTERY_DISCHARGING_DISABLED) ||
- !(data[3] & BATTERY_CHARGING_DISABLED)) {
+ if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
+ BATTERY_CHARGING_DISABLED)) {
not_disconnected = 1;
return BATTERY_NOT_DISCONNECTED;
}
@@ -267,13 +264,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
* Battery is neither charging nor discharging. Verify that
* we didn't enter this state due to a safety fault.
*/
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS);
- if (rv)
- return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
+ rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv || data[2] || data[3] || data[4] || data[5])
return BATTERY_DISCONNECT_ERROR;
else
diff --git a/board/snappy/battery.c b/board/snappy/battery.c
index 9884400264..4991c9cfeb 100644
--- a/board/snappy/battery.c
+++ b/board/snappy/battery.c
@@ -87,16 +87,12 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
if (extpower_is_present()) {
/* Check if battery charging + discharging is disabled. */
- rv = sb_write(SB_MANUFACTURER_ACCESS,
- PARAM_OPERATION_STATUS);
+ rv = sb_read_mfgacc(PARAM_OPERATION_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv)
return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
- if (rv || (~data[3] & (BATTERY_DISCHARGING_DISABLED |
- BATTERY_CHARGING_DISABLED))) {
+ if (~data[3] & (BATTERY_DISCHARGING_DISABLED |
+ BATTERY_CHARGING_DISABLED)) {
not_disconnected = 1;
return BATTERY_NOT_DISCONNECTED;
}
@@ -105,13 +101,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void)
* Battery is neither charging nor discharging. Verify that
* we didn't enter this state due to a safety fault.
*/
- rv = sb_write(SB_MANUFACTURER_ACCESS, PARAM_SAFETY_STATUS);
- if (rv)
- return BATTERY_DISCONNECT_ERROR;
-
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_ALT_MANUFACTURER_ACCESS, data, 6);
-
+ rv = sb_read_mfgacc(PARAM_SAFETY_STATUS,
+ SB_ALT_MANUFACTURER_ACCESS, data, sizeof(data));
if (rv || data[2] || data[3] || data[4] || data[5])
return BATTERY_DISCONNECT_ERROR;
diff --git a/driver/battery/smart.c b/driver/battery/smart.c
index 81a74917a9..48177fd375 100644
--- a/driver/battery/smart.c
+++ b/driver/battery/smart.c
@@ -60,8 +60,7 @@ test_mockable int sb_write(int cmd, int param)
#endif
}
-int sb_read_string(int port, int slave_addr, int offset, uint8_t *data,
- int len)
+int sb_read_string(int offset, uint8_t *data, int len)
{
#ifdef CONFIG_BATTERY_CUT_OFF
/*
@@ -71,12 +70,44 @@ int sb_read_string(int port, int slave_addr, int offset, uint8_t *data,
return EC_RES_ACCESS_DENIED;
#endif
#ifdef CONFIG_SMBUS
- return smbus_read_string(port, slave_addr, offset, data, len);
+ return smbus_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
+ offset, data, len);
#else
- return i2c_read_string(port, slave_addr, offset, data, len);
+ return i2c_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
+ offset, data, len);
#endif
}
+int sb_read_mfgacc(int cmd, int block, uint8_t *data, int len)
+{
+ int rv;
+
+ /*
+ * First two bytes returned from read are command sent hence read
+ * doesn't yield anything if the length is less than 3 bytes.
+ */
+ if (len < 3)
+ return EC_ERROR_INVAL;
+
+ /* Send manufacturer access command */
+ rv = sb_write(SB_MANUFACTURER_ACCESS, cmd);
+ if (rv)
+ return rv;
+
+ /*
+ * Read data on the register block.
+ * First two bytes returned are command sent,
+ * rest are actual data LSB to MSB.
+ */
+ rv = sb_read_string(block, data, len);
+ if (rv)
+ return rv;
+ if ((data[0] | data[1] << 8) != cmd)
+ return EC_ERROR_UNKNOWN;
+
+ return EC_SUCCESS;
+}
+
int battery_get_mode(int *mode)
{
return sb_read(SB_BATTERY_MODE, mode);
@@ -237,22 +268,19 @@ 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 sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_MANUFACTURER_NAME, dest, size);
+ return sb_read_string(SB_MANUFACTURER_NAME, dest, size);
}
/* Read device name */
test_mockable int battery_device_name(char *dest, int size)
{
- return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_DEVICE_NAME, dest, size);
+ return sb_read_string(SB_DEVICE_NAME, dest, size);
}
/* Read battery type/chemistry */
test_mockable int battery_device_chemistry(char *dest, int size)
{
- return sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- SB_DEVICE_CHEMISTRY, dest, size);
+ return sb_read_string(SB_DEVICE_CHEMISTRY, dest, size);
}
void battery_get_params(struct batt_params *batt)
@@ -411,27 +439,14 @@ static int command_batt_mfg_access_read(int argc, char **argv)
if (argc > 3) {
len = strtoi(argv[3], &e, 0);
len += 2;
- if (*e || len < 1 || len > sizeof(data))
+ if (*e || len < 3 || len > sizeof(data))
return EC_ERROR_PARAM3;
}
- /* Send manufacturer access command */
- rv = sb_write(SB_MANUFACTURER_ACCESS, cmd);
+ rv = sb_read_mfgacc(cmd, block, data, len);
if (rv)
return rv;
- /*
- * Read data on the register block.
- * First two bytes returned are command sent,
- * rest are actual data LSB to MSB.
- */
- rv = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR,
- block, data, len);
- if (rv)
- return rv;
- if (data[0] != (cmd & 0xff) || data[1] != (cmd >> 8 & 0xff))
- return EC_ERROR_UNKNOWN;
-
ccprintf("data[MSB->LSB]=0x");
do {
len--;
@@ -500,8 +515,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 = sb_read_string(I2C_PORT_BATTERY, BATTERY_ADDR, p->reg,
- r->data, 32);
+ rv = sb_read_string(p->reg, r->data, 32);
if (rv)
return EC_RES_ERROR;
diff --git a/include/battery_smart.h b/include/battery_smart.h
index 94b291b4d9..3f3ee869fd 100644
--- a/include/battery_smart.h
+++ b/include/battery_smart.h
@@ -141,11 +141,13 @@
int sb_read(int cmd, int *param);
/* Read sequence from battery */
-int sb_read_string(int port, int slave_addr, int offset, uint8_t *data,
- int len);
+int sb_read_string(int offset, uint8_t *data, int len);
/* Write to battery */
int sb_write(int cmd, int param);
+/* Read manufactures access data from the battery */
+int sb_read_mfgacc(int cmd, int block, uint8_t *data, int len);
+
#endif /* __CROS_EC_BATTERY_SMART_H */