From cea3f26d5d4e9160c1e628b29abd74d74ca36c04 Mon Sep 17 00:00:00 2001 From: Alec Berg Date: Sat, 17 Jan 2015 14:37:05 -0800 Subject: charge state v2: allow boot without battery when unlocked Change charge_state_v2 to set the maximum input current limit when there is no battery present AND the system is not locked. This allows us to boot without a battery. Note that using the max input current limit may cause us to overcurrent our charger, but that's no worse than putting a limit on it and having the system brownout. Either way you must have a high enough power charger to boot without a battery. BUG=chrome-os-partner:35570 BRANCH=samus TEST=load on samus, remove battery and plug in zinger. check "charger" has input current limit of 8128mA, and on PD MCU jump back and forth between RO and RW and make sure system doesn't power off. Note that without this CL, if you sysjump on the PD MCU it causes input current limit to reset to 500mA and causes AP to shutoff. Change-Id: Ie13d97a6b5c0937510cff0cf05fb032898c3b131 Signed-off-by: Alec Berg Reviewed-on: https://chromium-review.googlesource.com/241762 Reviewed-by: Duncan Laurie --- common/charge_state_v2.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index 91a41ade34..849ec8dff6 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -522,10 +522,21 @@ const struct batt_params *charger_current_battery_params(void) void charger_init(void) { + const struct charger_info * const info = charger_get_info(); + /* Initialize current state */ memset(&curr, 0, sizeof(curr)); curr.batt.is_present = BP_NOT_SURE; - curr.desired_input_current = CONFIG_CHARGER_INPUT_CURRENT; + + /* + * If system is not locked, then use max input current limit so + * that if there is no battery present, we can pull as much power + * as needed. If battery is present, then input current will be + * immediately lowered to the real desired value. + */ + curr.desired_input_current = system_is_locked() ? + CONFIG_CHARGER_INPUT_CURRENT : + info->input_current_max; } DECLARE_HOOK(HOOK_INIT, charger_init, HOOK_PRIO_DEFAULT); @@ -931,6 +942,15 @@ int charge_temp_sensor_get_val(int idx, int *temp_ptr) int charge_set_input_current_limit(int ma) { + /* + * 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 (curr.batt.is_present != BP_YES && !system_is_locked()) + return EC_SUCCESS; + curr.desired_input_current = ma; return charger_set_input_current(ma); } -- cgit v1.2.1