huangcm
2025-09-01 53d8e046ac1bf2ebe94f671983e3d3be059df91a
longan/kernel/linux-4.9/drivers/power/supply/axp803_battery.c
....@@ -134,14 +134,23 @@
134134 int rdc = 0;
135135 int ret = 0;
136136
137
+ int vbat = 0;
137138 int charging = 0;
138139 int ocv_pct = 0;
139140 int coul_pct = 0;
140141 int ac_valid = 0;
141142 int usb_valid = 0;
143
+ int bat_cur_dir = 0;
144
+ static int low_power_cnt = 0;
142145 static int pre_rest_vol, invalid_count;
143146
144147 struct axp_config_info *axp_config = &bat_power->dts_info;
148
+
149
+ regmap_bulk_read(bat_power->regmap, AXP803_OCVBATH_RES, temp_val, 2);
150
+ ocv_vol = ((temp_val[0] << 4) | (temp_val[1] & 0xF)) * 1100 / 1000;
151
+
152
+ regmap_read(bat_power->regmap, AXP803_STATUS, &reg_value);
153
+ bat_cur_dir = (reg_value & 0x04) ? 1 : 0;
145154
146155 ret = regmap_read(bat_power->regmap, AXP803_CAP, &reg_value);
147156 if (ret)
....@@ -160,6 +169,20 @@
160169 rest_vol = 100;
161170 }
162171
172
+ /* read ocv percentage */
173
+ regmap_read(bat_power->regmap, AXP803_OCV_PERCENT, &reg_value);
174
+ ocv_pct = (int)(reg_value & 0x7F);
175
+
176
+ /* read vol */
177
+ vbat = axp803_get_vbat(bat_power);
178
+ if (unlikely(axp_debug_mask & AXP_CHG)) {
179
+ pr_err("kickpi: v1 ocv_pct = %d rest_vol = %d vbat = %d !\n", ocv_pct, rest_vol, vbat);
180
+ }
181
+
182
+ if ((ocv_pct == 0 && vbat > 0) || (rest_vol == 0 && vbat > 0) ) {
183
+ return 77;
184
+ }
185
+
163186 return rest_vol;
164187 }
165188
....@@ -235,7 +258,26 @@
235258 ocv_vol, rdc, coulumb_counter, batt_max_cap);
236259 }
237260
238
- return rest_vol;
261
+ /*
262
+ 1. vol < low_power_protect when not charge
263
+ 2. need power down
264
+ */
265
+ if (bat_cur_dir == 0 && ocv_vol < axp_config->pmu_vol_min) {
266
+ low_power_cnt++;
267
+ if (low_power_cnt >= 6) {
268
+ return 0;
269
+ }
270
+ } else {
271
+ low_power_cnt = 0;
272
+ }
273
+
274
+ if (unlikely(axp_debug_mask & AXP_CHG)) {
275
+ vbat = axp803_get_vbat(bat_power);
276
+ pr_err("kickpi: v2 ocv_pct = %d rest_vol = %d vbat = %d !\n", ocv_pct, rest_vol, vbat);
277
+ }
278
+
279
+ return ocv_pct;
280
+ // return rest_vol;
239281 }
240282
241283 static inline int axp_vts_to_mV(u16 reg)
....@@ -917,6 +959,7 @@
917959 AXP_OF_PROP_READ(pmu_runtime_chgcur, INTCHGCUR / 1000);
918960 AXP_OF_PROP_READ(pmu_suspend_chgcur, 1200);
919961 AXP_OF_PROP_READ(pmu_shutdown_chgcur, 1200);
962
+ AXP_OF_PROP_READ(pmu_vol_min, 3400);
920963 AXP_OF_PROP_READ(pmu_init_chgvol, INTCHGVOL / 1000);
921964 AXP_OF_PROP_READ(pmu_init_chgend_rate, INTCHGENDRATE);
922965 AXP_OF_PROP_READ(pmu_init_chg_enabled, 1);