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>
This commit is contained in:
Vincent Palatin
2012-11-07 09:39:33 -08:00
committed by Gerrit
parent 7551e8f57f
commit 3c575ccb02
3 changed files with 57 additions and 0 deletions

View File

@@ -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));

View File

@@ -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 */

View File

@@ -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},