Skip to content

Commit 2c1c86d

Browse files
power-xsfrkhuangtao
authored andcommitted
power: rk817: fix the battery charging but dispaly soc not up
Change-Id: I3153dad46c959670f11dd91c7cbd687f4136c171 Signed-off-by: shengfei Xu <xsf@rock-chips.com>
1 parent 73403cf commit 2c1c86d

1 file changed

Lines changed: 136 additions & 20 deletions

File tree

drivers/power/rk817_battery.c

Lines changed: 136 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#include <linux/wakelock.h>
3838
#include <linux/workqueue.h>
3939

40-
static int dbg_enable;
40+
static int dbg_enable = 1;
4141

4242
module_param_named(dbg_level, dbg_enable, int, 0644);
4343

@@ -495,6 +495,19 @@ struct rk817_battery_device {
495495
int zero_linek;
496496
u64 zero_drop_sec;
497497
u64 shtd_drop_sec;
498+
499+
int powerpatch_res;
500+
int zero_voltage_avg;
501+
int zero_current_avg;
502+
int zero_vsys;
503+
int zero_dead_voltage;
504+
int zero_dead_soc;
505+
int zero_dead_cap;
506+
int zero_batvol_to_ocv;
507+
int zero_batocv_to_soc;
508+
int zero_batocv_to_cap;
509+
int zero_xsoc;
510+
498511
int sm_remain_cap;
499512
int sm_linek;
500513
int sm_chrg_dsoc;
@@ -1330,16 +1343,27 @@ static void rk817_bat_calc_sm_linek(struct rk817_battery_device *battery)
13301343
{
13311344
int linek;
13321345
int diff, delta;
1346+
int current_avg = rk817_bat_get_avg_current(battery);
13331347

13341348
delta = abs(battery->dsoc - battery->rsoc);
13351349
diff = delta * 3;/* speed:3/4 */
13361350

1337-
if (battery->dsoc < battery->rsoc)
1338-
linek = -1000 * diff / DIV(delta + diff);
1339-
else if (battery->dsoc > battery->rsoc)
1340-
linek = -1000 * (delta + diff) / DIV(diff);
1341-
else
1342-
linek = -1000;
1351+
if (current_avg > 0) {
1352+
if (battery->dsoc < battery->rsoc)
1353+
linek = 1000 * diff / DIV(delta + diff);
1354+
else if (battery->dsoc > battery->rsoc)
1355+
linek = 1000 * (delta + diff) / DIV(diff);
1356+
else
1357+
linek = 1000;
1358+
} else {
1359+
if (battery->dsoc < battery->rsoc)
1360+
linek = -1000 * diff / DIV(delta + diff);
1361+
else if (battery->dsoc > battery->rsoc)
1362+
linek = -1000 * (delta + diff) / DIV(diff);
1363+
else
1364+
linek = -1000;
1365+
}
1366+
13431367
battery->dbg_meet_soc = (battery->dsoc >= battery->rsoc) ?
13441368
(battery->dsoc - diff) : (battery->rsoc - diff);
13451369

@@ -1403,6 +1427,7 @@ static void rk817_bat_not_first_pwron(struct rk817_battery_device *battery)
14031427
battery->is_initialized = is_rk817_bat_initialized(battery);
14041428
battery->is_ocv_calib = is_rk817_bat_ocv_valid(battery);
14051429

1430+
pre_soc *= 1000;
14061431
if (battery->is_halt) {
14071432
BAT_INFO("system halt last time... cap: pre=%d, now=%d\n",
14081433
pre_cap, now_cap);
@@ -1448,7 +1473,7 @@ static void rk817_bat_not_first_pwron(struct rk817_battery_device *battery)
14481473
}
14491474
}
14501475
finish:
1451-
battery->dsoc = pre_soc * 1000;
1476+
battery->dsoc = pre_soc;
14521477
battery->nac = pre_cap;
14531478
if (battery->nac < 0)
14541479
battery->nac = 0;
@@ -1784,8 +1809,8 @@ static void rk817_bat_power_supply_changed(struct rk817_battery_device *battery)
17841809
{
17851810
static int old_soc = -1;
17861811

1787-
if (battery->dsoc > 100)
1788-
battery->dsoc = 100;
1812+
if (battery->dsoc > 100 * 1000)
1813+
battery->dsoc = 100 * 1000;
17891814
else if (battery->dsoc < 0)
17901815
battery->dsoc = 0;
17911816

@@ -1828,8 +1853,6 @@ static void rk817_battery_debug_info(struct rk817_battery_device *battery)
18281853
rk817_bat_get_ocv_current(battery);
18291854
rk817_bat_get_ocv_current0(battery);
18301855
rk817_bat_get_pwron_current(battery);
1831-
rk817_bat_init_coulomb_cap(battery, 500);
1832-
rk817_bat_update_qmax(battery, 1000);
18331856
rk817_bat_get_ocv_count(battery);
18341857
rk817_bat_save_dsoc(battery, battery->dsoc);
18351858
DBG("capactiy = %d\n", rk817_bat_get_capacity_mah(battery));
@@ -1919,7 +1942,31 @@ static void rk817_bat_calc_smooth_dischrg(struct rk817_battery_device *battery)
19191942

19201943
static void rk817_bat_smooth_algorithm(struct rk817_battery_device *battery)
19211944
{
1922-
int ydsoc = 0, delta_cap = 0, old_cap = 0;
1945+
int ydsoc = 0, delta_cap = 0, old_cap = 0, tmp_soc;
1946+
int linek;
1947+
int diff, delta;
1948+
int current_avg = rk817_bat_get_avg_current(battery);
1949+
1950+
delta = abs(battery->dsoc - battery->rsoc);
1951+
diff = delta * 3;/* speed:3/4 */
1952+
1953+
if (current_avg > 0) {
1954+
if (battery->dsoc < battery->rsoc)
1955+
linek = 1000 * diff / DIV(delta + diff);
1956+
else if (battery->dsoc > battery->rsoc)
1957+
linek = 1000 * (delta + diff) / DIV(diff);
1958+
else
1959+
linek = 1000;
1960+
} else {
1961+
if (battery->dsoc < battery->rsoc)
1962+
linek = -1000 * diff / DIV(delta + diff);
1963+
else if (battery->dsoc > battery->rsoc)
1964+
linek = -1000 * (delta + diff) / DIV(diff);
1965+
else
1966+
linek = -1000;
1967+
}
1968+
1969+
battery->sm_linek = linek;
19231970

19241971
battery->remain_cap = rk817_bat_get_capacity_uah(battery);
19251972

@@ -1931,7 +1978,7 @@ static void rk817_bat_smooth_algorithm(struct rk817_battery_device *battery)
19311978
/* from charge to discharge:
19321979
* remain_cap may be above sm_remain_cap, delta_cap <= 0
19331980
*/
1934-
delta_cap = battery->sm_remain_cap - battery->remain_cap;
1981+
delta_cap = battery->remain_cap - battery->sm_remain_cap;
19351982
DBG("smooth: sm_remain_cap = %d, remain_cap = %d\n",
19361983
battery->sm_remain_cap, battery->remain_cap);
19371984
DBG("smooth: delta_cap = %d, dsoc = %d\n",
@@ -1943,7 +1990,7 @@ static void rk817_bat_smooth_algorithm(struct rk817_battery_device *battery)
19431990
}
19441991

19451992
/* discharge: sm_linek < 0, if delate_cap <0, ydsoc > 0 */
1946-
ydsoc = battery->sm_linek * (delta_cap / DIV(battery->fcc)) / 10;
1993+
ydsoc = battery->sm_linek * abs(delta_cap / DIV(battery->fcc)) / 10;
19471994

19481995
DBG("smooth: ydsoc = %d, fcc = %d\n", ydsoc, battery->fcc);
19491996
if (ydsoc == 0) {
@@ -1961,8 +2008,26 @@ static void rk817_bat_smooth_algorithm(struct rk817_battery_device *battery)
19612008
* from charge status to dischrage
19622009
*/
19632010
battery->smooth_soc += ydsoc;
1964-
if (ydsoc < 0)
2011+
if (ydsoc < 0) {
19652012
rk817_bat_calc_smooth_dischrg(battery);
2013+
} else {
2014+
if (battery->smooth_soc < 0)
2015+
battery->smooth_soc = 0;
2016+
2017+
tmp_soc = battery->smooth_soc / 1000;
2018+
2019+
if (tmp_soc != battery->dsoc / 1000) {
2020+
if (battery->smooth_soc < battery->dsoc)
2021+
return;
2022+
if (battery->smooth_soc > battery->dsoc + 1000)
2023+
battery->dsoc += 1000;
2024+
else
2025+
battery->dsoc = battery->smooth_soc;
2026+
if (battery->dsoc <= 0)
2027+
battery->dsoc = 0;
2028+
}
2029+
}
2030+
19662031
DBG("smooth: smooth_soc = %d, dsoc = %d\n",
19672032
battery->smooth_soc, battery->dsoc);
19682033
DBG("smooth: delta_cap = %d, dsoc = %d\n",
@@ -1991,6 +2056,10 @@ static void rk817_bat_calc_zero_linek(struct rk817_battery_device *battery)
19912056

19922057
powerpatch_res = (voltage_avg - vsys) * 1000 / current_avg;
19932058

2059+
battery->zero_voltage_avg = voltage_avg;
2060+
battery->zero_current_avg = current_avg;
2061+
battery->zero_vsys = vsys;
2062+
19942063
DBG("Zero: voltage_avg = %d, Vsys = %d\n", voltage_avg, vsys);
19952064
DBG("Zero: powerpatch_res = %d\n", powerpatch_res);
19962065
DBG("ZERO0: shtd_vol: poweroff_vol(usr) = %d\n"
@@ -2022,6 +2091,16 @@ static void rk817_bat_calc_zero_linek(struct rk817_battery_device *battery)
20222091
/* xsoc: available rsoc */
20232092
xsoc = ocv_soc - dead_soc;
20242093

2094+
battery->zero_dead_voltage = dead_voltage;
2095+
battery->zero_dead_soc = dead_soc;
2096+
battery->zero_dead_cap = dead_cap;
2097+
2098+
battery->zero_batvol_to_ocv = ocv_voltage;
2099+
battery->zero_batocv_to_soc = ocv_soc;
2100+
battery->zero_batocv_to_cap = ocv_cap;
2101+
2102+
battery->zero_xsoc = xsoc;
2103+
20252104
DBG("Zero: xsoc = %d\n", xsoc);
20262105
/* min_gap_xsoc: reserve xsoc */
20272106
if (abs(current_avg) > ZERO_LOAD_LVL1)
@@ -2152,6 +2231,20 @@ static void rk817_bat_zero_algo_prepare(struct rk817_battery_device *battery)
21522231

21532232
static void rk817_bat_calc_zero_algorithm(struct rk817_battery_device *battery)
21542233
{
2234+
int tmp_soc;
2235+
2236+
tmp_soc = battery->zero_dsoc / 1000;
2237+
2238+
if (tmp_soc == battery->dsoc / 1000)
2239+
return;
2240+
2241+
if (battery->zero_dsoc > battery->dsoc)
2242+
return;
2243+
2244+
if (battery->zero_dsoc < battery->dsoc - 1000)
2245+
battery->dsoc -= 1000;
2246+
else
2247+
battery->dsoc = battery->zero_dsoc;
21552248
}
21562249

21572250
static void rk817_bat_zero_algorithm(struct rk817_battery_device *battery)
@@ -2160,12 +2253,34 @@ static void rk817_bat_zero_algorithm(struct rk817_battery_device *battery)
21602253

21612254
battery->zero_timeout_cnt++;
21622255
delta_cap = battery->zero_remain_cap - battery->remain_cap;
2163-
delta_soc = battery->zero_linek * (delta_cap / DIV(battery->fcc)) / 10;
2164-
2165-
DBG("Zero: zero_remain_cap = %d, remain_cap = %d\n",
2256+
delta_soc = battery->zero_linek * delta_cap / DIV(battery->fcc) / 10;
2257+
2258+
DBG("zero algorithm start\n");
2259+
DBG("DEAD: dead_voltage: %d\n"
2260+
"dead_soc: %d\n"
2261+
"dead_cap: %d\n"
2262+
"powoff_vol: %d\n",
2263+
battery->zero_dead_voltage,
2264+
battery->zero_dead_soc,
2265+
battery->zero_dead_cap,
2266+
battery->pdata->pwroff_vol);
2267+
DBG("DEAD: bat_voltage: %d\n"
2268+
"bat_current: %d\n"
2269+
"batvol_to_ocv: %d\n"
2270+
"batocv_to_soc: %d\n"
2271+
"batocv_to_cap: %d\n",
2272+
battery->zero_voltage_avg,
2273+
battery->zero_current_avg,
2274+
battery->zero_batvol_to_ocv,
2275+
battery->zero_batocv_to_soc,
2276+
battery->zero_batocv_to_cap);
2277+
DBG("DEAD: Xsoc: %d, zero_reserve_dsoc: %d\n",
2278+
battery->zero_xsoc, battery->pdata->zero_reserve_dsoc);
2279+
DBG("CAP: zero_remain_cap = %d, remain_cap = %d\n",
21662280
battery->zero_remain_cap, battery->remain_cap);
21672281
DBG("Zero: zero_delta_cap = %d, zero_link = %d, delta_soc = %d\n",
21682282
delta_cap, battery->zero_linek, delta_soc);
2283+
DBG("zero algorithm end\n");
21692284

21702285
if ((delta_soc >= MIN_ZERO_DSOC_ACCURACY) ||
21712286
(battery->zero_timeout_cnt > MIN_ZERO_OVERCNT) ||
@@ -2174,6 +2289,7 @@ static void rk817_bat_zero_algorithm(struct rk817_battery_device *battery)
21742289
battery->zero_timeout_cnt = 0;
21752290
battery->zero_dsoc -= delta_soc;
21762291
rk817_bat_calc_zero_algorithm(battery);
2292+
DBG("Zero: dsoc: %d\n", battery->dsoc);
21772293
rk817_bat_calc_zero_linek(battery);
21782294
}
21792295
}
@@ -2315,7 +2431,7 @@ static int rk817_battery_probe(struct platform_device *pdev)
23152431
rk817_battery_debug_info(battery);
23162432

23172433
rk817_bat_update_info(battery);
2318-
2434+
rk817_bat_output_info(battery);
23192435
battery->bat_monitor_wq = alloc_ordered_workqueue("%s",
23202436
WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk817-bat-monitor-wq");
23212437
INIT_DELAYED_WORK(&battery->bat_delay_work, rk817_battery_work);

0 commit comments

Comments
 (0)