From 53d8e046ac1bf2ebe94f671983e3d3be059df91a Mon Sep 17 00:00:00 2001
From: huangcm <1263938474@qq.com>
Date: Mon, 01 Sep 2025 02:06:02 +0000
Subject: [PATCH] feat(bat): fix real cap & add bat 8000mA 2.0A charge config

---
 longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c |   43 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c b/longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c
index 9751b02..63c3c9a 100644
--- a/longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c
+++ b/longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c
@@ -134,17 +134,23 @@
 	int rdc = 0;
 	int ret = 0;
 
+    int vbat = 0;
 	int charging = 0;
 	int ocv_pct = 0;
 	int coul_pct = 0;
 	int ac_valid = 0;
 	int usb_valid = 0;
+    int bat_cur_dir = 0;
+    static int low_power_cnt = 0;
 	static int pre_rest_vol, invalid_count;
 
 	struct axp_config_info *axp_config = &bat_power->dts_info;
 
     regmap_bulk_read(bat_power->regmap, AXP803_OCVBATH_RES, temp_val, 2);
 	ocv_vol = ((temp_val[0] << 4) | (temp_val[1] & 0xF)) * 1100 / 1000;
+
+    regmap_read(bat_power->regmap, AXP803_STATUS, &reg_value);
+    bat_cur_dir = (reg_value & 0x04) ? 1 : 0;
 
 	ret = regmap_read(bat_power->regmap, AXP803_CAP, &reg_value);
 	if (ret)
@@ -163,9 +169,18 @@
 			rest_vol = 100;
 		}
 
-        if (ocv_vol < axp_config->pmu_vol_min) {
-            // pr_err("kickpi: ocv_vol %d < min %d, rest_vol %d -> 0\n", ocv_vol, axp_config->pmu_vol_min, rest_vol);
-            rest_vol = 0;
+	    /* read ocv percentage */
+        regmap_read(bat_power->regmap, AXP803_OCV_PERCENT, &reg_value);
+        ocv_pct = (int)(reg_value & 0x7F);
+
+        /* read vol */
+        vbat = axp803_get_vbat(bat_power);
+        if (unlikely(axp_debug_mask & AXP_CHG)) { 
+            pr_err("kickpi: v1 ocv_pct = %d rest_vol = %d vbat = %d !\n", ocv_pct, rest_vol, vbat);
+        }
+
+        if ((ocv_pct == 0 && vbat > 0) || (rest_vol == 0 && vbat > 0) ) {
+            return 77;
         }
             
 		return rest_vol;
@@ -243,12 +258,26 @@
 			ocv_vol, rdc, coulumb_counter, batt_max_cap);
 	}
 
-    if (ocv_vol < axp_config->pmu_vol_min) {
-        // pr_err("kickpi: ocv_vol %d < min %d, rest_vol %d -> 0\n", ocv_vol, axp_config->pmu_vol_min, rest_vol);
-        rest_vol = 0;
+    /*
+        1. vol < low_power_protect when not charge
+        2. need power down
+    */
+    if (bat_cur_dir == 0 && ocv_vol < axp_config->pmu_vol_min) {
+        low_power_cnt++;
+        if (low_power_cnt >= 6) {
+            return 0;
+        }
+    } else {
+        low_power_cnt = 0;
     }
 
-	return rest_vol;
+    if (unlikely(axp_debug_mask & AXP_CHG)) {
+        vbat = axp803_get_vbat(bat_power);
+        pr_err("kickpi: v2 ocv_pct = %d rest_vol = %d vbat = %d !\n", ocv_pct, rest_vol, vbat);
+    }
+
+    return ocv_pct;
+	// return rest_vol;
 }
 
 static inline int axp_vts_to_mV(u16 reg)

--
Gitblit v1.6.2