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