summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjames_chao <james_chao@asus.com>2017-05-01 23:32:08 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2017-05-01 17:37:36 +0000
commit616914190f34ce6b469c2ee06b896ac905745cab (patch)
treecfa3f3db7a83d29c21922202a8956c8d46697222
parent47ded08b4cbb820adb8baa02151302b1055839a9 (diff)
downloadchrome-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.c7
-rw-r--r--driver/charger/bd99955.c65
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, &reg,
+ 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, &reg,
- 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;