ln8411_driver: Flowchart rev 1.0 changes

change wlx_rx step to 40mV
use ta_max_vol from ta
improve error handling

Bug: 276796221
Change-Id: I0cdf815a75dc49de9580c7be709a4b9154521c10
Signed-off-by: Prasanna Prapancham <[email protected]>
diff --git a/ln8411_charger.h b/ln8411_charger.h
index 293310a..37b621c 100644
--- a/ln8411_charger.h
+++ b/ln8411_charger.h
@@ -37,10 +37,8 @@
 	u32		iin_topoff;	/* Input Topoff current -uV unit */
 	s32		iin_max_offset;
 	s32		iin_cc_comp_offset;
-	u32		ta_max_vol;
 	u32		ta_max_vol_2_1;
 	u32		ta_max_vol_4_1;
-	u32		ta_max_vol_cp;
 
 	/* irdrop */
 	s32		irdrop_limits[3];
@@ -330,7 +328,7 @@
 /* PPS timers */
 #define LN8411_PDMSG_WAIT_T		250	/* 250ms */
 #define LN8411_PDMSG_RETRY_T		1000	/* 1000ms */
-#define LN8411_PDMSG_WLC_WAIT_T	5000	/* 5000ms */
+#define LN8411_PDMSG_WLC_WAIT_T	2000	/* 2000ms */
 #define LN8411_PPS_PERIODIC_T		10000	/* 10000ms */
 #define LN8411_TA_CONFIG_WAIT_T		(4 * LN8411_PDMSG_WAIT_T)
 
diff --git a/ln8411_driver.c b/ln8411_driver.c
index 346a176..927c39a 100644
--- a/ln8411_driver.c
+++ b/ln8411_driver.c
@@ -75,7 +75,7 @@
 /* TA maximum voltage that can support CC in Constant Power Mode */
 #define LN8411_TA_MAX_VOL_CP		10250000
 /* Offset for cc_max / 2 */
-#define LN8411_IIN_MAX_OFFSET		0
+#define LN8411_IIN_MAX_OFFSET		25000 /* uA */
 
 
 /* maximum retry counter for restarting charging */
@@ -90,7 +90,7 @@
 /* Maximum WCRX voltage threshold */
 #define LN8411_WCRX_MAX_VOL		9750000 /* uV */
 /* WCRX voltage Step */
-#define WCRX_VOL_STEP			100000	/* uV */
+#define WCRX_VOL_STEP			40000	/* uV */
 
 /* Default value for protections */
 #define VBAT_REV_UVP_DFT		3500000 /* 3.5V */
@@ -884,7 +884,7 @@
 
 static int ln8411_check_not_active(struct ln8411_charger *ln8411, int loglevel)
 {
-	int ret;
+	int ret, rc = -EINVAL;
 	unsigned int reg;
 	u8 safety_sts[4];
 
@@ -892,10 +892,15 @@
 	if (ret < 0)
 		goto done;
 
-	if (reg & LN8411_STANDBY_STS)
+	if (reg & LN8411_STANDBY_STS) {
+		rc = -EAGAIN;
 		logbuffer_prlog(ln8411, loglevel, "%s: in standby\n", __func__);
-	else if (reg & LN8411_SHUTDOWN_STS)
+	} else if (reg & LN8411_SHUTDOWN_STS) {
+		rc = -EINVAL;
 		logbuffer_prlog(ln8411, loglevel, "%s: in shutdown\n", __func__);
+	} else {
+		rc = 0;
+	}
 
 	ret = regmap_bulk_read(ln8411->regmap, LN8411_SAFETY_STS, safety_sts, 4);
 
@@ -904,7 +909,7 @@
 			"%s: ret: %d, LN8411_SAFETY_STS 0x99:%#02x, 0x9a:%#02x, 0x9b:%#02x, 0x9c:%#02x\n",
 			__func__, ret, safety_sts[0], safety_sts[1], safety_sts[2], safety_sts[3]);
 
-	return ret;
+	return rc;
 }
 
 int ln8411_check_active(struct ln8411_charger *ln8411)
@@ -931,9 +936,6 @@
 	if (!val) {
 		dev_err(ln8411->dev, "%s: CP Not switching LN8411_SYS_STS: %#02X\n",
 			__func__, reg);
-
-		ln8411_check_state(ln8411, LOGLEVEL_ERR);
-		ln8411_check_not_active(ln8411, LOGLEVEL_ERR);
 		return -EINVAL;
 	}
 
