summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/charger/isl923x.c105
-rw-r--r--driver/charger/isl923x.h8
2 files changed, 81 insertions, 32 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 */
diff --git a/driver/charger/isl923x.h b/driver/charger/isl923x.h
index ba018e766c..371227f902 100644
--- a/driver/charger/isl923x.h
+++ b/driver/charger/isl923x.h
@@ -201,7 +201,13 @@
/* Control2: PSYS gain in uA/W (ISL9237 only) */
#define ISL9237_C2_PSYS_GAIN (1 << 0)
-/* Control2: PSYS gain in uA/W (ISL9238 only) */
+/*
+ * Control3: AMON/BMON direction.
+ * 0: adapter/charging, 1:OTG/discharging (ISL9238 only)
+ */
+#define ISL9238_C3_AMON_BMON_DIRECTION (1 << 3)
+
+/* Control3: PSYS gain in uA/W (ISL9238 only) */
#define ISL9238_C3_PSYS_GAIN (1 << 9)
/* OTG voltage limit in mV, current limit in mA */