diff options
author | Allen Chiang <allen_chiang@mediatek.corp-partner.google.com> | 2019-11-15 11:49:13 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-01-20 08:41:27 +0000 |
commit | add663e8d4bd0d756e8bbdb40b819abdfb27ea8a (patch) | |
tree | 57657983bb78b7fdf3fcdd2cf847c11318aa2fb6 /driver/charger | |
parent | 79c2d17078aeff8da275f36ac86ea85c73af281b (diff) | |
download | chrome-ec-add663e8d4bd0d756e8bbdb40b819abdfb27ea8a.tar.gz |
rt946x: lock ADC before cut-off.
1. If ADC is under used when cut-off,
this will cause a power leakge.
This CL lock the ADC before cut-off to prevent such case.
We change shipping mode command on MT6370
BRANCH=kukui
BUG=b:144511629
TEST=boot kukui, enter shipping mode.
Change-Id: I4b90a7be5e70b33f54c046c740da8e38b5a4aa2e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1916772
Reviewed-by: Eric Yilun Lin <yllin@chromium.org>
Commit-Queue: Eric Yilun Lin <yllin@chromium.org>
Tested-by: Eric Yilun Lin <yllin@chromium.org>
Diffstat (limited to 'driver/charger')
-rw-r--r-- | driver/charger/rt946x.c | 41 | ||||
-rw-r--r-- | driver/charger/rt946x.h | 4 |
2 files changed, 41 insertions, 4 deletions
diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c index 8ed49278fc..71ab72c818 100644 --- a/driver/charger/rt946x.c +++ b/driver/charger/rt946x.c @@ -1597,12 +1597,45 @@ int rt946x_is_charge_done(void) int rt946x_cutoff_battery(void) { - int val = RT946X_MASK_SHIP_MODE; - #ifdef CONFIG_CHARGER_MT6370 - val |= RT946X_MASK_TE | RT946X_MASK_CFO_EN | RT946X_MASK_CHG_EN; +/* + * We should lock ADC usage to prevent from using ADC while + * cut-off. Or this might cause the ADC power not turning off. + */ + + int rv; + + mutex_lock(&adc_access_lock); + rv = rt946x_write8(MT6370_REG_RSTPASCODE1, MT6370_MASK_RSTPASCODE1); + if (rv) + goto out; + + rv = rt946x_write8(MT6370_REG_RSTPASCODE2, MT6370_MASK_RSTPASCODE2); + if (rv) + goto out; + + /* reset all chg/fled/ldo/rgb/bl/db reg and logic */ + rv = rt946x_write8(RT946X_REG_CORECTRL2, 0x7F); + if (rv) + goto out; + + /* disable chg auto sensing */ + mt6370_enable_hidden_mode(1); + rv = rt946x_clr_bit(MT6370_REG_CHGHIDDENCTRL15, + MT6370_MASK_ADC_TS_AUTO); + mt6370_enable_hidden_mode(0); + if (rv) + goto out; + msleep(50); + /* enter shipping mode */ + rv = rt946x_set_bit(RT946X_REG_CHGCTRL2, RT946X_MASK_SHIP_MODE); + +out: + mutex_unlock(&adc_access_lock); + return rv; #endif - return rt946x_set_bit(RT946X_REG_CHGCTRL2, val); + /* enter shipping mode */ + return rt946x_set_bit(RT946X_REG_CHGCTRL2, RT946X_MASK_SHIP_MODE); } int rt946x_enable_charge_termination(int en) diff --git a/driver/charger/rt946x.h b/driver/charger/rt946x.h index 7c4d75ff74..275969878e 100644 --- a/driver/charger/rt946x.h +++ b/driver/charger/rt946x.h @@ -464,6 +464,10 @@ #define RT946X_MASK_IRCMP_RES (0x7 << RT946X_SHIFT_IRCMP_RES) #define RT946X_MASK_IRCMP_VCLAMP (0x7 << RT946X_SHIFT_IRCMP_VCLAMP) +/* ========== HIDDEN CTRL15 0x3E ============ */ +#define MT6370_SHIFT_ADC_TS_AUTO 0 +#define MT6370_MASK_ADC_TS_AUTO BIT(MT6370_SHIFT_ADC_TS_AUTO) + /* ========== DEVICE_ID 0x40 ============ */ #define RT946X_MASK_VENDOR_ID 0xF0 #define RT946X_MASK_CHIP_REV 0x0F |