diff options
author | Vijay Hiremath <vijay.p.hiremath@intel.com> | 2017-01-19 16:51:38 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-02-01 18:24:34 -0800 |
commit | 272619139384a43cb112854ce13077a4c9becbf2 (patch) | |
tree | 133d0d86590d6e1c1f8d819040c016c47bf629f8 /driver | |
parent | 275cdfa55643cadc528faa60f69a35178d63e69e (diff) | |
download | chrome-ec-272619139384a43cb112854ce13077a4c9becbf2.tar.gz |
BD9995X: Set VSYSREG_SET register as per Charger State Machine
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=none
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: I5cd5afa92384acb4fd9d69128a2a03ae6992dc5b
Signed-off-by: Vijay Hiremath <vijay.p.hiremath@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/430880
Commit-Ready: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Tested-by: Vijay P Hiremath <vijay.p.hiremath@intel.com>
Reviewed-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r-- | driver/charger/bd9995x.c | 135 | ||||
-rw-r--r-- | driver/charger/bd9995x.h | 4 |
2 files changed, 85 insertions, 54 deletions
diff --git a/driver/charger/bd9995x.c b/driver/charger/bd9995x.c index e28eeb0db2..33ff4c78af 100644 --- a/driver/charger/bd9995x.c +++ b/driver/charger/bd9995x.c @@ -111,10 +111,48 @@ bd9995x_write_cleanup: /* BD9995X local interfaces */ -static int bd9995x_charger_enable(int enable) +static int bd9995x_set_vfastchg(int voltage) { + int rv; - int reg; + + /* Fast Charge Voltage Regulation Settings for fast charging. */ + rv = ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET1, + voltage & 0x7FF0, BD9995X_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(BD9995X_CMD_VFASTCHG_REG_SET2, + voltage & 0x7FF0, BD9995X_EXTENDED_COMMAND); + if (rv) + return rv; + + rv = ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET3, + voltage & 0x7FF0, BD9995X_EXTENDED_COMMAND); +#endif + + return rv; +} + +static int bd9995x_set_vsysreg(int voltage) +{ + /* VSYS Regulation voltage is in 64mV steps. */ + voltage &= ~0x3F; + + return ch_raw_write16(BD9995X_CMD_VSYSREG_SET, voltage, + BD9995X_EXTENDED_COMMAND); +} + +static int bd9995x_charger_enable(int enable) +{ + int rv, reg; + static int prev_chg_enable = -1; + const struct battery_info *bi = battery_get_info(); #ifdef CONFIG_CHARGER_BD9995X_CHGEN /* @@ -124,6 +162,44 @@ static int bd9995x_charger_enable(int enable) if (!enable && !board_battery_initialized()) return EC_SUCCESS; #endif + + /* 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 = bd9995x_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 = bd9995x_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(BD9995X_CMD_CHGOP_SET2, ®, BD9995X_EXTENDED_COMMAND); if (rv) @@ -380,15 +456,6 @@ static void usb_charger_process(enum bd9995x_charge_port port) } #endif /* HAS_TASK_USB_CHG */ -static int bd9995x_set_vsysreg(int voltage) -{ - /* VSYS Regulation voltage is in 64mV steps. */ - voltage &= ~0x3F; - - return ch_raw_write16(BD9995X_CMD_VSYSREG_SET, voltage, - BD9995X_EXTENDED_COMMAND); -} - /* chip specific interfaces */ int charger_set_input_current(int input_current) @@ -541,31 +608,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; + int rv; - if (inhibit_chg != inhibit_chg_prev) { - if (inhibit_chg) { - rv = bd9995x_set_vsysreg(BD9995X_DISCHARGE_VSYSREG); - msleep(50); - rv |= bd9995x_charger_enable(0); - } else { - rv = bd9995x_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 |= bd9995x_set_vsysreg(BD9995X_CHARGE_VSYSREG); - } - inhibit_chg_prev = inhibit_chg; - if (rv) - return rv; - } + rv = bd9995x_charger_enable(mode & CHARGE_FLAG_INHIBIT_CHARGE ? 0 : 1); + if (rv) + return rv; if (mode & CHARGE_FLAG_POR_RESET) { rv = bd9995x_por_reset(); @@ -642,12 +689,11 @@ int charger_set_voltage(int voltage) /* Charge voltage step 16 mV */ voltage &= ~0x0F; - /* Assumes charger's voltage_min < battery's voltagte_max */ + /* Assumes charger's voltage_min < battery's voltage_max */ if (voltage < bd9995x_charger_info.voltage_min) voltage = bd9995x_charger_info.voltage_min; - return ch_raw_write16(BD9995X_CMD_CHG_VOLTAGE, voltage, - BD9995X_BAT_CHG_COMMAND); + return bd9995x_set_vfastchg(voltage); } static void bd9995x_battery_charging_profile_settings(void) @@ -670,18 +716,7 @@ static void bd9995x_battery_charging_profile_settings(void) bi->precharge_current & 0x07C0, BD9995X_EXTENDED_COMMAND); - /* Fast Charge Voltage Regulation Settings for fast charging. */ - ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET1, - bi->voltage_max & 0x7FF0, - BD9995X_EXTENDED_COMMAND); - - ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET2, - bi->voltage_max & 0x7FF0, - BD9995X_EXTENDED_COMMAND); - - ch_raw_write16(BD9995X_CMD_VFASTCHG_REG_SET3, - bi->voltage_max & 0x7FF0, - BD9995X_EXTENDED_COMMAND); + bd9995x_set_vfastchg(bi->voltage_max); /* Set Pre-charge Voltage Threshold for trickle charging. */ ch_raw_write16(BD9995X_CMD_VPRECHG_TH_SET, diff --git a/driver/charger/bd9995x.h b/driver/charger/bd9995x.h index 00b6d1032c..a5ce174aea 100644 --- a/driver/charger/bd9995x.h +++ b/driver/charger/bd9995x.h @@ -49,10 +49,6 @@ enum bd9995x_charge_port { /* Min. charge current w/ no battery to prevent collapse */ #define BD9995X_NO_BATTERY_CHARGE_I_MIN 512 -/* VSYSREG settings */ -#define BD9995X_DISCHARGE_VSYSREG 8960 -#define BD9995X_CHARGE_VSYSREG 6144 - /* * BC1.2 minimum voltage threshold. * BC1.2 charging port output voltage range is 4.75V to 5.25V, |