dev: pmic: Add api battery port open case

Add API to determine broken battery in lk.

CRs-Fixed: 567206
Change-Id: I8bb391aeb04e00db39e659cf92d9530a1b861435
diff --git a/dev/pmic/pm8x41/pm8x41.c b/dev/pmic/pm8x41/pm8x41.c
index 7d929cc..b846d9c 100644
--- a/dev/pmic/pm8x41/pm8x41.c
+++ b/dev/pmic/pm8x41/pm8x41.c
@@ -416,3 +416,53 @@
 {
 	pm8x41_reg_write(PMIC_WD_RESET_S2_CTL2, 0x0);
 }
+
+/* API to check for borken battery */
+int pm8xxx_is_battery_broken()
+{
+	uint8_t trkl_default = 0;
+	uint8_t vbat_det_default = 0;
+	int batt_is_broken = 0;
+
+	/* Store original trickle charging current setting */
+	trkl_default = pm8x41_reg_read(PM8XXX_IBAT_ATC_A);
+	/* Store original VBAT_DET_LO setting */
+	vbat_det_default = pm8x41_reg_read(PM8XXX_VBAT_DET);
+
+	/*Set trickle charge current to 50mA (IBAT_ATC_A = 0x00) */
+	pm8x41_reg_write(PM8XXX_IBAT_ATC_A, 0x00);
+	/* Set VBAT_DET_LO to 4.3V so that VBAT_DET_HI = 4.52V (VBAT_DET_LO = 0x35) */
+	pm8x41_reg_write(PM8XXX_VBAT_DET, VBAT_DET_LO_4_30V);
+	/* Unlock SMBBP Secured Register */
+	pm8x41_reg_write(PM8XXX_SEC_ACCESS, SEC_ACCESS);
+	/* Disable VTRKL_FAULT comp (SMBBP_CHGR_COMP_OVR0 = 0x08) */
+	pm8x41_reg_write(PM8XXX_COMP_OVR0, OVR0_DIS_VTRKL_FAULT);
+	/* Disable VCP (SMBB_BAT_IF_VCP = 0x00) */
+	pm8x41_reg_write(PM8XXX_VCP, 0x00);
+	/* Unlock SMBBP Secured Register */
+	pm8x41_reg_write(PM8XXX_SEC_ACCESS, SEC_ACCESS);
+	/* Force trickle charging (SMBB_CHGR_TRKL_CHG_TEST = 0x01) */
+	pm8x41_reg_write(PM8XXX_TRKL_CHG_TEST, CHG_TRICKLE_FORCED_ON);
+	/* Wait for vbat to rise */
+	mdelay(12);
+
+	/* Check Above VBAT_DET_HIGH status */
+	if (pm8x41_reg_read(PM8XXX_VBAT_IN_TSTS) & VBAT_DET_HI_RT_STS)
+		batt_is_broken = 1;
+	else
+		batt_is_broken = 0;
+
+	/* Unlock SMBBP Secured Register */
+	pm8x41_reg_write(PM8XXX_SEC_ACCESS, SEC_ACCESS);
+
+	/* Disable force trickle charging */
+	pm8x41_reg_write(PM8XXX_TRKL_CHG_TEST, 0x00);
+	/* re-enable VCP */
+	pm8x41_reg_write(PM8XXX_VCP, VCP_ENABLE);
+	/* restore trickle charging default current */
+	pm8x41_reg_write(PM8XXX_IBAT_ATC_A, trkl_default);
+	/* restore VBAT_DET_LO setting to original value */
+	pm8x41_reg_write(PM8XXX_VBAT_DET, vbat_det_default);
+
+	return batt_is_broken;
+}