18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/export.h> 38c2ecf20Sopenharmony_ci#include <linux/power_supply.h> 48c2ecf20Sopenharmony_ci#include <linux/of.h> 58c2ecf20Sopenharmony_ci#include <linux/mfd/abx500.h> 68c2ecf20Sopenharmony_ci#include <linux/mfd/abx500/ab8500.h> 78c2ecf20Sopenharmony_ci#include <linux/mfd/abx500/ab8500-bm.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* 108c2ecf20Sopenharmony_ci * These are the defined batteries that uses a NTC and ID resistor placed 118c2ecf20Sopenharmony_ci * inside of the battery pack. 128c2ecf20Sopenharmony_ci * Note that the res_to_temp table must be strictly sorted by falling resistance 138c2ecf20Sopenharmony_ci * values to work. 148c2ecf20Sopenharmony_ci */ 158c2ecf20Sopenharmony_ciconst struct abx500_res_to_temp ab8500_temp_tbl_a_thermistor[] = { 168c2ecf20Sopenharmony_ci {-5, 53407}, 178c2ecf20Sopenharmony_ci { 0, 48594}, 188c2ecf20Sopenharmony_ci { 5, 43804}, 198c2ecf20Sopenharmony_ci {10, 39188}, 208c2ecf20Sopenharmony_ci {15, 34870}, 218c2ecf20Sopenharmony_ci {20, 30933}, 228c2ecf20Sopenharmony_ci {25, 27422}, 238c2ecf20Sopenharmony_ci {30, 24347}, 248c2ecf20Sopenharmony_ci {35, 21694}, 258c2ecf20Sopenharmony_ci {40, 19431}, 268c2ecf20Sopenharmony_ci {45, 17517}, 278c2ecf20Sopenharmony_ci {50, 15908}, 288c2ecf20Sopenharmony_ci {55, 14561}, 298c2ecf20Sopenharmony_ci {60, 13437}, 308c2ecf20Sopenharmony_ci {65, 12500}, 318c2ecf20Sopenharmony_ci}; 328c2ecf20Sopenharmony_ciEXPORT_SYMBOL(ab8500_temp_tbl_a_thermistor); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ciconst int ab8500_temp_tbl_a_size = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor); 358c2ecf20Sopenharmony_ciEXPORT_SYMBOL(ab8500_temp_tbl_a_size); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ciconst struct abx500_res_to_temp ab8500_temp_tbl_b_thermistor[] = { 388c2ecf20Sopenharmony_ci {-5, 200000}, 398c2ecf20Sopenharmony_ci { 0, 159024}, 408c2ecf20Sopenharmony_ci { 5, 151921}, 418c2ecf20Sopenharmony_ci {10, 144300}, 428c2ecf20Sopenharmony_ci {15, 136424}, 438c2ecf20Sopenharmony_ci {20, 128565}, 448c2ecf20Sopenharmony_ci {25, 120978}, 458c2ecf20Sopenharmony_ci {30, 113875}, 468c2ecf20Sopenharmony_ci {35, 107397}, 478c2ecf20Sopenharmony_ci {40, 101629}, 488c2ecf20Sopenharmony_ci {45, 96592}, 498c2ecf20Sopenharmony_ci {50, 92253}, 508c2ecf20Sopenharmony_ci {55, 88569}, 518c2ecf20Sopenharmony_ci {60, 85461}, 528c2ecf20Sopenharmony_ci {65, 82869}, 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ciEXPORT_SYMBOL(ab8500_temp_tbl_b_thermistor); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ciconst int ab8500_temp_tbl_b_size = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor); 578c2ecf20Sopenharmony_ciEXPORT_SYMBOL(ab8500_temp_tbl_b_size); 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic const struct abx500_v_to_cap cap_tbl_a_thermistor[] = { 608c2ecf20Sopenharmony_ci {4171, 100}, 618c2ecf20Sopenharmony_ci {4114, 95}, 628c2ecf20Sopenharmony_ci {4009, 83}, 638c2ecf20Sopenharmony_ci {3947, 74}, 648c2ecf20Sopenharmony_ci {3907, 67}, 658c2ecf20Sopenharmony_ci {3863, 59}, 668c2ecf20Sopenharmony_ci {3830, 56}, 678c2ecf20Sopenharmony_ci {3813, 53}, 688c2ecf20Sopenharmony_ci {3791, 46}, 698c2ecf20Sopenharmony_ci {3771, 33}, 708c2ecf20Sopenharmony_ci {3754, 25}, 718c2ecf20Sopenharmony_ci {3735, 20}, 728c2ecf20Sopenharmony_ci {3717, 17}, 738c2ecf20Sopenharmony_ci {3681, 13}, 748c2ecf20Sopenharmony_ci {3664, 8}, 758c2ecf20Sopenharmony_ci {3651, 6}, 768c2ecf20Sopenharmony_ci {3635, 5}, 778c2ecf20Sopenharmony_ci {3560, 3}, 788c2ecf20Sopenharmony_ci {3408, 1}, 798c2ecf20Sopenharmony_ci {3247, 0}, 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_cistatic const struct abx500_v_to_cap cap_tbl_b_thermistor[] = { 838c2ecf20Sopenharmony_ci {4161, 100}, 848c2ecf20Sopenharmony_ci {4124, 98}, 858c2ecf20Sopenharmony_ci {4044, 90}, 868c2ecf20Sopenharmony_ci {4003, 85}, 878c2ecf20Sopenharmony_ci {3966, 80}, 888c2ecf20Sopenharmony_ci {3933, 75}, 898c2ecf20Sopenharmony_ci {3888, 67}, 908c2ecf20Sopenharmony_ci {3849, 60}, 918c2ecf20Sopenharmony_ci {3813, 55}, 928c2ecf20Sopenharmony_ci {3787, 47}, 938c2ecf20Sopenharmony_ci {3772, 30}, 948c2ecf20Sopenharmony_ci {3751, 25}, 958c2ecf20Sopenharmony_ci {3718, 20}, 968c2ecf20Sopenharmony_ci {3681, 16}, 978c2ecf20Sopenharmony_ci {3660, 14}, 988c2ecf20Sopenharmony_ci {3589, 10}, 998c2ecf20Sopenharmony_ci {3546, 7}, 1008c2ecf20Sopenharmony_ci {3495, 4}, 1018c2ecf20Sopenharmony_ci {3404, 2}, 1028c2ecf20Sopenharmony_ci {3250, 0}, 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistatic const struct abx500_v_to_cap cap_tbl[] = { 1068c2ecf20Sopenharmony_ci {4186, 100}, 1078c2ecf20Sopenharmony_ci {4163, 99}, 1088c2ecf20Sopenharmony_ci {4114, 95}, 1098c2ecf20Sopenharmony_ci {4068, 90}, 1108c2ecf20Sopenharmony_ci {3990, 80}, 1118c2ecf20Sopenharmony_ci {3926, 70}, 1128c2ecf20Sopenharmony_ci {3898, 65}, 1138c2ecf20Sopenharmony_ci {3866, 60}, 1148c2ecf20Sopenharmony_ci {3833, 55}, 1158c2ecf20Sopenharmony_ci {3812, 50}, 1168c2ecf20Sopenharmony_ci {3787, 40}, 1178c2ecf20Sopenharmony_ci {3768, 30}, 1188c2ecf20Sopenharmony_ci {3747, 25}, 1198c2ecf20Sopenharmony_ci {3730, 20}, 1208c2ecf20Sopenharmony_ci {3705, 15}, 1218c2ecf20Sopenharmony_ci {3699, 14}, 1228c2ecf20Sopenharmony_ci {3684, 12}, 1238c2ecf20Sopenharmony_ci {3672, 9}, 1248c2ecf20Sopenharmony_ci {3657, 7}, 1258c2ecf20Sopenharmony_ci {3638, 6}, 1268c2ecf20Sopenharmony_ci {3556, 4}, 1278c2ecf20Sopenharmony_ci {3424, 2}, 1288c2ecf20Sopenharmony_ci {3317, 1}, 1298c2ecf20Sopenharmony_ci {3094, 0}, 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci/* 1338c2ecf20Sopenharmony_ci * Note that the res_to_temp table must be strictly sorted by falling 1348c2ecf20Sopenharmony_ci * resistance values to work. 1358c2ecf20Sopenharmony_ci */ 1368c2ecf20Sopenharmony_cistatic const struct abx500_res_to_temp temp_tbl[] = { 1378c2ecf20Sopenharmony_ci {-5, 214834}, 1388c2ecf20Sopenharmony_ci { 0, 162943}, 1398c2ecf20Sopenharmony_ci { 5, 124820}, 1408c2ecf20Sopenharmony_ci {10, 96520}, 1418c2ecf20Sopenharmony_ci {15, 75306}, 1428c2ecf20Sopenharmony_ci {20, 59254}, 1438c2ecf20Sopenharmony_ci {25, 47000}, 1448c2ecf20Sopenharmony_ci {30, 37566}, 1458c2ecf20Sopenharmony_ci {35, 30245}, 1468c2ecf20Sopenharmony_ci {40, 24520}, 1478c2ecf20Sopenharmony_ci {45, 20010}, 1488c2ecf20Sopenharmony_ci {50, 16432}, 1498c2ecf20Sopenharmony_ci {55, 13576}, 1508c2ecf20Sopenharmony_ci {60, 11280}, 1518c2ecf20Sopenharmony_ci {65, 9425}, 1528c2ecf20Sopenharmony_ci}; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci/* 1558c2ecf20Sopenharmony_ci * Note that the batres_vs_temp table must be strictly sorted by falling 1568c2ecf20Sopenharmony_ci * temperature values to work. 1578c2ecf20Sopenharmony_ci */ 1588c2ecf20Sopenharmony_cistatic const struct batres_vs_temp temp_to_batres_tbl_thermistor[] = { 1598c2ecf20Sopenharmony_ci { 40, 120}, 1608c2ecf20Sopenharmony_ci { 30, 135}, 1618c2ecf20Sopenharmony_ci { 20, 165}, 1628c2ecf20Sopenharmony_ci { 10, 230}, 1638c2ecf20Sopenharmony_ci { 00, 325}, 1648c2ecf20Sopenharmony_ci {-10, 445}, 1658c2ecf20Sopenharmony_ci {-20, 595}, 1668c2ecf20Sopenharmony_ci}; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci/* 1698c2ecf20Sopenharmony_ci * Note that the batres_vs_temp table must be strictly sorted by falling 1708c2ecf20Sopenharmony_ci * temperature values to work. 1718c2ecf20Sopenharmony_ci */ 1728c2ecf20Sopenharmony_cistatic const struct batres_vs_temp temp_to_batres_tbl_ext_thermistor[] = { 1738c2ecf20Sopenharmony_ci { 60, 300}, 1748c2ecf20Sopenharmony_ci { 30, 300}, 1758c2ecf20Sopenharmony_ci { 20, 300}, 1768c2ecf20Sopenharmony_ci { 10, 300}, 1778c2ecf20Sopenharmony_ci { 00, 300}, 1788c2ecf20Sopenharmony_ci {-10, 300}, 1798c2ecf20Sopenharmony_ci {-20, 300}, 1808c2ecf20Sopenharmony_ci}; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci/* battery resistance table for LI ION 9100 battery */ 1838c2ecf20Sopenharmony_cistatic const struct batres_vs_temp temp_to_batres_tbl_9100[] = { 1848c2ecf20Sopenharmony_ci { 60, 180}, 1858c2ecf20Sopenharmony_ci { 30, 180}, 1868c2ecf20Sopenharmony_ci { 20, 180}, 1878c2ecf20Sopenharmony_ci { 10, 180}, 1888c2ecf20Sopenharmony_ci { 00, 180}, 1898c2ecf20Sopenharmony_ci {-10, 180}, 1908c2ecf20Sopenharmony_ci {-20, 180}, 1918c2ecf20Sopenharmony_ci}; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_cistatic struct abx500_battery_type bat_type_thermistor[] = { 1948c2ecf20Sopenharmony_ci [BATTERY_UNKNOWN] = { 1958c2ecf20Sopenharmony_ci /* First element always represent the UNKNOWN battery */ 1968c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN, 1978c2ecf20Sopenharmony_ci .resis_high = 0, 1988c2ecf20Sopenharmony_ci .resis_low = 0, 1998c2ecf20Sopenharmony_ci .battery_resistance = 300, 2008c2ecf20Sopenharmony_ci .charge_full_design = 612, 2018c2ecf20Sopenharmony_ci .nominal_voltage = 3700, 2028c2ecf20Sopenharmony_ci .termination_vol = 4050, 2038c2ecf20Sopenharmony_ci .termination_curr = 200, 2048c2ecf20Sopenharmony_ci .recharge_cap = 95, 2058c2ecf20Sopenharmony_ci .normal_cur_lvl = 400, 2068c2ecf20Sopenharmony_ci .normal_vol_lvl = 4100, 2078c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 400, 2088c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4050, 2098c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 2108c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 400, 2118c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4000, 2128c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 2138c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 2148c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 2158c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl), 2168c2ecf20Sopenharmony_ci .r_to_t_tbl = temp_tbl, 2178c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl), 2188c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl, 2198c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 2208c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 2218c2ecf20Sopenharmony_ci }, 2228c2ecf20Sopenharmony_ci { 2238c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_LIPO, 2248c2ecf20Sopenharmony_ci .resis_high = 53407, 2258c2ecf20Sopenharmony_ci .resis_low = 12500, 2268c2ecf20Sopenharmony_ci .battery_resistance = 300, 2278c2ecf20Sopenharmony_ci .charge_full_design = 900, 2288c2ecf20Sopenharmony_ci .nominal_voltage = 3600, 2298c2ecf20Sopenharmony_ci .termination_vol = 4150, 2308c2ecf20Sopenharmony_ci .termination_curr = 80, 2318c2ecf20Sopenharmony_ci .recharge_cap = 95, 2328c2ecf20Sopenharmony_ci .normal_cur_lvl = 700, 2338c2ecf20Sopenharmony_ci .normal_vol_lvl = 4200, 2348c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 600, 2358c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4150, 2368c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 2378c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 600, 2388c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4100, 2398c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 2408c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 2418c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 2428c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor), 2438c2ecf20Sopenharmony_ci .r_to_t_tbl = ab8500_temp_tbl_a_thermistor, 2448c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_a_thermistor), 2458c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl_a_thermistor, 2468c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 2478c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci }, 2508c2ecf20Sopenharmony_ci { 2518c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_LIPO, 2528c2ecf20Sopenharmony_ci .resis_high = 200000, 2538c2ecf20Sopenharmony_ci .resis_low = 82869, 2548c2ecf20Sopenharmony_ci .battery_resistance = 300, 2558c2ecf20Sopenharmony_ci .charge_full_design = 900, 2568c2ecf20Sopenharmony_ci .nominal_voltage = 3600, 2578c2ecf20Sopenharmony_ci .termination_vol = 4150, 2588c2ecf20Sopenharmony_ci .termination_curr = 80, 2598c2ecf20Sopenharmony_ci .recharge_cap = 95, 2608c2ecf20Sopenharmony_ci .normal_cur_lvl = 700, 2618c2ecf20Sopenharmony_ci .normal_vol_lvl = 4200, 2628c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 600, 2638c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4150, 2648c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 2658c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 600, 2668c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4100, 2678c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 2688c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 2698c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 2708c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor), 2718c2ecf20Sopenharmony_ci .r_to_t_tbl = ab8500_temp_tbl_b_thermistor, 2728c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_b_thermistor), 2738c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl_b_thermistor, 2748c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 2758c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 2768c2ecf20Sopenharmony_ci }, 2778c2ecf20Sopenharmony_ci}; 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_cistatic struct abx500_battery_type bat_type_ext_thermistor[] = { 2808c2ecf20Sopenharmony_ci [BATTERY_UNKNOWN] = { 2818c2ecf20Sopenharmony_ci /* First element always represent the UNKNOWN battery */ 2828c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN, 2838c2ecf20Sopenharmony_ci .resis_high = 0, 2848c2ecf20Sopenharmony_ci .resis_low = 0, 2858c2ecf20Sopenharmony_ci .battery_resistance = 300, 2868c2ecf20Sopenharmony_ci .charge_full_design = 612, 2878c2ecf20Sopenharmony_ci .nominal_voltage = 3700, 2888c2ecf20Sopenharmony_ci .termination_vol = 4050, 2898c2ecf20Sopenharmony_ci .termination_curr = 200, 2908c2ecf20Sopenharmony_ci .recharge_cap = 95, 2918c2ecf20Sopenharmony_ci .normal_cur_lvl = 400, 2928c2ecf20Sopenharmony_ci .normal_vol_lvl = 4100, 2938c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 400, 2948c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4050, 2958c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 2968c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 400, 2978c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4000, 2988c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 2998c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 3008c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 3018c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl), 3028c2ecf20Sopenharmony_ci .r_to_t_tbl = temp_tbl, 3038c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl), 3048c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl, 3058c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 3068c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 3078c2ecf20Sopenharmony_ci }, 3088c2ecf20Sopenharmony_ci/* 3098c2ecf20Sopenharmony_ci * These are the batteries that doesn't have an internal NTC resistor to measure 3108c2ecf20Sopenharmony_ci * its temperature. The temperature in this case is measure with a NTC placed 3118c2ecf20Sopenharmony_ci * near the battery but on the PCB. 3128c2ecf20Sopenharmony_ci */ 3138c2ecf20Sopenharmony_ci { 3148c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_LIPO, 3158c2ecf20Sopenharmony_ci .resis_high = 76000, 3168c2ecf20Sopenharmony_ci .resis_low = 53000, 3178c2ecf20Sopenharmony_ci .battery_resistance = 300, 3188c2ecf20Sopenharmony_ci .charge_full_design = 900, 3198c2ecf20Sopenharmony_ci .nominal_voltage = 3700, 3208c2ecf20Sopenharmony_ci .termination_vol = 4150, 3218c2ecf20Sopenharmony_ci .termination_curr = 100, 3228c2ecf20Sopenharmony_ci .recharge_cap = 95, 3238c2ecf20Sopenharmony_ci .normal_cur_lvl = 700, 3248c2ecf20Sopenharmony_ci .normal_vol_lvl = 4200, 3258c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 600, 3268c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4150, 3278c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 3288c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 600, 3298c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4100, 3308c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 3318c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 3328c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 3338c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl), 3348c2ecf20Sopenharmony_ci .r_to_t_tbl = temp_tbl, 3358c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl), 3368c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl, 3378c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 3388c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 3398c2ecf20Sopenharmony_ci }, 3408c2ecf20Sopenharmony_ci { 3418c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_LION, 3428c2ecf20Sopenharmony_ci .resis_high = 30000, 3438c2ecf20Sopenharmony_ci .resis_low = 10000, 3448c2ecf20Sopenharmony_ci .battery_resistance = 300, 3458c2ecf20Sopenharmony_ci .charge_full_design = 950, 3468c2ecf20Sopenharmony_ci .nominal_voltage = 3700, 3478c2ecf20Sopenharmony_ci .termination_vol = 4150, 3488c2ecf20Sopenharmony_ci .termination_curr = 100, 3498c2ecf20Sopenharmony_ci .recharge_cap = 95, 3508c2ecf20Sopenharmony_ci .normal_cur_lvl = 700, 3518c2ecf20Sopenharmony_ci .normal_vol_lvl = 4200, 3528c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 600, 3538c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4150, 3548c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 3558c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 600, 3568c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4100, 3578c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 3588c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 3598c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 3608c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl), 3618c2ecf20Sopenharmony_ci .r_to_t_tbl = temp_tbl, 3628c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl), 3638c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl, 3648c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 3658c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 3668c2ecf20Sopenharmony_ci }, 3678c2ecf20Sopenharmony_ci { 3688c2ecf20Sopenharmony_ci .name = POWER_SUPPLY_TECHNOLOGY_LION, 3698c2ecf20Sopenharmony_ci .resis_high = 95000, 3708c2ecf20Sopenharmony_ci .resis_low = 76001, 3718c2ecf20Sopenharmony_ci .battery_resistance = 300, 3728c2ecf20Sopenharmony_ci .charge_full_design = 950, 3738c2ecf20Sopenharmony_ci .nominal_voltage = 3700, 3748c2ecf20Sopenharmony_ci .termination_vol = 4150, 3758c2ecf20Sopenharmony_ci .termination_curr = 100, 3768c2ecf20Sopenharmony_ci .recharge_cap = 95, 3778c2ecf20Sopenharmony_ci .normal_cur_lvl = 700, 3788c2ecf20Sopenharmony_ci .normal_vol_lvl = 4200, 3798c2ecf20Sopenharmony_ci .maint_a_cur_lvl = 600, 3808c2ecf20Sopenharmony_ci .maint_a_vol_lvl = 4150, 3818c2ecf20Sopenharmony_ci .maint_a_chg_timer_h = 60, 3828c2ecf20Sopenharmony_ci .maint_b_cur_lvl = 600, 3838c2ecf20Sopenharmony_ci .maint_b_vol_lvl = 4100, 3848c2ecf20Sopenharmony_ci .maint_b_chg_timer_h = 200, 3858c2ecf20Sopenharmony_ci .low_high_cur_lvl = 300, 3868c2ecf20Sopenharmony_ci .low_high_vol_lvl = 4000, 3878c2ecf20Sopenharmony_ci .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl), 3888c2ecf20Sopenharmony_ci .r_to_t_tbl = temp_tbl, 3898c2ecf20Sopenharmony_ci .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl), 3908c2ecf20Sopenharmony_ci .v_to_cap_tbl = cap_tbl, 3918c2ecf20Sopenharmony_ci .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor), 3928c2ecf20Sopenharmony_ci .batres_tbl = temp_to_batres_tbl_thermistor, 3938c2ecf20Sopenharmony_ci }, 3948c2ecf20Sopenharmony_ci}; 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_cistatic const struct abx500_bm_capacity_levels cap_levels = { 3978c2ecf20Sopenharmony_ci .critical = 2, 3988c2ecf20Sopenharmony_ci .low = 10, 3998c2ecf20Sopenharmony_ci .normal = 70, 4008c2ecf20Sopenharmony_ci .high = 95, 4018c2ecf20Sopenharmony_ci .full = 100, 4028c2ecf20Sopenharmony_ci}; 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_cistatic const struct abx500_fg_parameters fg = { 4058c2ecf20Sopenharmony_ci .recovery_sleep_timer = 10, 4068c2ecf20Sopenharmony_ci .recovery_total_time = 100, 4078c2ecf20Sopenharmony_ci .init_timer = 1, 4088c2ecf20Sopenharmony_ci .init_discard_time = 5, 4098c2ecf20Sopenharmony_ci .init_total_time = 40, 4108c2ecf20Sopenharmony_ci .high_curr_time = 60, 4118c2ecf20Sopenharmony_ci .accu_charging = 30, 4128c2ecf20Sopenharmony_ci .accu_high_curr = 30, 4138c2ecf20Sopenharmony_ci .high_curr_threshold = 50, 4148c2ecf20Sopenharmony_ci .lowbat_threshold = 3100, 4158c2ecf20Sopenharmony_ci .battok_falling_th_sel0 = 2860, 4168c2ecf20Sopenharmony_ci .battok_raising_th_sel1 = 2860, 4178c2ecf20Sopenharmony_ci .maint_thres = 95, 4188c2ecf20Sopenharmony_ci .user_cap_limit = 15, 4198c2ecf20Sopenharmony_ci .pcut_enable = 1, 4208c2ecf20Sopenharmony_ci .pcut_max_time = 127, 4218c2ecf20Sopenharmony_ci .pcut_flag_time = 112, 4228c2ecf20Sopenharmony_ci .pcut_max_restart = 15, 4238c2ecf20Sopenharmony_ci .pcut_debounce_time = 2, 4248c2ecf20Sopenharmony_ci}; 4258c2ecf20Sopenharmony_ci 4268c2ecf20Sopenharmony_cistatic const struct abx500_maxim_parameters ab8500_maxi_params = { 4278c2ecf20Sopenharmony_ci .ena_maxi = true, 4288c2ecf20Sopenharmony_ci .chg_curr = 910, 4298c2ecf20Sopenharmony_ci .wait_cycles = 10, 4308c2ecf20Sopenharmony_ci .charger_curr_step = 100, 4318c2ecf20Sopenharmony_ci}; 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_cistatic const struct abx500_bm_charger_parameters chg = { 4348c2ecf20Sopenharmony_ci .usb_volt_max = 5500, 4358c2ecf20Sopenharmony_ci .usb_curr_max = 1500, 4368c2ecf20Sopenharmony_ci .ac_volt_max = 7500, 4378c2ecf20Sopenharmony_ci .ac_curr_max = 1500, 4388c2ecf20Sopenharmony_ci}; 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_ci/* 4418c2ecf20Sopenharmony_ci * This array maps the raw hex value to charger output current used by the 4428c2ecf20Sopenharmony_ci * AB8500 values 4438c2ecf20Sopenharmony_ci */ 4448c2ecf20Sopenharmony_cistatic int ab8500_charge_output_curr_map[] = { 4458c2ecf20Sopenharmony_ci 100, 200, 300, 400, 500, 600, 700, 800, 4468c2ecf20Sopenharmony_ci 900, 1000, 1100, 1200, 1300, 1400, 1500, 1500, 4478c2ecf20Sopenharmony_ci}; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci/* 4508c2ecf20Sopenharmony_ci * This array maps the raw hex value to charger input current used by the 4518c2ecf20Sopenharmony_ci * AB8500 values 4528c2ecf20Sopenharmony_ci */ 4538c2ecf20Sopenharmony_cistatic int ab8500_charge_input_curr_map[] = { 4548c2ecf20Sopenharmony_ci 50, 98, 193, 290, 380, 450, 500, 600, 4558c2ecf20Sopenharmony_ci 700, 800, 900, 1000, 1100, 1300, 1400, 1500, 4568c2ecf20Sopenharmony_ci}; 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_cistruct abx500_bm_data ab8500_bm_data = { 4598c2ecf20Sopenharmony_ci .temp_under = 3, 4608c2ecf20Sopenharmony_ci .temp_low = 8, 4618c2ecf20Sopenharmony_ci .temp_high = 43, 4628c2ecf20Sopenharmony_ci .temp_over = 48, 4638c2ecf20Sopenharmony_ci .main_safety_tmr_h = 4, 4648c2ecf20Sopenharmony_ci .temp_interval_chg = 20, 4658c2ecf20Sopenharmony_ci .temp_interval_nochg = 120, 4668c2ecf20Sopenharmony_ci .usb_safety_tmr_h = 4, 4678c2ecf20Sopenharmony_ci .bkup_bat_v = BUP_VCH_SEL_2P6V, 4688c2ecf20Sopenharmony_ci .bkup_bat_i = BUP_ICH_SEL_150UA, 4698c2ecf20Sopenharmony_ci .no_maintenance = false, 4708c2ecf20Sopenharmony_ci .capacity_scaling = false, 4718c2ecf20Sopenharmony_ci .adc_therm = ABx500_ADC_THERM_BATCTRL, 4728c2ecf20Sopenharmony_ci .chg_unknown_bat = false, 4738c2ecf20Sopenharmony_ci .enable_overshoot = false, 4748c2ecf20Sopenharmony_ci .fg_res = 100, 4758c2ecf20Sopenharmony_ci .cap_levels = &cap_levels, 4768c2ecf20Sopenharmony_ci .bat_type = bat_type_thermistor, 4778c2ecf20Sopenharmony_ci .n_btypes = ARRAY_SIZE(bat_type_thermistor), 4788c2ecf20Sopenharmony_ci .batt_id = 0, 4798c2ecf20Sopenharmony_ci .interval_charging = 5, 4808c2ecf20Sopenharmony_ci .interval_not_charging = 120, 4818c2ecf20Sopenharmony_ci .temp_hysteresis = 3, 4828c2ecf20Sopenharmony_ci .gnd_lift_resistance = 34, 4838c2ecf20Sopenharmony_ci .chg_output_curr = ab8500_charge_output_curr_map, 4848c2ecf20Sopenharmony_ci .n_chg_out_curr = ARRAY_SIZE(ab8500_charge_output_curr_map), 4858c2ecf20Sopenharmony_ci .maxi = &ab8500_maxi_params, 4868c2ecf20Sopenharmony_ci .chg_params = &chg, 4878c2ecf20Sopenharmony_ci .fg_params = &fg, 4888c2ecf20Sopenharmony_ci .chg_input_curr = ab8500_charge_input_curr_map, 4898c2ecf20Sopenharmony_ci .n_chg_in_curr = ARRAY_SIZE(ab8500_charge_input_curr_map), 4908c2ecf20Sopenharmony_ci}; 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_ciint ab8500_bm_of_probe(struct device *dev, 4938c2ecf20Sopenharmony_ci struct device_node *np, 4948c2ecf20Sopenharmony_ci struct abx500_bm_data *bm) 4958c2ecf20Sopenharmony_ci{ 4968c2ecf20Sopenharmony_ci const struct batres_vs_temp *tmp_batres_tbl; 4978c2ecf20Sopenharmony_ci struct device_node *battery_node; 4988c2ecf20Sopenharmony_ci const char *btech; 4998c2ecf20Sopenharmony_ci int i; 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_ci /* get phandle to 'battery-info' node */ 5028c2ecf20Sopenharmony_ci battery_node = of_parse_phandle(np, "battery", 0); 5038c2ecf20Sopenharmony_ci if (!battery_node) { 5048c2ecf20Sopenharmony_ci dev_err(dev, "battery node or reference missing\n"); 5058c2ecf20Sopenharmony_ci return -EINVAL; 5068c2ecf20Sopenharmony_ci } 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci btech = of_get_property(battery_node, "stericsson,battery-type", NULL); 5098c2ecf20Sopenharmony_ci if (!btech) { 5108c2ecf20Sopenharmony_ci dev_warn(dev, "missing property battery-name/type\n"); 5118c2ecf20Sopenharmony_ci of_node_put(battery_node); 5128c2ecf20Sopenharmony_ci return -EINVAL; 5138c2ecf20Sopenharmony_ci } 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_ci if (strncmp(btech, "LION", 4) == 0) { 5168c2ecf20Sopenharmony_ci bm->no_maintenance = true; 5178c2ecf20Sopenharmony_ci bm->chg_unknown_bat = true; 5188c2ecf20Sopenharmony_ci bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600; 5198c2ecf20Sopenharmony_ci bm->bat_type[BATTERY_UNKNOWN].termination_vol = 4150; 5208c2ecf20Sopenharmony_ci bm->bat_type[BATTERY_UNKNOWN].recharge_cap = 95; 5218c2ecf20Sopenharmony_ci bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl = 520; 5228c2ecf20Sopenharmony_ci bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl = 4200; 5238c2ecf20Sopenharmony_ci } 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci if (of_property_read_bool(battery_node, "thermistor-on-batctrl")) { 5268c2ecf20Sopenharmony_ci if (strncmp(btech, "LION", 4) == 0) 5278c2ecf20Sopenharmony_ci tmp_batres_tbl = temp_to_batres_tbl_9100; 5288c2ecf20Sopenharmony_ci else 5298c2ecf20Sopenharmony_ci tmp_batres_tbl = temp_to_batres_tbl_thermistor; 5308c2ecf20Sopenharmony_ci } else { 5318c2ecf20Sopenharmony_ci bm->n_btypes = 4; 5328c2ecf20Sopenharmony_ci bm->bat_type = bat_type_ext_thermistor; 5338c2ecf20Sopenharmony_ci bm->adc_therm = ABx500_ADC_THERM_BATTEMP; 5348c2ecf20Sopenharmony_ci tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor; 5358c2ecf20Sopenharmony_ci } 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_ci /* select the battery resolution table */ 5388c2ecf20Sopenharmony_ci for (i = 0; i < bm->n_btypes; ++i) 5398c2ecf20Sopenharmony_ci bm->bat_type[i].batres_tbl = tmp_batres_tbl; 5408c2ecf20Sopenharmony_ci 5418c2ecf20Sopenharmony_ci of_node_put(battery_node); 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_ci return 0; 5448c2ecf20Sopenharmony_ci} 545