summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/charge_state.c22
-rw-r--r--include/ec_commands.h9
-rw-r--r--util/ectool.c26
3 files changed, 57 insertions, 0 deletions
diff --git a/common/charge_state.c b/common/charge_state.c
index 7cf8fe9546..ef7df7d115 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -38,6 +38,8 @@ static const char * const state_name[] = POWER_STATE_NAME_TABLE;
static int state_machine_force_idle = 0;
+static unsigned user_current_limit = -1U;
+
/* Current power state context */
static struct power_state_context task_ctx;
@@ -272,6 +274,8 @@ static int state_common(struct power_state_context *ctx)
if (batt->desired_current > CONFIG_CHARGING_CURRENT_LIMIT)
batt->desired_current = CONFIG_CHARGING_CURRENT_LIMIT;
#endif
+ if (batt->desired_current > user_current_limit)
+ batt->desired_current = user_current_limit;
if (battery_get_battery_mode(&d)) {
curr->error |= F_BATTERY_MODE;
@@ -842,3 +846,21 @@ static int charge_command_dump(struct host_cmd_handler_args *args)
}
DECLARE_HOST_COMMAND(EC_CMD_CHARGE_DUMP, charge_command_dump,
EC_VER_MASK(0));
+
+static void reset_current_limit(void)
+{
+ user_current_limit = -1;
+}
+DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, reset_current_limit, HOOK_PRIO_DEFAULT);
+DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, reset_current_limit, HOOK_PRIO_DEFAULT);
+
+static int charge_command_current_limit(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_current_limit *p = args->params;
+
+ user_current_limit = p->limit;
+
+ return EC_RES_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_CHARGE_CURRENT_LIMIT, charge_command_current_limit,
+ EC_VER_MASK(0));
diff --git a/include/ec_commands.h b/include/ec_commands.h
index 05a7acf781..9dc5566e92 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -1208,6 +1208,15 @@ struct ec_params_force_idle {
*/
#define EC_CMD_CHARGE_DUMP 0xa0
+/*
+ * Set maximum battery charging current.
+ */
+#define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1
+
+struct ec_params_current_limit {
+ uint32_t limit;
+} __packed;
+
/*****************************************************************************/
/* System commands */
diff --git a/util/ectool.c b/util/ectool.c
index eaf1147950..b8f7d45226 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -36,6 +36,8 @@ const char help_str[] =
" Prints battery info\n"
" batterycutoff\n"
" Cut off battery output power\n"
+ " chargecurrentlimit\n"
+ " Set the maximum battery charging current\n"
" chargedump\n"
" Dump the context of charge state machine\n"
" chargeforceidle\n"
@@ -1974,6 +1976,29 @@ int cmd_lcd_backlight(int argc, char *argv[])
}
+int cmd_charge_current_limit(int argc, char *argv[])
+{
+ struct ec_params_current_limit p;
+ int rv;
+ char *e;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <max_current_mA>\n", argv[0]);
+ return -1;
+ }
+
+ p.limit = strtol(argv[1], &e, 0);
+ if (e && *e) {
+ fprintf(stderr, "Bad value.\n");
+ return -1;
+ }
+
+ rv = ec_command(EC_CMD_CHARGE_CURRENT_LIMIT, 0, &p, sizeof(p),
+ NULL, 0);
+ return rv;
+}
+
+
int cmd_charge_force_idle(int argc, char *argv[])
{
struct ec_params_force_idle p;
@@ -2669,6 +2694,7 @@ const struct command commands[] = {
{"backlight", cmd_lcd_backlight},
{"battery", cmd_battery},
{"batterycutoff", cmd_battery_cut_off},
+ {"chargecurrentlimit", cmd_charge_current_limit},
{"chargedump", cmd_charge_dump},
{"chargeforceidle", cmd_charge_force_idle},
{"chipinfo", cmd_chipinfo},