xref: /OK3568_Linux_fs/kernel/drivers/power/supply/ab8500_bmdata.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <linux/export.h>
3*4882a593Smuzhiyun #include <linux/power_supply.h>
4*4882a593Smuzhiyun #include <linux/of.h>
5*4882a593Smuzhiyun #include <linux/mfd/abx500.h>
6*4882a593Smuzhiyun #include <linux/mfd/abx500/ab8500.h>
7*4882a593Smuzhiyun #include <linux/mfd/abx500/ab8500-bm.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /*
10*4882a593Smuzhiyun  * These are the defined batteries that uses a NTC and ID resistor placed
11*4882a593Smuzhiyun  * inside of the battery pack.
12*4882a593Smuzhiyun  * Note that the res_to_temp table must be strictly sorted by falling resistance
13*4882a593Smuzhiyun  * values to work.
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun const struct abx500_res_to_temp ab8500_temp_tbl_a_thermistor[] = {
16*4882a593Smuzhiyun 	{-5, 53407},
17*4882a593Smuzhiyun 	{ 0, 48594},
18*4882a593Smuzhiyun 	{ 5, 43804},
19*4882a593Smuzhiyun 	{10, 39188},
20*4882a593Smuzhiyun 	{15, 34870},
21*4882a593Smuzhiyun 	{20, 30933},
22*4882a593Smuzhiyun 	{25, 27422},
23*4882a593Smuzhiyun 	{30, 24347},
24*4882a593Smuzhiyun 	{35, 21694},
25*4882a593Smuzhiyun 	{40, 19431},
26*4882a593Smuzhiyun 	{45, 17517},
27*4882a593Smuzhiyun 	{50, 15908},
28*4882a593Smuzhiyun 	{55, 14561},
29*4882a593Smuzhiyun 	{60, 13437},
30*4882a593Smuzhiyun 	{65, 12500},
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun EXPORT_SYMBOL(ab8500_temp_tbl_a_thermistor);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun const int ab8500_temp_tbl_a_size = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor);
35*4882a593Smuzhiyun EXPORT_SYMBOL(ab8500_temp_tbl_a_size);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun const struct abx500_res_to_temp ab8500_temp_tbl_b_thermistor[] = {
38*4882a593Smuzhiyun 	{-5, 200000},
39*4882a593Smuzhiyun 	{ 0, 159024},
40*4882a593Smuzhiyun 	{ 5, 151921},
41*4882a593Smuzhiyun 	{10, 144300},
42*4882a593Smuzhiyun 	{15, 136424},
43*4882a593Smuzhiyun 	{20, 128565},
44*4882a593Smuzhiyun 	{25, 120978},
45*4882a593Smuzhiyun 	{30, 113875},
46*4882a593Smuzhiyun 	{35, 107397},
47*4882a593Smuzhiyun 	{40, 101629},
48*4882a593Smuzhiyun 	{45,  96592},
49*4882a593Smuzhiyun 	{50,  92253},
50*4882a593Smuzhiyun 	{55,  88569},
51*4882a593Smuzhiyun 	{60,  85461},
52*4882a593Smuzhiyun 	{65,  82869},
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun EXPORT_SYMBOL(ab8500_temp_tbl_b_thermistor);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun const int ab8500_temp_tbl_b_size = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor);
57*4882a593Smuzhiyun EXPORT_SYMBOL(ab8500_temp_tbl_b_size);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun static const struct abx500_v_to_cap cap_tbl_a_thermistor[] = {
60*4882a593Smuzhiyun 	{4171,	100},
61*4882a593Smuzhiyun 	{4114,	 95},
62*4882a593Smuzhiyun 	{4009,	 83},
63*4882a593Smuzhiyun 	{3947,	 74},
64*4882a593Smuzhiyun 	{3907,	 67},
65*4882a593Smuzhiyun 	{3863,	 59},
66*4882a593Smuzhiyun 	{3830,	 56},
67*4882a593Smuzhiyun 	{3813,	 53},
68*4882a593Smuzhiyun 	{3791,	 46},
69*4882a593Smuzhiyun 	{3771,	 33},
70*4882a593Smuzhiyun 	{3754,	 25},
71*4882a593Smuzhiyun 	{3735,	 20},
72*4882a593Smuzhiyun 	{3717,	 17},
73*4882a593Smuzhiyun 	{3681,	 13},
74*4882a593Smuzhiyun 	{3664,	  8},
75*4882a593Smuzhiyun 	{3651,	  6},
76*4882a593Smuzhiyun 	{3635,	  5},
77*4882a593Smuzhiyun 	{3560,	  3},
78*4882a593Smuzhiyun 	{3408,    1},
79*4882a593Smuzhiyun 	{3247,	  0},
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun static const struct abx500_v_to_cap cap_tbl_b_thermistor[] = {
83*4882a593Smuzhiyun 	{4161,	100},
84*4882a593Smuzhiyun 	{4124,	 98},
85*4882a593Smuzhiyun 	{4044,	 90},
86*4882a593Smuzhiyun 	{4003,	 85},
87*4882a593Smuzhiyun 	{3966,	 80},
88*4882a593Smuzhiyun 	{3933,	 75},
89*4882a593Smuzhiyun 	{3888,	 67},
90*4882a593Smuzhiyun 	{3849,	 60},
91*4882a593Smuzhiyun 	{3813,	 55},
92*4882a593Smuzhiyun 	{3787,	 47},
93*4882a593Smuzhiyun 	{3772,	 30},
94*4882a593Smuzhiyun 	{3751,	 25},
95*4882a593Smuzhiyun 	{3718,	 20},
96*4882a593Smuzhiyun 	{3681,	 16},
97*4882a593Smuzhiyun 	{3660,	 14},
98*4882a593Smuzhiyun 	{3589,	 10},
99*4882a593Smuzhiyun 	{3546,	  7},
100*4882a593Smuzhiyun 	{3495,	  4},
101*4882a593Smuzhiyun 	{3404,	  2},
102*4882a593Smuzhiyun 	{3250,	  0},
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun static const struct abx500_v_to_cap cap_tbl[] = {
106*4882a593Smuzhiyun 	{4186,	100},
107*4882a593Smuzhiyun 	{4163,	 99},
108*4882a593Smuzhiyun 	{4114,	 95},
109*4882a593Smuzhiyun 	{4068,	 90},
110*4882a593Smuzhiyun 	{3990,	 80},
111*4882a593Smuzhiyun 	{3926,	 70},
112*4882a593Smuzhiyun 	{3898,	 65},
113*4882a593Smuzhiyun 	{3866,	 60},
114*4882a593Smuzhiyun 	{3833,	 55},
115*4882a593Smuzhiyun 	{3812,	 50},
116*4882a593Smuzhiyun 	{3787,	 40},
117*4882a593Smuzhiyun 	{3768,	 30},
118*4882a593Smuzhiyun 	{3747,	 25},
119*4882a593Smuzhiyun 	{3730,	 20},
120*4882a593Smuzhiyun 	{3705,	 15},
121*4882a593Smuzhiyun 	{3699,	 14},
122*4882a593Smuzhiyun 	{3684,	 12},
123*4882a593Smuzhiyun 	{3672,	  9},
124*4882a593Smuzhiyun 	{3657,	  7},
125*4882a593Smuzhiyun 	{3638,	  6},
126*4882a593Smuzhiyun 	{3556,	  4},
127*4882a593Smuzhiyun 	{3424,	  2},
128*4882a593Smuzhiyun 	{3317,	  1},
129*4882a593Smuzhiyun 	{3094,	  0},
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /*
133*4882a593Smuzhiyun  * Note that the res_to_temp table must be strictly sorted by falling
134*4882a593Smuzhiyun  * resistance values to work.
135*4882a593Smuzhiyun  */
136*4882a593Smuzhiyun static const struct abx500_res_to_temp temp_tbl[] = {
137*4882a593Smuzhiyun 	{-5, 214834},
138*4882a593Smuzhiyun 	{ 0, 162943},
139*4882a593Smuzhiyun 	{ 5, 124820},
140*4882a593Smuzhiyun 	{10,  96520},
141*4882a593Smuzhiyun 	{15,  75306},
142*4882a593Smuzhiyun 	{20,  59254},
143*4882a593Smuzhiyun 	{25,  47000},
144*4882a593Smuzhiyun 	{30,  37566},
145*4882a593Smuzhiyun 	{35,  30245},
146*4882a593Smuzhiyun 	{40,  24520},
147*4882a593Smuzhiyun 	{45,  20010},
148*4882a593Smuzhiyun 	{50,  16432},
149*4882a593Smuzhiyun 	{55,  13576},
150*4882a593Smuzhiyun 	{60,  11280},
151*4882a593Smuzhiyun 	{65,   9425},
152*4882a593Smuzhiyun };
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /*
155*4882a593Smuzhiyun  * Note that the batres_vs_temp table must be strictly sorted by falling
156*4882a593Smuzhiyun  * temperature values to work.
157*4882a593Smuzhiyun  */
158*4882a593Smuzhiyun static const struct batres_vs_temp temp_to_batres_tbl_thermistor[] = {
159*4882a593Smuzhiyun 	{ 40, 120},
160*4882a593Smuzhiyun 	{ 30, 135},
161*4882a593Smuzhiyun 	{ 20, 165},
162*4882a593Smuzhiyun 	{ 10, 230},
163*4882a593Smuzhiyun 	{ 00, 325},
164*4882a593Smuzhiyun 	{-10, 445},
165*4882a593Smuzhiyun 	{-20, 595},
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /*
169*4882a593Smuzhiyun  * Note that the batres_vs_temp table must be strictly sorted by falling
170*4882a593Smuzhiyun  * temperature values to work.
171*4882a593Smuzhiyun  */
172*4882a593Smuzhiyun static const struct batres_vs_temp temp_to_batres_tbl_ext_thermistor[] = {
173*4882a593Smuzhiyun 	{ 60, 300},
174*4882a593Smuzhiyun 	{ 30, 300},
175*4882a593Smuzhiyun 	{ 20, 300},
176*4882a593Smuzhiyun 	{ 10, 300},
177*4882a593Smuzhiyun 	{ 00, 300},
178*4882a593Smuzhiyun 	{-10, 300},
179*4882a593Smuzhiyun 	{-20, 300},
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun /* battery resistance table for LI ION 9100 battery */
183*4882a593Smuzhiyun static const struct batres_vs_temp temp_to_batres_tbl_9100[] = {
184*4882a593Smuzhiyun 	{ 60, 180},
185*4882a593Smuzhiyun 	{ 30, 180},
186*4882a593Smuzhiyun 	{ 20, 180},
187*4882a593Smuzhiyun 	{ 10, 180},
188*4882a593Smuzhiyun 	{ 00, 180},
189*4882a593Smuzhiyun 	{-10, 180},
190*4882a593Smuzhiyun 	{-20, 180},
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun static struct abx500_battery_type bat_type_thermistor[] = {
194*4882a593Smuzhiyun 	[BATTERY_UNKNOWN] = {
195*4882a593Smuzhiyun 		/* First element always represent the UNKNOWN battery */
196*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
197*4882a593Smuzhiyun 		.resis_high = 0,
198*4882a593Smuzhiyun 		.resis_low = 0,
199*4882a593Smuzhiyun 		.battery_resistance = 300,
200*4882a593Smuzhiyun 		.charge_full_design = 612,
201*4882a593Smuzhiyun 		.nominal_voltage = 3700,
202*4882a593Smuzhiyun 		.termination_vol = 4050,
203*4882a593Smuzhiyun 		.termination_curr = 200,
204*4882a593Smuzhiyun 		.recharge_cap = 95,
205*4882a593Smuzhiyun 		.normal_cur_lvl = 400,
206*4882a593Smuzhiyun 		.normal_vol_lvl = 4100,
207*4882a593Smuzhiyun 		.maint_a_cur_lvl = 400,
208*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4050,
209*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
210*4882a593Smuzhiyun 		.maint_b_cur_lvl = 400,
211*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4000,
212*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
213*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
214*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
215*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
216*4882a593Smuzhiyun 		.r_to_t_tbl = temp_tbl,
217*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
218*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl,
219*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
220*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
221*4882a593Smuzhiyun 	},
222*4882a593Smuzhiyun 	{
223*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_LIPO,
224*4882a593Smuzhiyun 		.resis_high = 53407,
225*4882a593Smuzhiyun 		.resis_low = 12500,
226*4882a593Smuzhiyun 		.battery_resistance = 300,
227*4882a593Smuzhiyun 		.charge_full_design = 900,
228*4882a593Smuzhiyun 		.nominal_voltage = 3600,
229*4882a593Smuzhiyun 		.termination_vol = 4150,
230*4882a593Smuzhiyun 		.termination_curr = 80,
231*4882a593Smuzhiyun 		.recharge_cap = 95,
232*4882a593Smuzhiyun 		.normal_cur_lvl = 700,
233*4882a593Smuzhiyun 		.normal_vol_lvl = 4200,
234*4882a593Smuzhiyun 		.maint_a_cur_lvl = 600,
235*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4150,
236*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
237*4882a593Smuzhiyun 		.maint_b_cur_lvl = 600,
238*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4100,
239*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
240*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
241*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
242*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor),
243*4882a593Smuzhiyun 		.r_to_t_tbl = ab8500_temp_tbl_a_thermistor,
244*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_a_thermistor),
245*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl_a_thermistor,
246*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
247*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	},
250*4882a593Smuzhiyun 	{
251*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_LIPO,
252*4882a593Smuzhiyun 		.resis_high = 200000,
253*4882a593Smuzhiyun 		.resis_low = 82869,
254*4882a593Smuzhiyun 		.battery_resistance = 300,
255*4882a593Smuzhiyun 		.charge_full_design = 900,
256*4882a593Smuzhiyun 		.nominal_voltage = 3600,
257*4882a593Smuzhiyun 		.termination_vol = 4150,
258*4882a593Smuzhiyun 		.termination_curr = 80,
259*4882a593Smuzhiyun 		.recharge_cap = 95,
260*4882a593Smuzhiyun 		.normal_cur_lvl = 700,
261*4882a593Smuzhiyun 		.normal_vol_lvl = 4200,
262*4882a593Smuzhiyun 		.maint_a_cur_lvl = 600,
263*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4150,
264*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
265*4882a593Smuzhiyun 		.maint_b_cur_lvl = 600,
266*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4100,
267*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
268*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
269*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
270*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor),
271*4882a593Smuzhiyun 		.r_to_t_tbl = ab8500_temp_tbl_b_thermistor,
272*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_b_thermistor),
273*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl_b_thermistor,
274*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
275*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
276*4882a593Smuzhiyun 	},
277*4882a593Smuzhiyun };
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun static struct abx500_battery_type bat_type_ext_thermistor[] = {
280*4882a593Smuzhiyun 	[BATTERY_UNKNOWN] = {
281*4882a593Smuzhiyun 		/* First element always represent the UNKNOWN battery */
282*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
283*4882a593Smuzhiyun 		.resis_high = 0,
284*4882a593Smuzhiyun 		.resis_low = 0,
285*4882a593Smuzhiyun 		.battery_resistance = 300,
286*4882a593Smuzhiyun 		.charge_full_design = 612,
287*4882a593Smuzhiyun 		.nominal_voltage = 3700,
288*4882a593Smuzhiyun 		.termination_vol = 4050,
289*4882a593Smuzhiyun 		.termination_curr = 200,
290*4882a593Smuzhiyun 		.recharge_cap = 95,
291*4882a593Smuzhiyun 		.normal_cur_lvl = 400,
292*4882a593Smuzhiyun 		.normal_vol_lvl = 4100,
293*4882a593Smuzhiyun 		.maint_a_cur_lvl = 400,
294*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4050,
295*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
296*4882a593Smuzhiyun 		.maint_b_cur_lvl = 400,
297*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4000,
298*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
299*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
300*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
301*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
302*4882a593Smuzhiyun 		.r_to_t_tbl = temp_tbl,
303*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
304*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl,
305*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
306*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
307*4882a593Smuzhiyun 	},
308*4882a593Smuzhiyun /*
309*4882a593Smuzhiyun  * These are the batteries that doesn't have an internal NTC resistor to measure
310*4882a593Smuzhiyun  * its temperature. The temperature in this case is measure with a NTC placed
311*4882a593Smuzhiyun  * near the battery but on the PCB.
312*4882a593Smuzhiyun  */
313*4882a593Smuzhiyun 	{
314*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_LIPO,
315*4882a593Smuzhiyun 		.resis_high = 76000,
316*4882a593Smuzhiyun 		.resis_low = 53000,
317*4882a593Smuzhiyun 		.battery_resistance = 300,
318*4882a593Smuzhiyun 		.charge_full_design = 900,
319*4882a593Smuzhiyun 		.nominal_voltage = 3700,
320*4882a593Smuzhiyun 		.termination_vol = 4150,
321*4882a593Smuzhiyun 		.termination_curr = 100,
322*4882a593Smuzhiyun 		.recharge_cap = 95,
323*4882a593Smuzhiyun 		.normal_cur_lvl = 700,
324*4882a593Smuzhiyun 		.normal_vol_lvl = 4200,
325*4882a593Smuzhiyun 		.maint_a_cur_lvl = 600,
326*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4150,
327*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
328*4882a593Smuzhiyun 		.maint_b_cur_lvl = 600,
329*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4100,
330*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
331*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
332*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
333*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
334*4882a593Smuzhiyun 		.r_to_t_tbl = temp_tbl,
335*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
336*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl,
337*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
338*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
339*4882a593Smuzhiyun 	},
340*4882a593Smuzhiyun 	{
341*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_LION,
342*4882a593Smuzhiyun 		.resis_high = 30000,
343*4882a593Smuzhiyun 		.resis_low = 10000,
344*4882a593Smuzhiyun 		.battery_resistance = 300,
345*4882a593Smuzhiyun 		.charge_full_design = 950,
346*4882a593Smuzhiyun 		.nominal_voltage = 3700,
347*4882a593Smuzhiyun 		.termination_vol = 4150,
348*4882a593Smuzhiyun 		.termination_curr = 100,
349*4882a593Smuzhiyun 		.recharge_cap = 95,
350*4882a593Smuzhiyun 		.normal_cur_lvl = 700,
351*4882a593Smuzhiyun 		.normal_vol_lvl = 4200,
352*4882a593Smuzhiyun 		.maint_a_cur_lvl = 600,
353*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4150,
354*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
355*4882a593Smuzhiyun 		.maint_b_cur_lvl = 600,
356*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4100,
357*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
358*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
359*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
360*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
361*4882a593Smuzhiyun 		.r_to_t_tbl = temp_tbl,
362*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
363*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl,
364*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
365*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
366*4882a593Smuzhiyun 	},
367*4882a593Smuzhiyun 	{
368*4882a593Smuzhiyun 		.name = POWER_SUPPLY_TECHNOLOGY_LION,
369*4882a593Smuzhiyun 		.resis_high = 95000,
370*4882a593Smuzhiyun 		.resis_low = 76001,
371*4882a593Smuzhiyun 		.battery_resistance = 300,
372*4882a593Smuzhiyun 		.charge_full_design = 950,
373*4882a593Smuzhiyun 		.nominal_voltage = 3700,
374*4882a593Smuzhiyun 		.termination_vol = 4150,
375*4882a593Smuzhiyun 		.termination_curr = 100,
376*4882a593Smuzhiyun 		.recharge_cap = 95,
377*4882a593Smuzhiyun 		.normal_cur_lvl = 700,
378*4882a593Smuzhiyun 		.normal_vol_lvl = 4200,
379*4882a593Smuzhiyun 		.maint_a_cur_lvl = 600,
380*4882a593Smuzhiyun 		.maint_a_vol_lvl = 4150,
381*4882a593Smuzhiyun 		.maint_a_chg_timer_h = 60,
382*4882a593Smuzhiyun 		.maint_b_cur_lvl = 600,
383*4882a593Smuzhiyun 		.maint_b_vol_lvl = 4100,
384*4882a593Smuzhiyun 		.maint_b_chg_timer_h = 200,
385*4882a593Smuzhiyun 		.low_high_cur_lvl = 300,
386*4882a593Smuzhiyun 		.low_high_vol_lvl = 4000,
387*4882a593Smuzhiyun 		.n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
388*4882a593Smuzhiyun 		.r_to_t_tbl = temp_tbl,
389*4882a593Smuzhiyun 		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
390*4882a593Smuzhiyun 		.v_to_cap_tbl = cap_tbl,
391*4882a593Smuzhiyun 		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
392*4882a593Smuzhiyun 		.batres_tbl = temp_to_batres_tbl_thermistor,
393*4882a593Smuzhiyun 	},
394*4882a593Smuzhiyun };
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun static const struct abx500_bm_capacity_levels cap_levels = {
397*4882a593Smuzhiyun 	.critical	= 2,
398*4882a593Smuzhiyun 	.low		= 10,
399*4882a593Smuzhiyun 	.normal		= 70,
400*4882a593Smuzhiyun 	.high		= 95,
401*4882a593Smuzhiyun 	.full		= 100,
402*4882a593Smuzhiyun };
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun static const struct abx500_fg_parameters fg = {
405*4882a593Smuzhiyun 	.recovery_sleep_timer = 10,
406*4882a593Smuzhiyun 	.recovery_total_time = 100,
407*4882a593Smuzhiyun 	.init_timer = 1,
408*4882a593Smuzhiyun 	.init_discard_time = 5,
409*4882a593Smuzhiyun 	.init_total_time = 40,
410*4882a593Smuzhiyun 	.high_curr_time = 60,
411*4882a593Smuzhiyun 	.accu_charging = 30,
412*4882a593Smuzhiyun 	.accu_high_curr = 30,
413*4882a593Smuzhiyun 	.high_curr_threshold = 50,
414*4882a593Smuzhiyun 	.lowbat_threshold = 3100,
415*4882a593Smuzhiyun 	.battok_falling_th_sel0 = 2860,
416*4882a593Smuzhiyun 	.battok_raising_th_sel1 = 2860,
417*4882a593Smuzhiyun 	.maint_thres = 95,
418*4882a593Smuzhiyun 	.user_cap_limit = 15,
419*4882a593Smuzhiyun 	.pcut_enable = 1,
420*4882a593Smuzhiyun 	.pcut_max_time = 127,
421*4882a593Smuzhiyun 	.pcut_flag_time = 112,
422*4882a593Smuzhiyun 	.pcut_max_restart = 15,
423*4882a593Smuzhiyun 	.pcut_debounce_time = 2,
424*4882a593Smuzhiyun };
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun static const struct abx500_maxim_parameters ab8500_maxi_params = {
427*4882a593Smuzhiyun 	.ena_maxi = true,
428*4882a593Smuzhiyun 	.chg_curr = 910,
429*4882a593Smuzhiyun 	.wait_cycles = 10,
430*4882a593Smuzhiyun 	.charger_curr_step = 100,
431*4882a593Smuzhiyun };
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun static const struct abx500_bm_charger_parameters chg = {
434*4882a593Smuzhiyun 	.usb_volt_max		= 5500,
435*4882a593Smuzhiyun 	.usb_curr_max		= 1500,
436*4882a593Smuzhiyun 	.ac_volt_max		= 7500,
437*4882a593Smuzhiyun 	.ac_curr_max		= 1500,
438*4882a593Smuzhiyun };
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun /*
441*4882a593Smuzhiyun  * This array maps the raw hex value to charger output current used by the
442*4882a593Smuzhiyun  * AB8500 values
443*4882a593Smuzhiyun  */
444*4882a593Smuzhiyun static int ab8500_charge_output_curr_map[] = {
445*4882a593Smuzhiyun         100,    200,    300,    400,    500,    600,    700,    800,
446*4882a593Smuzhiyun         900,    1000,   1100,   1200,   1300,   1400,   1500,   1500,
447*4882a593Smuzhiyun };
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun /*
450*4882a593Smuzhiyun  * This array maps the raw hex value to charger input current used by the
451*4882a593Smuzhiyun  * AB8500 values
452*4882a593Smuzhiyun  */
453*4882a593Smuzhiyun static int ab8500_charge_input_curr_map[] = {
454*4882a593Smuzhiyun         50,     98,     193,    290,    380,    450,    500,    600,
455*4882a593Smuzhiyun         700,    800,    900,    1000,   1100,   1300,   1400,   1500,
456*4882a593Smuzhiyun };
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun struct abx500_bm_data ab8500_bm_data = {
459*4882a593Smuzhiyun 	.temp_under             = 3,
460*4882a593Smuzhiyun 	.temp_low               = 8,
461*4882a593Smuzhiyun 	.temp_high              = 43,
462*4882a593Smuzhiyun 	.temp_over              = 48,
463*4882a593Smuzhiyun 	.main_safety_tmr_h      = 4,
464*4882a593Smuzhiyun 	.temp_interval_chg      = 20,
465*4882a593Smuzhiyun 	.temp_interval_nochg    = 120,
466*4882a593Smuzhiyun 	.usb_safety_tmr_h       = 4,
467*4882a593Smuzhiyun 	.bkup_bat_v             = BUP_VCH_SEL_2P6V,
468*4882a593Smuzhiyun 	.bkup_bat_i             = BUP_ICH_SEL_150UA,
469*4882a593Smuzhiyun 	.no_maintenance         = false,
470*4882a593Smuzhiyun 	.capacity_scaling       = false,
471*4882a593Smuzhiyun 	.adc_therm              = ABx500_ADC_THERM_BATCTRL,
472*4882a593Smuzhiyun 	.chg_unknown_bat        = false,
473*4882a593Smuzhiyun 	.enable_overshoot       = false,
474*4882a593Smuzhiyun 	.fg_res                 = 100,
475*4882a593Smuzhiyun 	.cap_levels             = &cap_levels,
476*4882a593Smuzhiyun 	.bat_type               = bat_type_thermistor,
477*4882a593Smuzhiyun 	.n_btypes               = ARRAY_SIZE(bat_type_thermistor),
478*4882a593Smuzhiyun 	.batt_id                = 0,
479*4882a593Smuzhiyun 	.interval_charging      = 5,
480*4882a593Smuzhiyun 	.interval_not_charging  = 120,
481*4882a593Smuzhiyun 	.temp_hysteresis        = 3,
482*4882a593Smuzhiyun 	.gnd_lift_resistance    = 34,
483*4882a593Smuzhiyun 	.chg_output_curr        = ab8500_charge_output_curr_map,
484*4882a593Smuzhiyun 	.n_chg_out_curr         = ARRAY_SIZE(ab8500_charge_output_curr_map),
485*4882a593Smuzhiyun 	.maxi                   = &ab8500_maxi_params,
486*4882a593Smuzhiyun 	.chg_params             = &chg,
487*4882a593Smuzhiyun 	.fg_params              = &fg,
488*4882a593Smuzhiyun         .chg_input_curr         = ab8500_charge_input_curr_map,
489*4882a593Smuzhiyun         .n_chg_in_curr          = ARRAY_SIZE(ab8500_charge_input_curr_map),
490*4882a593Smuzhiyun };
491*4882a593Smuzhiyun 
ab8500_bm_of_probe(struct device * dev,struct device_node * np,struct abx500_bm_data * bm)492*4882a593Smuzhiyun int ab8500_bm_of_probe(struct device *dev,
493*4882a593Smuzhiyun 		       struct device_node *np,
494*4882a593Smuzhiyun 		       struct abx500_bm_data *bm)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun 	const struct batres_vs_temp *tmp_batres_tbl;
497*4882a593Smuzhiyun 	struct device_node *battery_node;
498*4882a593Smuzhiyun 	const char *btech;
499*4882a593Smuzhiyun 	int i;
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	/* get phandle to 'battery-info' node */
502*4882a593Smuzhiyun 	battery_node = of_parse_phandle(np, "battery", 0);
503*4882a593Smuzhiyun 	if (!battery_node) {
504*4882a593Smuzhiyun 		dev_err(dev, "battery node or reference missing\n");
505*4882a593Smuzhiyun 		return -EINVAL;
506*4882a593Smuzhiyun 	}
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 	btech = of_get_property(battery_node, "stericsson,battery-type", NULL);
509*4882a593Smuzhiyun 	if (!btech) {
510*4882a593Smuzhiyun 		dev_warn(dev, "missing property battery-name/type\n");
511*4882a593Smuzhiyun 		of_node_put(battery_node);
512*4882a593Smuzhiyun 		return -EINVAL;
513*4882a593Smuzhiyun 	}
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	if (strncmp(btech, "LION", 4) == 0) {
516*4882a593Smuzhiyun 		bm->no_maintenance  = true;
517*4882a593Smuzhiyun 		bm->chg_unknown_bat = true;
518*4882a593Smuzhiyun 		bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
519*4882a593Smuzhiyun 		bm->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
520*4882a593Smuzhiyun 		bm->bat_type[BATTERY_UNKNOWN].recharge_cap       = 95;
521*4882a593Smuzhiyun 		bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl     = 520;
522*4882a593Smuzhiyun 		bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl     = 4200;
523*4882a593Smuzhiyun 	}
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	if (of_property_read_bool(battery_node, "thermistor-on-batctrl")) {
526*4882a593Smuzhiyun 		if (strncmp(btech, "LION", 4) == 0)
527*4882a593Smuzhiyun 			tmp_batres_tbl = temp_to_batres_tbl_9100;
528*4882a593Smuzhiyun 		else
529*4882a593Smuzhiyun 			tmp_batres_tbl = temp_to_batres_tbl_thermistor;
530*4882a593Smuzhiyun 	} else {
531*4882a593Smuzhiyun 		bm->n_btypes   = 4;
532*4882a593Smuzhiyun 		bm->bat_type   = bat_type_ext_thermistor;
533*4882a593Smuzhiyun 		bm->adc_therm  = ABx500_ADC_THERM_BATTEMP;
534*4882a593Smuzhiyun 		tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor;
535*4882a593Smuzhiyun 	}
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	/* select the battery resolution table */
538*4882a593Smuzhiyun 	for (i = 0; i < bm->n_btypes; ++i)
539*4882a593Smuzhiyun 		bm->bat_type[i].batres_tbl = tmp_batres_tbl;
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun 	of_node_put(battery_node);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	return 0;
544*4882a593Smuzhiyun }
545