diff options
author | Sean Hou <seanhou@lionsemi.com> | 2020-11-04 22:30:39 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-11-30 20:35:48 +0000 |
commit | 3c068a74639d883dbd7092b43a2efd7edf02b723 (patch) | |
tree | e8943aefec778090c304946eed31918ecd51988f | |
parent | 80bbcb5f97f095f0d8d2f895548c241660b7dc06 (diff) | |
download | chrome-ec-3c068a74639d883dbd7092b43a2efd7edf02b723.tar.gz |
ln9310: Startup sequence update.
Update Startup sequence to fully address SC_OUT over voltage issue.
BRANCH=master
BUG=170591575
TEST=Build successfully.
Change-Id: I31cbd839a7943ee19c19601bf178db6911f3dffd
Signed-off-by: Sean Hou <seanhou@lionsemi.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2520279
Reviewed-by: Wai-Hong Tam <waihong@google.com>
Commit-Queue: Wai-Hong Tam <waihong@google.com>
Tested-by: Wai-Hong Tam <waihong@google.com>
-rw-r--r-- | driver/ln9310.c | 53 | ||||
-rw-r--r-- | driver/ln9310.h | 21 |
2 files changed, 74 insertions, 0 deletions
diff --git a/driver/ln9310.c b/driver/ln9310.c index 6835d9af6d..93ee7973b4 100644 --- a/driver/ln9310.c +++ b/driver/ln9310.c @@ -115,6 +115,53 @@ static int is_battery_gt_10v(void) return gt_10v; } +static int ln9310_update_startup_seq(void) +{ + CPRINTS("LN9310 update startup sequence"); + + /* Startup sequence instruction swap */ + field_update8(LN9310_REG_LION_CTRL, + 0xff, + 0xaa); + + field_update8(LN9310_REG_SWAP_CTRL_0, + 0xff, + 0x3f); + + field_update8(LN9310_REG_SWAP_CTRL_1, + 0xff, + 0x51); + + field_update8(LN9310_REG_SWAP_CTRL_2, + 0xff, + 0x19); + + field_update8(LN9310_REG_SWAP_CTRL_3, + 0xff, + 0x02); + + /* Startup sequence settings */ + field_update8(LN9310_REG_CFG_4, + LN9310_CFG_4_SC_OUT_PRECHARGE_EN_TIME_CFG_MASK | + LN9310_CFG_4_SW1_VGS_SHORT_EN_MSK_MASK | + LN9310_CFG_4_BSTH_BSTL_HIGH_ROUT_CFG_MASK, + LN9310_CFG_4_SC_OUT_PRECHARGE_EN_TIME_CFG_ON | + LN9310_CFG_4_SW1_VGS_SHORT_EN_MSK_OFF | + LN9310_CFG_4_BSTH_BSTL_HIGH_ROUT_CFG_LOWEST); + + /* SW4 before BSTH_BSTL */ + field_update8(LN9310_REG_SPARE_0, + LN9310_SPARE_0_SW4_BEFORE_BSTH_BSTL_EN_CFG_MASK, + LN9310_SPARE_0_SW4_BEFORE_BSTH_BSTL_EN_CFG_ON); + + + field_update8(LN9310_REG_LION_CTRL, + 0xff, + 0x00); + + return EC_SUCCESS; +} + static int ln9310_init_3to1(void) { CPRINTS("LN9310 init (3:1 operation)"); @@ -219,6 +266,12 @@ void ln9310_init(void) usleep(LN9310_CDC_DELAY); CPRINTS("LN9310 OP_MODE Update method: Self-sync"); + /* Update Startup sequence */ + status = ln9310_update_startup_seq(); + + if (status != EC_SUCCESS) + return; + batt = board_get_battery_cell_type(); if (batt == BATTERY_CELL_TYPE_3S) { status = ln9310_init_3to1(); diff --git a/driver/ln9310.h b/driver/ln9310.h index 0f1a619f41..3cf4aaa3ca 100644 --- a/driver/ln9310.h +++ b/driver/ln9310.h @@ -119,8 +119,29 @@ #define LN9310_MODE_TM_VIN_OV_CFG_2S 0x0 /* 14V */ #define LN9310_MODE_TM_VIN_OV_CFG_3S 0x2 /* 20V */ +#define LN9310_REG_SPARE_0 0x2A +#define LN9310_SPARE_0_SW4_BEFORE_BSTH_BSTL_EN_CFG_MASK 0x40 +#define LN9310_SPARE_0_SW4_BEFORE_BSTH_BSTL_EN_CFG_ON 0x40 + #define LN9310_REG_SC_DITHER_CTRL 0x2f +#define LN9310_REG_LION_CTRL 0x30 + +#define LN9310_REG_CFG_4 0x40 +#define LN9310_CFG_4_SC_OUT_PRECHARGE_EN_TIME_CFG BIT(2) +#define LN9310_CFG_4_SW1_VGS_SHORT_EN_MSK BIT(3) +#define LN9310_CFG_4_SC_OUT_PRECHARGE_EN_TIME_CFG_MASK 0x04 +#define LN9310_CFG_4_SW1_VGS_SHORT_EN_MSK_MASK 0x08 +#define LN9310_CFG_4_BSTH_BSTL_HIGH_ROUT_CFG_MASK 0xC0 +#define LN9310_CFG_4_SC_OUT_PRECHARGE_EN_TIME_CFG_ON 0x04 +#define LN9310_CFG_4_SW1_VGS_SHORT_EN_MSK_OFF 0x00 +#define LN9310_CFG_4_BSTH_BSTL_HIGH_ROUT_CFG_LOWEST 0x00 + +#define LN9310_REG_SWAP_CTRL_0 0x58 +#define LN9310_REG_SWAP_CTRL_1 0x59 +#define LN9310_REG_SWAP_CTRL_2 0x5A +#define LN9310_REG_SWAP_CTRL_3 0x5B + #define LN9310_REG_BC_STS_B 0x51 #define LN9310_BC_STS_B_INFET_OUT_SWITCH_OK BIT(5) #define LN9310_BC_STS_B_INFET_OUT_SWITCH_OK_MASK 0x20 |