diff options
author | Vincent Palatin <vpalatin@chromium.org> | 2012-11-07 09:39:33 -0800 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-11-07 23:48:04 -0800 |
commit | 3c575ccb02ff58eaae3e7c3dd8e2e86ad25ac106 (patch) | |
tree | ace4aa3a4f1a924ab0c55aec799815847c146926 | |
parent | 7551e8f57f9b5b325fa00860f55bb236ff48c4e5 (diff) | |
download | chrome-ec-3c575ccb02ff58eaae3e7c3dd8e2e86ad25ac106.tar.gz |
link: allow to decrease maximum battery charging current
Add an interface to allow the CPU to cap the maximum battery charging
current.
The maximum is removed every time the machine goes to S3 or S5.
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
BRANCH=link
BUG=chrome-os-partner:16041
TEST=on Link, plug AC to charge the battery,
then run "ectool chargecurrentlimit 1200" and see
the charging current in "power-supply-info" decreasing to 1.2 A.
Change-Id: I10900e1c264d2db67809638ec0dcb836d721fa75
Reviewed-on: https://gerrit.chromium.org/gerrit/37532
Reviewed-by: Sameer Nanda <snanda@chromium.org>
Reviewed-by: Rong Chang <rongchang@chromium.org>
Commit-Ready: Vincent Palatin <vpalatin@chromium.org>
Tested-by: Vincent Palatin <vpalatin@chromium.org>
-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}, |