summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hou <seanhou@lionsemi.com>2020-11-04 22:30:39 -0800
committerCommit Bot <commit-bot@chromium.org>2020-11-30 20:35:48 +0000
commit3c068a74639d883dbd7092b43a2efd7edf02b723 (patch)
treee8943aefec778090c304946eed31918ecd51988f
parent80bbcb5f97f095f0d8d2f895548c241660b7dc06 (diff)
downloadchrome-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.c53
-rw-r--r--driver/ln9310.h21
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