summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjames_chao <james_chao@asus.com>2017-04-28 17:55:03 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2017-05-01 15:11:17 +0000
commit47ded08b4cbb820adb8baa02151302b1055839a9 (patch)
tree41d5b296d8d9075a907b258096ddafe97a879aa4
parent496334078844d2e5156c8b77ba7b58401a0151e5 (diff)
downloadchrome-ec-47ded08b4cbb820adb8baa02151302b1055839a9.tar.gz
BD9995X: Set VSYSREG_SET register as per Charger State Machine
Copy from CL:430880 Setting the VSYSREG_SET register as per Charge State Machine of the BD9995X datasheet. 1. Set VSYSREG_SET <= VBAT so that the charger is in Fast-Charge state when charging. 2. Set VSYSREG_SET > VBAT so that the charger is in Pre-Charge state when not charging or discharging. BUG=chrome-os-partner:55220 BRANCH=gru TEST=Manually tested on Reef. Observed 'Charger State Machine Status' register value when charging it is in Fast-Charge state and when not charging/discharging it is in Pre-Charge state. Change-Id: I90b0c0de59e0ddc6a341dd61e2a9d0af28c3a517 Signed-off-by: james_chao <james_chao@asus.com> Reviewed-on: https://chromium-review.googlesource.com/490131 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> Tested-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r--driver/charger/bd99955.c124
-rw-r--r--driver/charger/bd99955.h4
2 files changed, 86 insertions, 42 deletions
diff --git a/driver/charger/bd99955.c b/driver/charger/bd99955.c
index 22021876db..0e5a773d97 100644
--- a/driver/charger/bd99955.c
+++ b/driver/charger/bd99955.c
@@ -112,10 +112,84 @@ bd99955_write_cleanup:
/* BD99955 local interfaces */
-static int bd99955_charger_enable(int enable)
+static int bd99955_set_vfastchg(int voltage)
{
int rv;
- int reg;
+
+ /* Fast Charge Voltage Regulation Settings for fast charging. */
+ rv = ch_raw_write16(BD99955_CMD_VFASTCHG_REG_SET1,
+ voltage & 0x7FF0, BD99955_EXTENDED_COMMAND);
+
+ if (rv)
+ return rv;
+
+#ifndef CONFIG_CHARGER_BATTERY_TSENSE
+ /*
+ * If TSENSE is not connected set all the VFASTCHG_REG_SETx
+ * to same voltage.
+ */
+ rv = ch_raw_write16(BD99955_CMD_VFASTCHG_REG_SET2,
+ voltage & 0x7FF0, BD99955_EXTENDED_COMMAND);
+ if (rv)
+ return rv;
+
+ rv = ch_raw_write16(BD99955_CMD_VFASTCHG_REG_SET3,
+ voltage & 0x7FF0, BD99955_EXTENDED_COMMAND);
+#endif
+ return rv;
+}
+
+static int bd99955_set_vsysreg(int voltage)
+{
+ /* VSYS Regulation voltage is in 64mV steps. */
+ voltage &= ~0x3F;
+
+ return ch_raw_write16(BD99955_CMD_VSYSREG_SET, voltage,
+ BD99955_EXTENDED_COMMAND);
+}
+
+static int bd99955_charger_enable(int enable)
+{
+ int rv, reg;
+ static int prev_chg_enable = -1;
+ const struct battery_info *bi = battery_get_info();
+
+ /* Nothing to change */
+ if (enable == prev_chg_enable)
+ return EC_SUCCESS;
+
+ prev_chg_enable = enable;
+
+ if (enable) {
+ /*
+ * BGATE capacitor max : 0.1uF + 20%
+ * Charge MOSFET threshold max : 2.8V
+ * BGATE charge pump current min : 3uA
+ * T = C * V / I so, Tmax = 112ms
+ */
+ msleep(115);
+
+ /*
+ * Set VSYSREG_SET <= VBAT so that the charger is in Fast-Charge
+ * state when charging.
+ */
+ rv = bd99955_set_vsysreg(bi->voltage_min);
+ } else {
+ /*
+ * Set VSYSREG_SET > VBAT so that the charger is in Pre-Charge
+ * state when not charging or discharging.
+ */
+ rv = bd99955_set_vsysreg(bi->voltage_max + 200);
+
+ /*
+ * Allow charger in pre-charge state for 50ms before disabling
+ * the charger which prevents inrush current while moving from
+ * fast-charge state to pre-charge state.
+ */
+ msleep(50);
+ }
+ if (rv)
+ return rv;
rv = ch_raw_read16(BD99955_CMD_CHGOP_SET2, &reg,
BD99955_EXTENDED_COMMAND);
@@ -373,15 +447,6 @@ static void usb_charger_process(enum bd99955_charge_port port)
}
#endif /* HAS_TASK_USB_CHG */
-static int bd99955_set_vsysreg(int voltage)
-{
- /* VSYS Regulation voltage is in 64mV steps. */
- voltage &= ~0x3F;
-
- return ch_raw_write16(BD99955_CMD_VSYSREG_SET, voltage,
- BD99955_EXTENDED_COMMAND);
-}
-
/* chip specific interfaces */
int charger_set_input_current(int input_current)
@@ -535,31 +600,11 @@ int charger_get_status(int *status)
int charger_set_mode(int mode)
{
- int rv, inhibit_chg;
- static int inhibit_chg_prev = -1;
-
- inhibit_chg = mode & CHARGE_FLAG_INHIBIT_CHARGE;
-
- if (inhibit_chg != inhibit_chg_prev) {
- if (inhibit_chg) {
- rv = bd99955_set_vsysreg(BD99955_DISCHARGE_VSYSREG);
- msleep(50);
- rv |= bd99955_charger_enable(0);
- } else {
- rv = bd99955_charger_enable(1);
- /*
- * BGATE capacitor max : 0.1uF + 20%
- * Charge MOSFET threshold max : 2.8V
- * BGATE charge pump current min : 3uA
- * T = C * V / I so, Tmax = 112ms
- */
- msleep(115);
- rv |= bd99955_set_vsysreg(BD99955_CHARGE_VSYSREG);
- }
- inhibit_chg_prev = inhibit_chg;
- if (rv)
- return rv;
- }
+ int rv;
+
+ rv = bd99955_charger_enable(mode & CHARGE_FLAG_INHIBIT_CHARGE ? 0 : 1);
+ if (rv)
+ return rv;
if (mode & CHARGE_FLAG_POR_RESET) {
rv = bd99955_por_reset();
@@ -642,8 +687,11 @@ int charger_set_voltage(int voltage)
/* Charge voltage step 16 mV */
voltage &= ~0x0F;
- return ch_raw_write16(BD99955_CMD_CHG_VOLTAGE, voltage,
- BD99955_BAT_CHG_COMMAND);
+ /* Assumes charger's voltage_min < battery's voltage_max */
+ if (voltage < bd99955_charger_info.voltage_min)
+ voltage = bd99955_charger_info.voltage_min;
+
+ return bd99955_set_vfastchg(voltage);
}
static void bd99995_init(void)
diff --git a/driver/charger/bd99955.h b/driver/charger/bd99955.h
index 74d84c3b37..9db9a3439c 100644
--- a/driver/charger/bd99955.h
+++ b/driver/charger/bd99955.h
@@ -42,10 +42,6 @@ enum bd99955_charge_port {
/* Min. charge current w/ no battery to prevent collapse */
#define BD99955_NO_BATTERY_CHARGE_I_MIN 512
-/* VSYSREG settings */
-#define BD99955_DISCHARGE_VSYSREG 8960
-#define BD99955_CHARGE_VSYSREG 6144
-
/*
* BC1.2 minimum voltage threshold.
* BC1.2 charging port output voltage range is 4.75V to 5.25V,