From 38454d7a161b28319bfa111e5ca8a89009699ae1 Mon Sep 17 00:00:00 2001 From: Rong Chang Date: Mon, 27 Aug 2012 18:29:27 +0800 Subject: [PATCH] snow: Change TPSCHROME fastcharge timeout to 6 hours When battery temperature t in range 0C to 10C, default charging current is 50%. And it will take longer than 3 hours to charge battery from 0% to full. Signed-off-by: Rong Chang BRANCH=snow BUG=chrome-os-partner:13172 TEST=manual Check pmu register 0x4. FASTCHARGE bits[4:2] should be 0b100. Change-Id: I133acee21c0886b0739b4b41766ca077bb4babbc Reviewed-on: https://gerrit.chromium.org/gerrit/31458 Reviewed-by: Yung-Chieh Lo Commit-Ready: Rong Chang Tested-by: Rong Chang --- board/snow/board.c | 11 +++---- common/pmu_tps65090.c | 63 +++++++++++++++++++++++++++++++++++++---- include/pmu_tpschrome.h | 29 ++++++++++++++++++- 3 files changed, 92 insertions(+), 11 deletions(-) diff --git a/board/snow/board.c b/board/snow/board.c index 25122a85f8..8fe510a020 100644 --- a/board/snow/board.c +++ b/board/snow/board.c @@ -279,11 +279,12 @@ void board_pmu_init(void) { int ver; - /* - * Set fast charging timeout to 3hr. - * Enable gpio charge_en control. - */ - pmu_write(0x04, 0x06); + /* Set fast charging timeout to 6 hours*/ + pmu_set_fastcharge(TIMEOUT_6HRS); + /* Enable external gpio CHARGER_EN control */ + pmu_enable_ext_control(1); + /* Disable force charging */ + pmu_enable_charger(0); /* Set NOITERM bit */ pmu_low_current_charging(1); diff --git a/common/pmu_tps65090.c b/common/pmu_tps65090.c index d6c8b1f994..0fdbef1d89 100644 --- a/common/pmu_tps65090.c +++ b/common/pmu_tps65090.c @@ -49,7 +49,10 @@ #define TPSCHROME_VER 0x19 /* Charger control */ -#define CG_CTRL0_EN 1 +#define CG_EN (1 << 0) +#define CG_EXT_EN (1 << 1) +#define CG_FASTCHARGE_SHIFT 2 +#define CG_FASTCHARGE_MASK (7 << CG_FASTCHARGE_SHIFT) /* Charger termination voltage/current */ #define CG_VSET_SHIFT 3 @@ -164,6 +167,13 @@ int pmu_get_power_source(int *ac_good, int *battery_good) return EC_SUCCESS; } +/** + * Enable charger's charging function + * + * When enable, charger ignores external control and charge the + * battery directly. If EC wants to contorl charging, set the flag + * to 0. + */ int pmu_enable_charger(int enable) { int rv; @@ -173,11 +183,54 @@ int pmu_enable_charger(int enable) if (rv) return rv; - if (reg & CG_CTRL0_EN) - return EC_SUCCESS; + if (enable) + reg |= CG_EN; + else + reg &= ~CG_EN; - return pmu_write(CG_CTRL0, enable ? (reg | CG_CTRL0_EN) : - (reg & ~CG_CTRL0)); + return pmu_write(CG_CTRL0, reg); +} + +/** + * Set external charge enable pin + * + * @param enable boolean, set 1 to eanble external control + */ +int pmu_enable_ext_control(int enable) +{ + int rv; + int reg; + + rv = pmu_read(CG_CTRL0, ®); + if (rv) + return rv; + + if (enable) + reg |= CG_EXT_EN; + else + reg &= ~CG_EXT_EN; + + return pmu_write(CG_CTRL0, reg); +} + +/** + * Set fast charge timeout + * + * @param timeout enum FASTCHARGE_TIMEOUT + */ +int pmu_set_fastcharge(enum FASTCHARGE_TIMEOUT timeout) +{ + int rv; + int reg; + + rv = pmu_read(CG_CTRL0, ®); + if (rv) + return rv; + + reg &= ~CG_FASTCHARGE_MASK; + reg |= (timeout << CG_FASTCHARGE_SHIFT) & CG_FASTCHARGE_MASK; + + return pmu_write(CG_CTRL0, reg); } /** diff --git a/include/pmu_tpschrome.h b/include/pmu_tpschrome.h index 5d65b73b45..2f7c213d9d 100644 --- a/include/pmu_tpschrome.h +++ b/include/pmu_tpschrome.h @@ -47,6 +47,18 @@ enum TPS_TERMINATION_CURRENT { TERM_I1000, /* 100 % */ }; +/* Fast charge timeout */ +enum FASTCHARGE_TIMEOUT { + TIMEOUT_2HRS, + TIMEOUT_3HRS, + TIMEOUT_4HRS, + TIMEOUT_5HRS, + TIMEOUT_6HRS, + TIMEOUT_7HRS, + TIMEOUT_8HRS, + TIMEOUT_10HRS, /* No 9 hours option */ +}; + #define FET_BACKLIGHT 1 #define FET_LCD_PANEL 6 @@ -111,7 +123,7 @@ int pmu_get_power_source(int *ac_good, int *battery_good); int pmu_enable_fet(int fet_id, int enable, int *power_good); /** - * Enable/disable pmu internal charger + * Enable/disable pmu internal charger force charging mode * * @param enable 0 to disable the charger, 1 to enable * @return EC_SUCCESS if no I2C communication error @@ -190,5 +202,20 @@ void pmu_init(void); */ int pmu_shutdown(void); +/** + * Set external charge enable pin + * + * @param enable boolean, set 1 to eanble external control + */ +int pmu_enable_ext_control(int enable); + +/** + * Set fast charge timeout + * + * @param timeout enum FASTCHARGE_TIMEOUT + */ +int pmu_set_fastcharge(enum FASTCHARGE_TIMEOUT timeout); + + #endif /* __CROS_EC_TPSCHROME_H */