summaryrefslogtreecommitdiff
path: root/common/charge_state_v2.c
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@chromium.org>2018-01-19 09:04:36 +0800
committerchrome-bot <chrome-bot@chromium.org>2018-01-30 03:56:25 -0800
commitcbd086d13b5089dca7a47af02fd766973c8e8d08 (patch)
tree9cc874a627aacde667f3cdbe220382c65e2ab05d /common/charge_state_v2.c
parent4d0eb3be49fac06cdb932a3ac9fb429d97f7a340 (diff)
downloadchrome-ec-cbd086d13b5089dca7a47af02fd766973c8e8d08.tar.gz
charge_state_v2: Fix current limit when lid has no battery
The logic of drawing as much current as possible when no battery is connected (on the lid), and system unlocked, makes sense during early bringup. However, it will not work when the base is also connected, as we did not implement the required no-battery logic in the base/lid power allocation algorithm (nor do we plan to, as it is only required during very early bringup, when we should not expect power transfer between lid and base to work properly). Also, we need to record input_voltage in charge_set_input_current_limit, even when lid battery is not present (yet), otherwise the algorithm gets confused and believes no power is available. BRANCH=none BUG=b:71881017 TEST=Boot lux from dead battery and base connected, lux does not attempt to drive OTG to the base. Change-Id: I0cdd0956a82a724dbbf9c010760dcb956a58c1bf Signed-off-by: Nicolas Boichat <drinkcat@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/874982 Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'common/charge_state_v2.c')
-rw-r--r--common/charge_state_v2.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 3a59a39b00..1e89009ea2 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -67,6 +67,8 @@ static int prev_base_connected;
static int charge_base;
static int prev_charge_base;
static int prev_current_base;
+#else
+static const int base_connected;
#endif
/* Is battery connected but unresponsive after precharge? */
@@ -1168,7 +1170,7 @@ DECLARE_HOOK(HOOK_AC_CHANGE, charge_wakeup, HOOK_PRIO_DEFAULT);
static int get_desired_input_current(enum battery_present batt_present,
const struct charger_info * const info)
{
- if (batt_present == BP_YES || system_is_locked()) {
+ if (batt_present == BP_YES || system_is_locked() || base_connected) {
#ifdef CONFIG_CHARGE_MANAGER
int ilim = charge_manager_get_charger_current();
return ilim == CHARGE_CURRENT_UNINITIALIZED ?
@@ -1801,13 +1803,17 @@ int charge_set_output_current_limit(int ma, int mv)
int charge_set_input_current_limit(int ma, int mv)
{
+#ifdef CONFIG_EC_EC_COMM_BATTERY_MASTER
+ curr.input_voltage = mv;
+#endif
/*
- * If battery is not present and we are not locked, then allow system
- * to pull as much input current as needed. Yes, we might overcurrent
- * the charger but this is no worse then browning out due to
- * insufficient input current.
+ * If battery is not present, we are not locked, and base is not
+ * connected then allow system to pull as much input current as needed.
+ * Yes, we might overcurrent the charger but this is no worse than
+ * browning out due to insufficient input current.
*/
- if (curr.batt.is_present != BP_YES && !system_is_locked()) {
+ if (curr.batt.is_present != BP_YES && !system_is_locked() &&
+ !base_connected) {
#ifdef CONFIG_USB_POWER_DELIVERY
#if ((PD_MAX_POWER_MW * 1000) / PD_MAX_VOLTAGE_MV != PD_MAX_CURRENT_MA)
/*
@@ -1834,7 +1840,6 @@ int charge_set_input_current_limit(int ma, int mv)
#endif
curr.desired_input_current = ma;
#ifdef CONFIG_EC_EC_COMM_BATTERY_MASTER
- curr.input_voltage = mv;
/* Wake up charger task to allocate current between lid and base. */
charge_wakeup();
return EC_SUCCESS;