3737#include <linux/wakelock.h>
3838#include <linux/workqueue.h>
3939
40- static int dbg_enable ;
40+ static int dbg_enable = 1 ;
4141
4242module_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 }
14501475finish :
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
19201943static 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
21532232static 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
21572250static 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