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.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c
index 4e21bdf2bd..ef74438368 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -855,3 +855,76 @@ DECLARE_CONSOLE_COMMAND(chgoverride, command_charge_port_override,
"[port | -1 | -2]",
"Force charging from a given port (-1 = off, -2 = disable charging)",
NULL);
+
+#ifdef CONFIG_CHARGE_MANAGER_EXTERNAL_POWER_LIMIT
+static void charge_manager_set_external_power_limit(int current_lim,
+ int voltage_lim)
+{
+ int port;
+
+ if (current_lim == EC_POWER_LIMIT_NONE)
+ current_lim = CHARGE_CEIL_NONE;
+ if (voltage_lim == EC_POWER_LIMIT_NONE)
+ voltage_lim = PD_MAX_VOLTAGE_MV;
+
+ for (port = 0; port < CONFIG_USB_PD_PORT_COUNT; ++port) {
+ charge_manager_set_ceil(port, CEIL_REQUESTOR_HOST, current_lim);
+ pd_set_external_voltage_limit(port, voltage_lim);
+ }
+}
+
+/*
+ * On transition out of S0, disable all external power limits, in case AP
+ * failed to clear them.
+ */
+static void charge_manager_external_power_limit_off(void)
+{
+ charge_manager_set_external_power_limit(EC_POWER_LIMIT_NONE,
+ EC_POWER_LIMIT_NONE);
+}
+DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, charge_manager_external_power_limit_off,
+ HOOK_PRIO_DEFAULT);
+
+static int hc_external_power_limit(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_external_power_limit_v1 *p = args->params;
+
+ charge_manager_set_external_power_limit(p->current_lim,
+ p->voltage_lim);
+
+ return EC_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_EXTERNAL_POWER_LIMIT,
+ hc_external_power_limit,
+ EC_VER_MASK(1));
+
+static int command_external_power_limit(int argc, char **argv)
+{
+ int max_current;
+ int max_voltage;
+ char *e;
+
+ if (argc >= 2) {
+ max_current = strtoi(argv[1], &e, 10);
+ if (*e)
+ return EC_ERROR_PARAM1;
+ } else
+ max_current = EC_POWER_LIMIT_NONE;
+
+ if (argc >= 3) {
+ max_voltage = strtoi(argv[2], &e, 10);
+ if (*e)
+ return EC_ERROR_PARAM1;
+ } else
+ max_voltage = EC_POWER_LIMIT_NONE;
+
+ charge_manager_set_external_power_limit(max_current, max_voltage);
+ ccprintf("max req: %dmA %dmV\n", max_current, max_voltage);
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(chglim, command_external_power_limit,
+ "[max_current (mA)] [max_voltage (mV)]",
+ "Set max charger current / voltage",
+ NULL);
+#endif /* CONFIG_CHARGE_MANAGER_EXTERNAL_POWER_LIMIT */