@@ -957,39 +959,22 @@
 static int ln8411_check_error(struct ln8411_charger *ln8411)
 {
 	int ret = -EINVAL, vbatt;
-	unsigned int val;
 
 	/* LN8411 is active state */
-	if (ln8411_check_active(ln8411) <= 0)
-		goto error;
+	if (ln8411_check_active(ln8411) == 1) {
+		dev_dbg(ln8411->dev, "%s: Active Status ok\n", __func__);
+		return 0;
+	}
 
 	/* LN8411 is charging */
 	/* Check whether the battery voltage is over the minimum */
 	vbatt = ln8411_read_adc(ln8411, ADCCH_VBAT);
-	if (vbatt <= LN8411_DC_VBAT_MIN) {
+	if (vbatt <= LN8411_DC_VBAT_MIN)
 		/* Abnormal battery level */
 		dev_err(ln8411->dev, "%s: Error abnormal battery voltage=%d\n",	__func__, vbatt);
-		goto error;
-	}
 
-	/* Normal charging battery level */
-	/* Check temperature regulation loop */
-	ret = regmap_read(ln8411->regmap, LN8411_SAFETY_STS, &val);
-	if (ret < 0) {
-		dev_err(ln8411->dev, "%s: cannot read LN8411_SAFETY_STS (%d)\n", __func__, ret);
-		goto error;
-	} else if ((val & LN8411_TEMP_FAULT_DETECTED) || (val & LN8411_TEMP_MAX_STS)) {
-		/* Over temperature protection */
-		dev_err(ln8411->dev, "%s: In temperature regulation %#02X\n", __func__, val);
-		goto error;
-	}
-
-	dev_dbg(ln8411->dev, "%s: Active Status ok=%d (ret=%d)\n", __func__, ret == 0, ret);
-	return ret;
-
-error:
 	ln8411_check_state(ln8411, LOGLEVEL_ERR);
-	ln8411_check_not_active(ln8411, LOGLEVEL_ERR);
+	ret = ln8411_check_not_active(ln8411, LOGLEVEL_ERR);
 
 	/*
 	 * Sometimes battery driver might call set_property function
@@ -1000,8 +985,8 @@
 	if (ln8411->charging_state == DC_STATE_NO_CHARGING)
 		dev_err(ln8411->dev, "%s: other driver forced stop\n", __func__);
 
-	dev_dbg(ln8411->dev, "%s: Not Active Status=%d\n", __func__, -EINVAL);
-	return -EINVAL;
+	dev_dbg(ln8411->dev, "%s: Not Active Status=%d\n", __func__, ret);
+	return ret;
 }
 
 static int ln8411_get_iin(struct ln8411_charger *ln8411, int *iin)
@@ -1556,11 +1541,17 @@
 
 			/* Check IIN_ADC < IIN_CC - 50mA */
 			if (iin < iin_cc_lb) {
-				const unsigned int ta_max_vol =
-				    ln8411->pdata->ta_max_vol * ln8411->chg_mode;
+				unsigned int ta_max_vol = 0;
 				unsigned int iin_apdo;
 				unsigned int val;
 
+				if (ln8411->chg_mode == CHG_4TO1_DC_MODE)
+					ta_max_vol =
+						   ln8411->pdata->ta_max_vol_4_1 * CHG_4TO1_DC_MODE;
+				else if (ln8411->chg_mode == CHG_2TO1_DC_MODE)
+					ta_max_vol =
+						   ln8411->pdata->ta_max_vol_2_1 * CHG_2TO1_DC_MODE;
+
 				/* Set new IIN_CC to IIN_CC - 50mA */
 				ln8411->iin_cc = ln8411->iin_cc -
 					  ln8411->pdata->iin_cc_comp_offset;
@@ -1856,7 +1847,7 @@
 /* recalculate ->ta_vol and ->ta_cur looking at demand (cc_max) */
 static int ln8411_set_wired_dc(struct ln8411_charger *ln8411, int vbat)
 {
-	const unsigned long ta_max_vol = ln8411->pdata->ta_max_vol * ln8411->chg_mode;
+	const unsigned long ta_max_vol = ln8411->ta_max_vol;
 	unsigned long val;
 	int iin_cc;
 
@@ -2831,13 +2822,19 @@
 					ln8411->ta_vol);
 		} else {
 			const int ta_max_vol = ln8411->ta_max_vol;
+			int ta_max_vol_cp = 0;
+
+			if (ln8411->chg_mode == CHG_4TO1_DC_MODE)
+				ta_max_vol_cp = ln8411->pdata->ta_max_vol_4_1 * CHG_4TO1_DC_MODE;
+			else if (ln8411->chg_mode == CHG_2TO1_DC_MODE)
+				ta_max_vol_cp = ln8411->pdata->ta_max_vol_2_1 * CHG_2TO1_DC_MODE;
 
 			/* Check TA current with TA_MIN_CUR */
 			if (ln8411->ta_cur <= LN8411_TA_MIN_CUR) {
 				ln8411->ta_cur = LN8411_TA_MIN_CUR;
 
 				ret = ln8411_set_ta_voltage_comp(ln8411);
-			} else if (ta_max_vol >= ln8411->pdata->ta_max_vol_cp) {
+			} else if (ta_max_vol >= ta_max_vol_cp) {
 				ret = ln8411_set_ta_current_comp(ln8411);
 			} else {
 				/* constant power mode */
@@ -3252,7 +3249,6 @@
 				      LN8411_TA_MAX_CUR_4_1);
 	if (ret == 0) {
 		ln8411->chg_mode = CHG_4TO1_DC_MODE;
-		ln8411->pdata->ta_max_vol = ln8411->pdata->ta_max_vol_4_1;
 		goto done;
 	}
 
@@ -3263,7 +3259,6 @@
 				      LN8411_TA_MAX_CUR);
 	if (ret == 0) {
 		ln8411->chg_mode = CHG_2TO1_DC_MODE;
-		ln8411->pdata->ta_max_vol = ln8411->pdata->ta_max_vol_2_1;
 		goto done;
 	}
 
@@ -3273,13 +3268,12 @@
 	ret = ln8411_get_apdo_max_power(ln8411, ln8411->pdata->ta_max_vol_2_1 * CHG_2TO1_DC_MODE, 0);
 	if (ret == 0) {
 		ln8411->chg_mode = CHG_2TO1_DC_MODE;
-		ln8411->pdata->ta_max_vol = ln8411->pdata->ta_max_vol_2_1;
 		goto done;
 	}
 
 	dev_err(ln8411->dev, "%s: No APDO to support 2:1\n", __func__);
 	ln8411->chg_mode = CHG_NO_DC_MODE;
-	ln8411->pdata->ta_max_vol = 0;
+	ln8411->ta_max_vol = 0;
 
 done:
 	return ret;
@@ -3475,28 +3469,8 @@
 		ln8411->retry_cnt = 0;
 		ln8411->timer_id = TIMER_ADJUST_CCMODE;
 		ln8411->timer_period = 0;
-	} else if (ret == -EAGAIN) {
-
-		/* try restarting only */
-		if (ln8411->retry_cnt >= LN8411_MAX_RETRY_CNT) {
-			dev_err(ln8411->dev, "%s: retry failed\n", __func__);
-			ret = -EINVAL;
+	} else {
 			goto exit_done;
-		}
-
-		/*
-		 * Disable charging to retry enabling it later, return 0 here
-		 * and the timer loop will figure out that there is something
-		 * wrong and will retry.
-		 */
-		ret = ln8411_set_charging(ln8411, false);
-		dev_err(ln8411->dev, "%s: retry cnt=%d, (%d)\n", __func__,
-		       ln8411->retry_cnt, ret);
-		if (ret == 0) {
-			ln8411->timer_id = TIMER_PRESET_DC;
-			ln8411->timer_period = 0;
-			ln8411->retry_cnt++;
-		}
 	}
 
 exit_done:
