summaryrefslogtreecommitdiff
path: root/driver/charger/isl923x.c
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@google.com>2017-01-19 21:05:51 +0800
committerchrome-bot <chrome-bot@chromium.org>2017-01-24 22:03:50 -0800
commit92a79b2bf19df7bad5b25aa36193cd113b9c16a8 (patch)
tree0cfae087f130ca90f51a78d3b74264bc7ef089ff /driver/charger/isl923x.c
parent92cda018f88ffa10f3d5bf898c839da0c35d8337 (diff)
downloadchrome-ec-92a79b2bf19df7bad5b25aa36193cd113b9c16a8.tar.gz
isl9238: Add support for battery discharging BMON current monitor
ISL9238 is able to measure currents when battery is discharging (like ISL9237), and charging (new feature). Reverse AMON (OTG output current) is also supported by ISL9238, but isn't very interesting on our boards. BRANCH=none BUG=chrome-os-partner:61166 TEST=Plug charger, "amon" in EC console, check that values match current meter + "battery" information. Unplug charger, values match "battery" information. Change-Id: I9ecae6bec9e2049d17ef1a4596dbd4e3ff59919e Reviewed-on: https://chromium-review.googlesource.com/430474 Commit-Ready: Nicolas Boichat <drinkcat@chromium.org> Tested-by: Nicolas Boichat <drinkcat@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'driver/charger/isl923x.c')
-rw-r--r--driver/charger/isl923x.c105
1 files changed, 74 insertions, 31 deletions
diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c
index 81a9dd3582..a570768e05 100644
--- a/driver/charger/isl923x.c
+++ b/driver/charger/isl923x.c
@@ -429,49 +429,92 @@ DECLARE_CONSOLE_COMMAND(psys, console_command_psys,
#endif /* CONFIG_CHARGER_PSYS */
#ifdef CONFIG_CMD_CHARGER_ADC_AMON_BMON
-/**
- * Get charger AMON and BMON current.
- */
-static int console_command_amon_bmon(int argc, char **argv)
+enum amon_bmon { AMON, BMON };
+
+static int print_amon_bmon(enum amon_bmon amon, int direction,
+ int resistor, char *text)
{
- int adc, curr, val, ret;
+ int adc, curr, reg, ret;
+
+#ifdef CONFIG_CHARGER_ISL9238
+ ret = i2c_read16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
+ ISL9238_REG_CONTROL3, &reg);
+ if (ret)
+ return ret;
+
+ /* Switch direction */
+ if (direction)
+ reg |= ISL9238_C3_AMON_BMON_DIRECTION;
+ else
+ reg &= ~ISL9238_C3_AMON_BMON_DIRECTION;
+ ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
+ ISL9238_REG_CONTROL3, reg);
+ if (ret)
+ return ret;
+#endif
ret = i2c_read16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
- ISL923X_REG_CONTROL1, &val);
+ ISL923X_REG_CONTROL1, &reg);
if (ret)
return ret;
+ /* Switch between AMON/BMON */
+ if (amon == AMON)
+ reg &= ~ISL923X_C1_SELECT_BMON;
+ else
+ reg |= ISL923X_C1_SELECT_BMON;
+
/* Enable monitor */
- val &= ~ISL923X_C1_DISABLE_MON;
- if (argc == 1 || (argc >= 2 && argv[1][0] == 'a')) {
- /* Switch to AMON */
- val &= ~ISL923X_C1_SELECT_BMON;
- ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
- ISL923X_REG_CONTROL1, val);
- if (ret)
- return ret;
-
- adc = adc_read_channel(ADC_AMON_BMON);
- curr = adc / CONFIG_CHARGER_SENSE_RESISTOR_AC;
- CPRINTF("AMON: %d uV, %d mA\n", adc, curr);
- }
+ reg &= ~ISL923X_C1_DISABLE_MON;
+ ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
+ ISL923X_REG_CONTROL1, reg);
+ if (ret)
+ return ret;
- if (argc == 1 || (argc >= 2 && argv[1][0] == 'b')) {
- /* Switch to BMON */
- val |= ISL923X_C1_SELECT_BMON;
- ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
- ISL923X_REG_CONTROL1, val);
- if (ret)
- return ret;
-
- adc = adc_read_channel(ADC_AMON_BMON);
- curr = adc / CONFIG_CHARGER_SENSE_RESISTOR;
- CPRINTF("BMON: %d uV, %d mA\n", adc, curr);
- }
+ adc = adc_read_channel(ADC_AMON_BMON);
+ curr = adc / resistor;
+ CPRINTF("%s: %d uV, %d mA\n", text, adc, curr);
+
+ return ret;
+}
+
+/**
+ * Get charger AMON and BMON current.
+ */
+static int console_command_amon_bmon(int argc, char **argv)
+{
+ int ret = EC_SUCCESS;
+
+ if (argc == 1 || (argc >= 2 && argv[1][0] == 'a'))
+ ret |= print_amon_bmon(AMON, 0,
+ CONFIG_CHARGER_SENSE_RESISTOR_AC,
+ "AMON");
+
+ if (argc == 1 || (argc >= 2 && argv[1][0] == 'b' &&
+ (argv[1][1] == '\0' || argv[1][1] == 'd')))
+ ret |= print_amon_bmon(BMON, 1,
+ CONFIG_CHARGER_SENSE_RESISTOR,
+ "BMON(discharging)");
+
+#ifdef CONFIG_CHARGER_ISL9238
+ if (argc == 1 || (argc >= 2 && argv[1][0] == 'b' &&
+ (argv[1][1] == '\0' || argv[1][1] == 'c')))
+ ret |= print_amon_bmon(BMON, 0,
+ /*
+ * charging current monitor has
+ * 2x amplification factor
+ */
+ 2*CONFIG_CHARGER_SENSE_RESISTOR,
+ "BMON(charging)");
+#endif
return ret;
}
DECLARE_CONSOLE_COMMAND(amonbmon, console_command_amon_bmon,
+#ifdef CONFIG_CHARGER_ISL9237
"amonbmon [a|b]",
+#else
+ "amonbmon [a|b[c|d]]",
+#endif
"Get charger AMON/BMON voltage diff, current");
#endif /* CONFIG_CMD_CHARGER_ADC_AMON_BMON */