diff --git a/common/charge_state.c b/common/charge_state.c index ef54d71b70..62b8d399f6 100644 --- a/common/charge_state.c +++ b/common/charge_state.c @@ -519,6 +519,12 @@ static int enter_force_idle_mode(void) return EC_SUCCESS; } +static int exit_force_idle_mode(void) +{ + state_machine_force_idle = 0; + return EC_SUCCESS; +} + /* Battery charging task */ void charge_state_machine_task(void) { @@ -642,9 +648,19 @@ void charge_state_machine_task(void) static int charge_command_force_idle(struct host_cmd_handler_args *args) { + const struct ec_params_force_idle *p = + (const struct ec_params_force_idle *)args->params; + int rv; + if (system_is_locked()) return EC_RES_ACCESS_DENIED; - if (enter_force_idle_mode() != EC_SUCCESS) + + if (p->enabled) + rv = enter_force_idle_mode(); + else + rv = exit_force_idle_mode(); + + if (rv != EC_SUCCESS) return EC_RES_ERROR; return EC_RES_SUCCESS; } diff --git a/include/ec_commands.h b/include/ec_commands.h index 819151aa14..6c64aeef1d 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -863,6 +863,10 @@ struct ec_params_i2c_write { /* Force charge state machine to stop in idle mode */ #define EC_CMD_CHARGE_FORCE_IDLE 0x96 +struct ec_params_force_idle { + uint8_t enabled; +} __packed; + /*****************************************************************************/ /* System commands */ diff --git a/util/ectool.c b/util/ectool.c index 0cb9825c06..fc43c94fd0 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -1743,13 +1743,31 @@ int cmd_lcd_backlight(int argc, char *argv[]) int cmd_charge_force_idle(int argc, char *argv[]) { - int rv = ec_command(EC_CMD_CHARGE_FORCE_IDLE, 0, NULL, 0, NULL, 0); + struct ec_params_force_idle p; + int rv; + char *e; + + if (argc != 2) { + fprintf(stderr, "Usage: %s <0|1>\n", argv[0]); + return -1; + } + + p.enabled = strtol(argv[1], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad value.\n"); + return -1; + } + + rv = ec_command(EC_CMD_CHARGE_FORCE_IDLE, 0, &p, sizeof(p), NULL, 0); if (rv < 0) { fprintf(stderr, "Is AC connected?\n"); return rv; } - printf("Charge state machine force idle.\n"); + if (p.enabled) + printf("Charge state machine force idle.\n"); + else + printf("Charge state machine normal mode.\n"); return 0; }