diff options
author | james_chao <james_chao@asus.com> | 2017-05-01 23:32:08 +0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2017-05-01 17:37:36 +0000 |
commit | 616914190f34ce6b469c2ee06b896ac905745cab (patch) | |
tree | cfa3f3db7a83d29c21922202a8956c8d46697222 | |
parent | 47ded08b4cbb820adb8baa02151302b1055839a9 (diff) | |
download | chrome-ec-616914190f34ce6b469c2ee06b896ac905745cab.tar.gz |
BD99955: Enable/Disable charger depending on charging current
Copy from CL:486101
If charging current is set to 0 mA during charging, reference of
charge current feedback amp (VREF_CHG) is set to 0V. Hence the DCDC
stops switching (because of the EA offset). To eliminate this issue,
disable/enable charger depending on the charging current is zero
or non-zero respectively.
BUG=b:37415851
BRANCH=gru
TEST=test 'ectool chargecontrol normal/idle/discharge' are working
Change-Id: Id31876afe365a476fb906e059ab519b7a0c9a7c6
Signed-off-by: james_chao <james_chao@asus.com>
Reviewed-on: https://chromium-review.googlesource.com/484180
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Commit-Queue: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r-- | common/charge_state_v2.c | 7 | ||||
-rw-r--r-- | driver/charger/bd99955.c | 65 |
2 files changed, 43 insertions, 29 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index cebf6791d0..a4066dee4f 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -425,12 +425,7 @@ static int charge_request(int voltage, int current) * Set the charge inhibit bit when possible as it appears to save * power in some cases (e.g. Nyan with BQ24735). */ -#ifdef CONFIG_CHARGER_BD99955 - /* Charger auto exits from battery learn mode if charge inhibited */ - if (current > 0 || chg_ctl_mode == CHARGE_CONTROL_DISCHARGE) -#else - if (voltage > 0 || current > 0) -#endif + if (current > 0 || voltage > 0) r3 = charger_set_mode(0); else r3 = charger_set_mode(CHARGE_FLAG_INHIBIT_CHARGE); diff --git a/driver/charger/bd99955.c b/driver/charger/bd99955.c index 0e5a773d97..626cce813a 100644 --- a/driver/charger/bd99955.c +++ b/driver/charger/bd99955.c @@ -148,6 +148,17 @@ static int bd99955_set_vsysreg(int voltage) BD99955_EXTENDED_COMMAND); } +static int bd99955_is_discharging_on_ac(void) +{ + int reg; + + if (ch_raw_read16(BD99955_CMD_CHGOP_SET2, ®, + BD99955_EXTENDED_COMMAND)) + return 0; + + return !!(reg & BD99955_CMD_CHGOP_SET2_BATT_LEARN); +} + static int bd99955_charger_enable(int enable) { int rv, reg; @@ -602,10 +613,6 @@ int charger_set_mode(int mode) { 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(); if (rv) @@ -630,6 +637,7 @@ int charger_get_current(int *current) int charger_set_current(int current) { int rv; + int chg_enable = 1; /* Charge current step 64 mA */ current &= ~0x3F; @@ -637,18 +645,38 @@ int charger_set_current(int current) if (current < BD99955_NO_BATTERY_CHARGE_I_MIN && (battery_is_present() != BP_YES || battery_is_cut_off())) current = BD99955_NO_BATTERY_CHARGE_I_MIN; - else if (current < bd99955_charger_info.current_min && - !(charge_get_flags() & CHARGE_FLAG_FORCE_IDLE)) - current = bd99955_charger_info.current_min; + + /* + * Disable charger before setting charge current to 0 or when + * discharging on AC. + * If charging current is set to 0mA during charging, reference of + * the charge current feedback amp (VREF_CHG) is set to 0V. Hence + * the DCDC stops switching (because of the EA offset). + */ + if (!current || bd99955_is_discharging_on_ac()) { + chg_enable = 0; + rv = bd99955_charger_enable(0); + if (rv) + return rv; + } + + rv = ch_raw_write16(BD99955_CMD_IPRECH_SET, + MIN(current, BD99955_IPRECH_MAX), + BD99955_EXTENDED_COMMAND); + + if (rv) + return rv; rv = ch_raw_write16(BD99955_CMD_CHG_CURRENT, current, - BD99955_BAT_CHG_COMMAND); + BD99955_BAT_CHG_COMMAND); if (rv) return rv; - return ch_raw_write16(BD99955_CMD_IPRECH_SET, - MIN(current, BD99955_IPRECH_MAX), - BD99955_EXTENDED_COMMAND); + /* + * Enable charger if charge current is non-zero or not discharging + * on AC. + */ + return chg_enable ? bd99955_charger_enable(1) : EC_SUCCESS; } int charger_get_voltage(int *voltage) @@ -659,31 +687,22 @@ int charger_get_voltage(int *voltage) int charger_set_voltage(int voltage) { - int rv; - int reg; const struct battery_info *bi = battery_get_info(); /* * Regulate the system voltage to battery max if the battery * is not present or the battery is discharging on AC. */ - rv = ch_raw_read16(BD99955_CMD_CHGOP_SET2, ®, - BD99955_EXTENDED_COMMAND); - if (rv) - return rv; - if (voltage == 0 || - reg & BD99955_CMD_CHGOP_SET2_BATT_LEARN || + bd99955_is_discharging_on_ac() || battery_is_present() != BP_YES || - battery_is_cut_off()) + battery_is_cut_off() || + voltage > bi->voltage_max) voltage = bi->voltage_max; if (voltage < bd99955_charger_info.voltage_min) voltage = bd99955_charger_info.voltage_min; - if (voltage > bi->voltage_max) - voltage = bi->voltage_max; - /* Charge voltage step 16 mV */ voltage &= ~0x0F; |