summaryrefslogtreecommitdiff
path: root/common/charge_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/charge_manager.c')
-rw-r--r--common/charge_manager.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c
index bf93724cbd..da6b6c985c 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -5,6 +5,7 @@
#include "adc.h"
#include "charge_manager.h"
+#include "charge_ramp.h"
#include "console.h"
#include "gpio.h"
#include "hooks.h"
@@ -26,6 +27,9 @@
static struct charge_port_info available_charge[CHARGE_SUPPLIER_COUNT]
[PD_PORT_COUNT];
+/* Keep track of when the supplier on each port is registered. */
+static timestamp_t registration_time[PD_PORT_COUNT];
+
/*
* Charge ceiling for ports. This can be set to temporarily limit the charge
* pulled from a port, without influencing the port selection logic.
@@ -152,6 +156,13 @@ static void charge_manager_fill_power_info(int port,
r->meas.current_max = 0;
r->max_power = 0;
} else {
+#ifdef HAS_TASK_CHG_RAMP
+ /* Read ramped current if active charging port */
+ int use_ramp_current = (charge_port == port);
+#else
+ const int use_ramp_current = 0;
+#endif
+
switch (sup) {
case CHARGE_SUPPLIER_PD:
r->type = USB_CHG_TYPE_PD;
@@ -175,8 +186,16 @@ static void charge_manager_fill_power_info(int port,
r->type = USB_CHG_TYPE_OTHER;
}
r->meas.voltage_max = available_charge[sup][port].voltage;
- r->meas.current_max = available_charge[sup][port].current;
- r->max_power = POWER(available_charge[sup][port]);
+
+ if (use_ramp_current) {
+ r->meas.current_max = chg_ramp_get_current_limit();
+ r->max_power =
+ r->meas.current_max * r->meas.voltage_max;
+ } else {
+ r->meas.current_max =
+ available_charge[sup][port].current;
+ r->max_power = POWER(available_charge[sup][port]);
+ }
/*
* If we are sourcing power, or sinking but not charging, then
@@ -385,9 +404,16 @@ static void charge_manager_refresh(void)
available_charge[new_supplier][new_port].voltage;
}
- /* Change the charge limit + charge port if modified. */
- if (new_port != charge_port || new_charge_current != charge_current) {
+ /* Change the charge limit + charge port/supplier if modified. */
+ if (new_port != charge_port || new_charge_current != charge_current ||
+ new_supplier != charge_supplier) {
+#ifdef HAS_TASK_CHG_RAMP
+ chg_ramp_charge_supplier_change(
+ new_port, new_supplier, new_charge_current,
+ registration_time[new_port]);
+#else
board_set_charge_limit(new_charge_current);
+#endif
CPRINTS("CL: p%d s%d i%d v%d", new_port, new_supplier,
new_charge_current, new_charge_voltage);
}
@@ -508,6 +534,7 @@ static void charge_manager_make_change(enum charge_manager_change_type change,
if (change == CHANGE_CHARGE) {
available_charge[supplier][port].current = charge->current;
available_charge[supplier][port].voltage = charge->voltage;
+ registration_time[port] = get_time();
/*
* If we have a charge on our delayed override port within