From b8e0530e517cb94bdec9805dce72cbfc9cc2b7c8 Mon Sep 17 00:00:00 2001 From: Eric Yilun Lin Date: Thu, 27 Jan 2022 10:53:57 +0800 Subject: isl923x: disable AMON/BMON after use. Disable the AMON/BMON when it's not using to reduce power consumption. BUG=b:215659327 TEST=check ISL9238C control1 bit5 is set. BRANCH=none Change-Id: I53b2177ec9683661daac7b99be88ad7113b7377b Signed-off-by: Eric Yilun Lin Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3419358 Reviewed-by: Ting Shen Tested-by: Eric Yilun Lin Commit-Queue: Eric Yilun Lin --- driver/charger/isl923x.c | 36 +++++++++++++++++++++++++----------- zephyr/test/drivers/src/isl923x.c | 5 ++--- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c index 5911e3276c..c90fe5224e 100644 --- a/driver/charger/isl923x.c +++ b/driver/charger/isl923x.c @@ -198,13 +198,24 @@ static int get_amon_bmon(int chgnum, enum isl923x_amon_bmon amon, ret = raw_write16(chgnum, ISL923X_REG_CONTROL1, reg); } - mutex_unlock(&control1_mutex_isl923x); - if (ret) - return ret; + goto err; *adc = adc_read_channel(ADC_AMON_BMON); + ret = raw_read16(chgnum, ISL923X_REG_CONTROL1, ®); + if (ret) + goto err; + + /* Disable monitor */ + reg |= ISL923X_C1_DISABLE_MON; + + ret = raw_write16(chgnum, ISL923X_REG_CONTROL1, reg); + if (ret) + goto err; + +err: + mutex_unlock(&control1_mutex_isl923x); return ret; } #endif @@ -608,6 +619,16 @@ static void isl923x_init(int chgnum) goto init_fail; } + if (raw_read16(chgnum, ISL923X_REG_CONTROL1, ®)) + goto init_fail; + /* + * Disable amon/bmon by default. + */ + reg |= ISL923X_C1_DISABLE_MON; + + if (raw_write16(chgnum, ISL923X_REG_CONTROL1, reg)) + goto init_fail; + if (IS_ENABLED(CONFIG_TRICKLE_CHARGING)) if (raw_write16(chgnum, ISL923X_REG_SYS_VOLTAGE_MIN, precharge_voltage)) @@ -888,7 +909,7 @@ void raa489000_hibernate(int chgnum, bool disable_adc) */ regval |= RAA489000_C1_BGATE_FORCE_OFF; - /* Disable AMON/BMON */ + /* Disable AMON/BMON. MON is enabled at get_amon_bmon() */ regval |= ISL923X_C1_DISABLE_MON; /* Disable PSYS */ @@ -952,10 +973,6 @@ void raa489000_hibernate(int chgnum, bool disable_adc) enum ec_error_list isl9238c_hibernate(int chgnum) { - /* Disable IMON */ - RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1, - ISL923X_C1_DISABLE_MON, MASK_SET)); - /* Disable PSYS */ RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1, ISL923X_C1_ENABLE_PSYS, MASK_CLR)); @@ -975,9 +992,6 @@ enum ec_error_list isl9238c_hibernate(int chgnum) enum ec_error_list isl9238c_resume(int chgnum) { /* Revert everything in isl9238c_hibernate() */ - RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1, - ISL923X_C1_DISABLE_MON, MASK_CLR)); - RETURN_ERROR(raw_update16(chgnum, ISL923X_REG_CONTROL1, ISL923X_C1_ENABLE_PSYS, MASK_SET)); diff --git a/zephyr/test/drivers/src/isl923x.c b/zephyr/test/drivers/src/isl923x.c index 12be885bfb..203a2ed979 100644 --- a/zephyr/test/drivers/src/isl923x.c +++ b/zephyr/test/drivers/src/isl923x.c @@ -1057,9 +1057,8 @@ ZTEST(isl923x_hibernate, test_isl9238c_resume) /* Part 1: Happy path */ control1_expected = - (isl923x_emul_peek_reg(i2c_emul, ISL923X_REG_CONTROL1) & - ~ISL923X_C1_DISABLE_MON) | ISL923X_C1_ENABLE_PSYS - ; + isl923x_emul_peek_reg(i2c_emul, ISL923X_REG_CONTROL1) | + ISL923X_C1_ENABLE_PSYS; control2_expected = isl923x_emul_peek_reg(i2c_emul, ISL923X_REG_CONTROL2) & ~ISL923X_C2_COMPARATOR; -- cgit v1.2.1