diff options
Diffstat (limited to 'common/charge_manager.c')
-rw-r--r-- | common/charge_manager.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c index 6b66d88a81..7e80ca02f4 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -95,11 +95,23 @@ static void charge_manager_refresh(void) */ for (i = 0; i < CHARGE_SUPPLIER_COUNT; ++i) for (j = 0; j < PD_PORT_COUNT; ++j) { + /* + * Don't select this port if we have a + * charge on another override port. + */ if (override_port != OVERRIDE_OFF && override_port == new_port && override_port != j) continue; + /* + * Don't charge from a dual-role port unless + * it is our override port. + */ + if (pd_get_partner_dualrole_capable(j) && + override_port != j) + continue; + if (available_charge[i][j].current > 0 && available_charge[i][j].voltage > 0 && (new_supplier == CHARGE_SUPPLIER_NONE || @@ -175,6 +187,14 @@ void charge_manager_update(int supplier, /* Update charge table if needed. */ if (available_charge[supplier][port].current != charge->current || available_charge[supplier][port].voltage != charge->voltage) { + /* Remove override when a dedicated charger is plugged */ + if (override_port != OVERRIDE_OFF && + available_charge[supplier][port].current == 0 && + charge->current > 0 && + !pd_get_partner_dualrole_capable(port)) + override_port = OVERRIDE_OFF; + + available_charge[supplier][port].current = charge->current; available_charge[supplier][port].voltage = charge->voltage; |