summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bresticker <abrestic@chromium.org>2014-06-09 16:01:19 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-06-11 22:57:55 +0000
commitbd4469ae4ffbbd6f2cd5549bdb8809838e55d6f7 (patch)
tree25ceed9583b27a5e4f346fa3ba481fd17e8c519a
parentef7cae1c3af86f43c633443bb9750460c19aabea (diff)
downloadchrome-ec-bd4469ae4ffbbd6f2cd5549bdb8809838e55d6f7.tar.gz
charger v2: set charger mode when requesting current/voltage
Clear the CHARGE_INHIBIT bit when requesting non-zero current/voltage and set it when charging should be disabled. On Blaze with the BQ24725 charger, setting this bit saves 10-15mW when we're not on AC. This also fixes an issue where battery charging would not get enabled when the charger is connected while the machine is in S3/S5. This is because the kernel driver would inhibit charging when the charger was removed and then the EC would not enable it when the charger was re-connected while the host was off, such as in S3/S5. BRANCH=nyan BUG=chrome-os-partner:29386 TEST=Boot Blaze, disconnect charger, suspend, connect charger and observe that the battery now starts charging. Change-Id: I3a8f30a307391248b6b8b005ed31c6c1bc847532 Signed-off-by: Andrew Bresticker <abrestic@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/203163 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--common/charge_state_v2.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index a5a621da8b..bdf640bddb 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -6,6 +6,7 @@
*/
#include "battery.h"
+#include "battery_smart.h"
#include "charge_state.h"
#include "charger.h"
#include "chipset.h"
@@ -49,6 +50,7 @@ enum problem_type {
PR_STATIC_UPDATE,
PR_SET_VOLTAGE,
PR_SET_CURRENT,
+ PR_SET_MODE,
PR_POST_INIT,
PR_CHG_FLAGS,
PR_BATT_FLAGS,
@@ -60,6 +62,7 @@ static const char * const prob_text[] = {
"static update",
"set voltage",
"set current",
+ "set mode",
"post init",
"chg params",
"batt params",
@@ -278,10 +281,9 @@ static void show_charging_progress(void)
*/
static int charge_request(int voltage, int current)
{
- int r1 = EC_SUCCESS, r2 = EC_SUCCESS;
+ int r1 = EC_SUCCESS, r2 = EC_SUCCESS, r3 = EC_SUCCESS;
static int prev_volt, prev_curr;
- /* TODO(crosbug.com/p/27640): should we call charger_set_mode() too? */
if (!voltage || !current)
voltage = current = 0;
@@ -299,6 +301,17 @@ static int charge_request(int voltage, int current)
problem(PR_SET_CURRENT, r2);
/*
+ * Set the charge inhibit bit when possible as it appears to save
+ * power in some cases (e.g. Nyan with BQ24735).
+ */
+ if (voltage > 0 || current > 0)
+ r3 = charger_set_mode(0);
+ else
+ r3 = charger_set_mode(CHARGE_FLAG_INHIBIT_CHARGE);
+ if (r3 != EC_SUCCESS)
+ problem(PR_SET_MODE, r3);
+
+ /*
* Only update if the request worked, so we'll keep trying on failures.
*/
if (!r1 && !r2) {