@@ -3636,7 +3610,7 @@
 
 	/* Adjust TA current and voltage step */
 	if (ln8411->ta_type == TA_TYPE_WIRELESS) {
-		/* RX voltage resolution is 100mV */
+		/* RX voltage resolution is 40mV */
 		val = ln8411->ta_vol / WCRX_VOL_STEP;
 		ln8411->ta_vol = val * WCRX_VOL_STEP;
 
@@ -4078,7 +4052,8 @@
 	if (!adc_done)
 		dev_err(ln8411->dev, "%s: Error enabling adc\n", __func__);
 #endif
-
+	if (!ret)
+		dev_dbg(ln8411->dev, "HW init done");
 error_done:
 	return ret;
 }
@@ -4317,7 +4292,8 @@
 
 	msleep(200);
 
-	if (!(ln8411_check_active(ln8411) == 1))
+	ret = ln8411_check_error(ln8411);
+	if (ret)
 		goto error;
 
 	/* Enable PMID2OUT_UVP */
@@ -4348,7 +4324,9 @@
 		goto error;
 	}
 
-	ret = ln8411_check_active(ln8411) <= 0;
+	ret = ln8411_check_error(ln8411);
+	if (ret)
+		goto error;
 
 error:
 	ret1 = ln8411_set_lion_ctrl(ln8411, LN8411_LION_CTRL_LOCK);
@@ -4759,12 +4737,6 @@
 		dev_warn(dev, "ln8411,ta-max-vol_2_1 is Empty\n");
 		pdata->ta_max_vol_2_1 = LN8411_TA_MAX_VOL_2_1;
 	}
-	ret = of_property_read_u32(np_ln8411, "ln8411,ta-max-vol-cp",
-				   &pdata->ta_max_vol_cp);
-	if (ret) {
-		dev_warn(dev, "ln8411,ta-max-vol-cp is Empty\n");
-		pdata->ta_max_vol_cp = pdata->ta_max_vol;
-	}
 
 	/* charging float voltage */
 	ret = of_property_read_u32(np_ln8411, "ln8411,float-voltage",