summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Palatin <vpalatin@chromium.org>2012-11-07 09:39:33 -0800
committerGerrit <chrome-bot@google.com>2012-11-07 23:48:04 -0800
commit3c575ccb02ff58eaae3e7c3dd8e2e86ad25ac106 (patch)
treeace4aa3a4f1a924ab0c55aec799815847c146926
parent7551e8f57f9b5b325fa00860f55bb236ff48c4e5 (diff)
downloadchrome-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.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},