diff options
-rw-r--r-- | common/charge_state.c | 22 | ||||
-rw-r--r-- | include/ec_commands.h | 9 | ||||
-rw-r--r-- | util/ectool.c | 26 |
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}, |