summaryrefslogtreecommitdiff
path: root/driver/charger
diff options
context:
space:
mode:
authorAllen Chiang <allen_chiang@mediatek.corp-partner.google.com>2019-11-15 11:49:13 +0800
committerCommit Bot <commit-bot@chromium.org>2020-01-20 08:41:27 +0000
commitadd663e8d4bd0d756e8bbdb40b819abdfb27ea8a (patch)
tree57657983bb78b7fdf3fcdd2cf847c11318aa2fb6 /driver/charger
parent79c2d17078aeff8da275f36ac86ea85c73af281b (diff)
downloadchrome-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.c41
-rw-r--r--driver/charger/rt946x.h4
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