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