diff options
author | Ting Shen <phoenixshen@google.com> | 2019-10-04 14:28:28 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-08 07:34:04 +0000 |
commit | f483ce792c4b15f9f49264d44e449b3628b13df7 (patch) | |
tree | f04f1d21e804f84e28e54c55a6b563ef06a803e6 | |
parent | a205c09ca95686739e74394a4aa0e23168110395 (diff) | |
download | chrome-ec-f483ce792c4b15f9f49264d44e449b3628b13df7.tar.gz |
charger/mt6370: fix the disable sequence of bc12 detection
BC12_DET_EN should be disabled after mt6370 stops bc12 detection.
Otherwise, race condition may happen because both ap and charger have
access to D+ and D- pins.
BUG=b:141005922
TEST=make sure b:141005922 is not reproducible after this fix.
BRANCH=master
Change-Id: I89750efe58ba65b72bc47ee42c4923e560d9d534
Signed-off-by: Ting Shen <phoenixshen@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1839711
Reviewed-by: Yilun Lin <yllin@chromium.org>
Tested-by: Ting Shen <phoenixshen@chromium.org>
Commit-Queue: Ting Shen <phoenixshen@chromium.org>
-rw-r--r-- | driver/charger/rt946x.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c index 95804c9935..eec6abff26 100644 --- a/driver/charger/rt946x.c +++ b/driver/charger/rt946x.c @@ -258,11 +258,20 @@ static int rt946x_reset_to_zero(void) static int rt946x_enable_bc12_detection(int en) { #if defined(CONFIG_CHARGER_RT9467) || defined(CONFIG_CHARGER_MT6370) + int rv; + + if (en) { #ifdef CONFIG_CHARGER_MT6370_BC12_GPIO - gpio_set_level(GPIO_BC12_DET_EN, en); + gpio_set_level(GPIO_BC12_DET_EN, 1); #endif /* CONFIG_CHARGER_MT6370_BC12_GPIO */ - return (en ? rt946x_set_bit : rt946x_clr_bit) - (RT946X_REG_DPDM1, RT946X_MASK_USBCHGEN); + return rt946x_set_bit(RT946X_REG_DPDM1, RT946X_MASK_USBCHGEN); + } + + rv = rt946x_clr_bit(RT946X_REG_DPDM1, RT946X_MASK_USBCHGEN); +#ifdef CONFIG_CHARGER_MT6370_BC12_GPIO + gpio_set_level(GPIO_BC12_DET_EN, 0); +#endif /* CONFIG_CHARGER_MT6370_BC12_GPIO */ + return rv; #endif return 0; } |