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 |   45 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 44 insertions(+), 1 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 5f49c60..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,14 +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)
@@ -160,6 +169,20 @@
 			rest_vol = 100;
 		}
 
+	    /* 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;
 	}
 
@@ -235,7 +258,26 @@
 			ocv_vol, rdc, coulumb_counter, batt_max_cap);
 	}
 
-	return rest_vol;
+    /*
+        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;
+    }
+
+    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)
@@ -917,6 +959,7 @@
 	AXP_OF_PROP_READ(pmu_runtime_chgcur, INTCHGCUR / 1000);
 	AXP_OF_PROP_READ(pmu_suspend_chgcur,             1200);
 	AXP_OF_PROP_READ(pmu_shutdown_chgcur,            1200);
+    AXP_OF_PROP_READ(pmu_vol_min,                    3400);
 	AXP_OF_PROP_READ(pmu_init_chgvol,    INTCHGVOL / 1000);
 	AXP_OF_PROP_READ(pmu_init_chgend_rate,  INTCHGENDRATE);
 	AXP_OF_PROP_READ(pmu_init_chg_enabled,              1);

--
Gitblit v1.6.2