blob: bfc1245d79123bc2964b104d37b0854460cfc162 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -08002#include <linux/export.h>
3#include <linux/power_supply.h>
4#include <linux/of.h>
Linus Walleij417c0fc2021-03-12 09:36:02 +01005
6#include "ab8500-bm.h"
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -08007
8/*
9 * These are the defined batteries that uses a NTC and ID resistor placed
10 * inside of the battery pack.
11 * Note that the res_to_temp table must be strictly sorted by falling resistance
12 * values to work.
13 */
Linus Walleij484a9cc2021-07-13 17:27:07 +020014const struct ab8500_res_to_temp ab8500_temp_tbl_a_thermistor[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -080015 {-5, 53407},
16 { 0, 48594},
17 { 5, 43804},
18 {10, 39188},
19 {15, 34870},
20 {20, 30933},
21 {25, 27422},
22 {30, 24347},
23 {35, 21694},
24 {40, 19431},
25 {45, 17517},
26 {50, 15908},
27 {55, 14561},
28 {60, 13437},
29 {65, 12500},
30};
Hongbo Zhangea2be6f2013-04-03 20:18:11 +080031EXPORT_SYMBOL(ab8500_temp_tbl_a_thermistor);
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -080032
Hongbo Zhangea2be6f2013-04-03 20:18:11 +080033const int ab8500_temp_tbl_a_size = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor);
34EXPORT_SYMBOL(ab8500_temp_tbl_a_size);
35
Linus Walleij484a9cc2021-07-13 17:27:07 +020036const struct ab8500_res_to_temp ab8500_temp_tbl_b_thermistor[] = {
Rajanikanth H.Vbd9e8ab2012-11-18 19:16:58 -080037 {-5, 200000},
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -080038 { 0, 159024},
39 { 5, 151921},
40 {10, 144300},
41 {15, 136424},
42 {20, 128565},
43 {25, 120978},
44 {30, 113875},
45 {35, 107397},
46 {40, 101629},
47 {45, 96592},
48 {50, 92253},
49 {55, 88569},
50 {60, 85461},
51 {65, 82869},
52};
Hongbo Zhangea2be6f2013-04-03 20:18:11 +080053EXPORT_SYMBOL(ab8500_temp_tbl_b_thermistor);
54
55const int ab8500_temp_tbl_b_size = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor);
56EXPORT_SYMBOL(ab8500_temp_tbl_b_size);
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -080057
Linus Walleij484a9cc2021-07-13 17:27:07 +020058static const struct ab8500_v_to_cap cap_tbl_a_thermistor[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -080059 {4171, 100},
60 {4114, 95},
61 {4009, 83},
62 {3947, 74},
63 {3907, 67},
64 {3863, 59},
65 {3830, 56},
66 {3813, 53},
67 {3791, 46},
68 {3771, 33},
69 {3754, 25},
70 {3735, 20},
71 {3717, 17},
72 {3681, 13},
73 {3664, 8},
74 {3651, 6},
75 {3635, 5},
76 {3560, 3},
77 {3408, 1},
78 {3247, 0},
79};
80
Linus Walleij484a9cc2021-07-13 17:27:07 +020081static const struct ab8500_v_to_cap cap_tbl_b_thermistor[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -080082 {4161, 100},
83 {4124, 98},
84 {4044, 90},
85 {4003, 85},
86 {3966, 80},
87 {3933, 75},
88 {3888, 67},
89 {3849, 60},
90 {3813, 55},
91 {3787, 47},
92 {3772, 30},
93 {3751, 25},
94 {3718, 20},
95 {3681, 16},
96 {3660, 14},
97 {3589, 10},
98 {3546, 7},
99 {3495, 4},
100 {3404, 2},
101 {3250, 0},
102};
103
Linus Walleij484a9cc2021-07-13 17:27:07 +0200104static const struct ab8500_v_to_cap cap_tbl[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800105 {4186, 100},
106 {4163, 99},
107 {4114, 95},
108 {4068, 90},
109 {3990, 80},
110 {3926, 70},
111 {3898, 65},
112 {3866, 60},
113 {3833, 55},
114 {3812, 50},
115 {3787, 40},
116 {3768, 30},
117 {3747, 25},
118 {3730, 20},
119 {3705, 15},
120 {3699, 14},
121 {3684, 12},
122 {3672, 9},
123 {3657, 7},
124 {3638, 6},
125 {3556, 4},
126 {3424, 2},
127 {3317, 1},
128 {3094, 0},
129};
130
131/*
132 * Note that the res_to_temp table must be strictly sorted by falling
133 * resistance values to work.
134 */
Linus Walleij484a9cc2021-07-13 17:27:07 +0200135static const struct ab8500_res_to_temp temp_tbl[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800136 {-5, 214834},
137 { 0, 162943},
138 { 5, 124820},
139 {10, 96520},
140 {15, 75306},
141 {20, 59254},
142 {25, 47000},
143 {30, 37566},
144 {35, 30245},
145 {40, 24520},
146 {45, 20010},
147 {50, 16432},
148 {55, 13576},
149 {60, 11280},
150 {65, 9425},
151};
152
153/*
154 * Note that the batres_vs_temp table must be strictly sorted by falling
155 * temperature values to work.
156 */
Hongbo Zhang2c899402013-04-03 20:18:10 +0800157static const struct batres_vs_temp temp_to_batres_tbl_thermistor[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800158 { 40, 120},
159 { 30, 135},
160 { 20, 165},
161 { 10, 230},
162 { 00, 325},
163 {-10, 445},
164 {-20, 595},
165};
166
167/*
168 * Note that the batres_vs_temp table must be strictly sorted by falling
169 * temperature values to work.
170 */
Hongbo Zhang2c899402013-04-03 20:18:10 +0800171static const struct batres_vs_temp temp_to_batres_tbl_ext_thermistor[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800172 { 60, 300},
173 { 30, 300},
174 { 20, 300},
175 { 10, 300},
176 { 00, 300},
177 {-10, 300},
178 {-20, 300},
179};
180
181/* battery resistance table for LI ION 9100 battery */
Hongbo Zhang2c899402013-04-03 20:18:10 +0800182static const struct batres_vs_temp temp_to_batres_tbl_9100[] = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800183 { 60, 180},
184 { 30, 180},
185 { 20, 180},
186 { 10, 180},
187 { 00, 180},
188 {-10, 180},
189 {-20, 180},
190};
191
Linus Walleij484a9cc2021-07-13 17:27:07 +0200192static struct ab8500_battery_type bat_type_thermistor[] = {
Lee Jones43dc4472012-11-29 15:26:22 +0000193 [BATTERY_UNKNOWN] = {
194 /* First element always represent the UNKNOWN battery */
195 .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
196 .resis_high = 0,
197 .resis_low = 0,
198 .battery_resistance = 300,
199 .charge_full_design = 612,
200 .nominal_voltage = 3700,
201 .termination_vol = 4050,
202 .termination_curr = 200,
Marcus Cooperea402402013-01-11 13:12:54 +0000203 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000204 .normal_cur_lvl = 400,
205 .normal_vol_lvl = 4100,
206 .maint_a_cur_lvl = 400,
207 .maint_a_vol_lvl = 4050,
208 .maint_a_chg_timer_h = 60,
209 .maint_b_cur_lvl = 400,
210 .maint_b_vol_lvl = 4000,
211 .maint_b_chg_timer_h = 200,
212 .low_high_cur_lvl = 300,
213 .low_high_vol_lvl = 4000,
214 .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
215 .r_to_t_tbl = temp_tbl,
216 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
217 .v_to_cap_tbl = cap_tbl,
218 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
219 .batres_tbl = temp_to_batres_tbl_thermistor,
220 },
221 {
222 .name = POWER_SUPPLY_TECHNOLOGY_LIPO,
223 .resis_high = 53407,
224 .resis_low = 12500,
225 .battery_resistance = 300,
226 .charge_full_design = 900,
227 .nominal_voltage = 3600,
228 .termination_vol = 4150,
229 .termination_curr = 80,
Marcus Cooperea402402013-01-11 13:12:54 +0000230 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000231 .normal_cur_lvl = 700,
232 .normal_vol_lvl = 4200,
233 .maint_a_cur_lvl = 600,
234 .maint_a_vol_lvl = 4150,
235 .maint_a_chg_timer_h = 60,
236 .maint_b_cur_lvl = 600,
237 .maint_b_vol_lvl = 4100,
238 .maint_b_chg_timer_h = 200,
239 .low_high_cur_lvl = 300,
240 .low_high_vol_lvl = 4000,
Hongbo Zhangea2be6f2013-04-03 20:18:11 +0800241 .n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor),
242 .r_to_t_tbl = ab8500_temp_tbl_a_thermistor,
Hongbo Zhang6c1f8e02013-04-03 20:18:09 +0800243 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_a_thermistor),
244 .v_to_cap_tbl = cap_tbl_a_thermistor,
Lee Jones43dc4472012-11-29 15:26:22 +0000245 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
246 .batres_tbl = temp_to_batres_tbl_thermistor,
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800247
Lee Jones43dc4472012-11-29 15:26:22 +0000248 },
249 {
250 .name = POWER_SUPPLY_TECHNOLOGY_LIPO,
251 .resis_high = 200000,
252 .resis_low = 82869,
253 .battery_resistance = 300,
254 .charge_full_design = 900,
255 .nominal_voltage = 3600,
256 .termination_vol = 4150,
257 .termination_curr = 80,
Marcus Cooperea402402013-01-11 13:12:54 +0000258 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000259 .normal_cur_lvl = 700,
260 .normal_vol_lvl = 4200,
261 .maint_a_cur_lvl = 600,
262 .maint_a_vol_lvl = 4150,
263 .maint_a_chg_timer_h = 60,
264 .maint_b_cur_lvl = 600,
265 .maint_b_vol_lvl = 4100,
266 .maint_b_chg_timer_h = 200,
267 .low_high_cur_lvl = 300,
268 .low_high_vol_lvl = 4000,
Hongbo Zhangea2be6f2013-04-03 20:18:11 +0800269 .n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor),
270 .r_to_t_tbl = ab8500_temp_tbl_b_thermistor,
Hongbo Zhang6c1f8e02013-04-03 20:18:09 +0800271 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_b_thermistor),
272 .v_to_cap_tbl = cap_tbl_b_thermistor,
Lee Jones43dc4472012-11-29 15:26:22 +0000273 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
274 .batres_tbl = temp_to_batres_tbl_thermistor,
275 },
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800276};
277
Linus Walleij484a9cc2021-07-13 17:27:07 +0200278static struct ab8500_battery_type bat_type_ext_thermistor[] = {
Lee Jones43dc4472012-11-29 15:26:22 +0000279 [BATTERY_UNKNOWN] = {
280 /* First element always represent the UNKNOWN battery */
281 .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN,
282 .resis_high = 0,
283 .resis_low = 0,
284 .battery_resistance = 300,
285 .charge_full_design = 612,
286 .nominal_voltage = 3700,
287 .termination_vol = 4050,
288 .termination_curr = 200,
Marcus Cooperea402402013-01-11 13:12:54 +0000289 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000290 .normal_cur_lvl = 400,
291 .normal_vol_lvl = 4100,
292 .maint_a_cur_lvl = 400,
293 .maint_a_vol_lvl = 4050,
294 .maint_a_chg_timer_h = 60,
295 .maint_b_cur_lvl = 400,
296 .maint_b_vol_lvl = 4000,
297 .maint_b_chg_timer_h = 200,
298 .low_high_cur_lvl = 300,
299 .low_high_vol_lvl = 4000,
300 .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
301 .r_to_t_tbl = temp_tbl,
302 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
303 .v_to_cap_tbl = cap_tbl,
304 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
305 .batres_tbl = temp_to_batres_tbl_thermistor,
306 },
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800307/*
308 * These are the batteries that doesn't have an internal NTC resistor to measure
309 * its temperature. The temperature in this case is measure with a NTC placed
310 * near the battery but on the PCB.
311 */
Lee Jones43dc4472012-11-29 15:26:22 +0000312 {
313 .name = POWER_SUPPLY_TECHNOLOGY_LIPO,
314 .resis_high = 76000,
315 .resis_low = 53000,
316 .battery_resistance = 300,
317 .charge_full_design = 900,
318 .nominal_voltage = 3700,
319 .termination_vol = 4150,
320 .termination_curr = 100,
Marcus Cooperea402402013-01-11 13:12:54 +0000321 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000322 .normal_cur_lvl = 700,
323 .normal_vol_lvl = 4200,
324 .maint_a_cur_lvl = 600,
325 .maint_a_vol_lvl = 4150,
326 .maint_a_chg_timer_h = 60,
327 .maint_b_cur_lvl = 600,
328 .maint_b_vol_lvl = 4100,
329 .maint_b_chg_timer_h = 200,
330 .low_high_cur_lvl = 300,
331 .low_high_vol_lvl = 4000,
332 .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
333 .r_to_t_tbl = temp_tbl,
334 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
335 .v_to_cap_tbl = cap_tbl,
336 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
337 .batres_tbl = temp_to_batres_tbl_thermistor,
338 },
339 {
340 .name = POWER_SUPPLY_TECHNOLOGY_LION,
341 .resis_high = 30000,
342 .resis_low = 10000,
343 .battery_resistance = 300,
344 .charge_full_design = 950,
345 .nominal_voltage = 3700,
346 .termination_vol = 4150,
347 .termination_curr = 100,
Marcus Cooperea402402013-01-11 13:12:54 +0000348 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000349 .normal_cur_lvl = 700,
350 .normal_vol_lvl = 4200,
351 .maint_a_cur_lvl = 600,
352 .maint_a_vol_lvl = 4150,
353 .maint_a_chg_timer_h = 60,
354 .maint_b_cur_lvl = 600,
355 .maint_b_vol_lvl = 4100,
356 .maint_b_chg_timer_h = 200,
357 .low_high_cur_lvl = 300,
358 .low_high_vol_lvl = 4000,
359 .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
360 .r_to_t_tbl = temp_tbl,
361 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
362 .v_to_cap_tbl = cap_tbl,
363 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
364 .batres_tbl = temp_to_batres_tbl_thermistor,
365 },
366 {
367 .name = POWER_SUPPLY_TECHNOLOGY_LION,
368 .resis_high = 95000,
369 .resis_low = 76001,
370 .battery_resistance = 300,
371 .charge_full_design = 950,
372 .nominal_voltage = 3700,
373 .termination_vol = 4150,
374 .termination_curr = 100,
Marcus Cooperea402402013-01-11 13:12:54 +0000375 .recharge_cap = 95,
Lee Jones43dc4472012-11-29 15:26:22 +0000376 .normal_cur_lvl = 700,
377 .normal_vol_lvl = 4200,
378 .maint_a_cur_lvl = 600,
379 .maint_a_vol_lvl = 4150,
380 .maint_a_chg_timer_h = 60,
381 .maint_b_cur_lvl = 600,
382 .maint_b_vol_lvl = 4100,
383 .maint_b_chg_timer_h = 200,
384 .low_high_cur_lvl = 300,
385 .low_high_vol_lvl = 4000,
386 .n_temp_tbl_elements = ARRAY_SIZE(temp_tbl),
387 .r_to_t_tbl = temp_tbl,
388 .n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl),
389 .v_to_cap_tbl = cap_tbl,
390 .n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
391 .batres_tbl = temp_to_batres_tbl_thermistor,
392 },
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800393};
394
Linus Walleij484a9cc2021-07-13 17:27:07 +0200395static const struct ab8500_bm_capacity_levels cap_levels = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800396 .critical = 2,
397 .low = 10,
398 .normal = 70,
399 .high = 95,
400 .full = 100,
401};
402
Linus Walleij484a9cc2021-07-13 17:27:07 +0200403static const struct ab8500_fg_parameters fg = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800404 .recovery_sleep_timer = 10,
405 .recovery_total_time = 100,
406 .init_timer = 1,
407 .init_discard_time = 5,
408 .init_total_time = 40,
409 .high_curr_time = 60,
410 .accu_charging = 30,
411 .accu_high_curr = 30,
412 .high_curr_threshold = 50,
413 .lowbat_threshold = 3100,
414 .battok_falling_th_sel0 = 2860,
415 .battok_raising_th_sel1 = 2860,
Marcus Cooperea402402013-01-11 13:12:54 +0000416 .maint_thres = 95,
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800417 .user_cap_limit = 15,
Lee Jones93ff7222012-05-31 16:16:36 +0200418 .pcut_enable = 1,
419 .pcut_max_time = 127,
420 .pcut_flag_time = 112,
421 .pcut_max_restart = 15,
422 .pcut_debounce_time = 2,
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800423};
424
Linus Walleij484a9cc2021-07-13 17:27:07 +0200425static const struct ab8500_maxim_parameters ab8500_maxi_params = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800426 .ena_maxi = true,
427 .chg_curr = 910,
428 .wait_cycles = 10,
429 .charger_curr_step = 100,
430};
431
Linus Walleij484a9cc2021-07-13 17:27:07 +0200432static const struct ab8500_bm_charger_parameters chg = {
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800433 .usb_volt_max = 5500,
434 .usb_curr_max = 1500,
435 .ac_volt_max = 7500,
436 .ac_curr_max = 1500,
437};
438
Lee Jones861a30d2012-08-29 20:36:51 +0800439/*
440 * This array maps the raw hex value to charger output current used by the
441 * AB8500 values
442 */
443static int ab8500_charge_output_curr_map[] = {
444 100, 200, 300, 400, 500, 600, 700, 800,
445 900, 1000, 1100, 1200, 1300, 1400, 1500, 1500,
446};
447
Lee Jones861a30d2012-08-29 20:36:51 +0800448/*
449 * This array maps the raw hex value to charger input current used by the
450 * AB8500 values
451 */
452static int ab8500_charge_input_curr_map[] = {
453 50, 98, 193, 290, 380, 450, 500, 600,
454 700, 800, 900, 1000, 1100, 1300, 1400, 1500,
455};
456
Linus Walleij484a9cc2021-07-13 17:27:07 +0200457struct ab8500_bm_data ab8500_bm_data = {
Lee Jones43dc4472012-11-29 15:26:22 +0000458 .temp_under = 3,
459 .temp_low = 8,
460 .temp_high = 43,
461 .temp_over = 48,
462 .main_safety_tmr_h = 4,
463 .temp_interval_chg = 20,
464 .temp_interval_nochg = 120,
465 .usb_safety_tmr_h = 4,
466 .bkup_bat_v = BUP_VCH_SEL_2P6V,
467 .bkup_bat_i = BUP_ICH_SEL_150UA,
468 .no_maintenance = false,
Marcus Cooperea402402013-01-11 13:12:54 +0000469 .capacity_scaling = false,
Linus Walleij484a9cc2021-07-13 17:27:07 +0200470 .adc_therm = AB8500_ADC_THERM_BATCTRL,
Lee Jones43dc4472012-11-29 15:26:22 +0000471 .chg_unknown_bat = false,
472 .enable_overshoot = false,
473 .fg_res = 100,
474 .cap_levels = &cap_levels,
475 .bat_type = bat_type_thermistor,
Lee Jones861a30d2012-08-29 20:36:51 +0800476 .n_btypes = ARRAY_SIZE(bat_type_thermistor),
Lee Jones43dc4472012-11-29 15:26:22 +0000477 .batt_id = 0,
478 .interval_charging = 5,
479 .interval_not_charging = 120,
480 .temp_hysteresis = 3,
481 .gnd_lift_resistance = 34,
Lee Jones861a30d2012-08-29 20:36:51 +0800482 .chg_output_curr = ab8500_charge_output_curr_map,
483 .n_chg_out_curr = ARRAY_SIZE(ab8500_charge_output_curr_map),
484 .maxi = &ab8500_maxi_params,
Lee Jones43dc4472012-11-29 15:26:22 +0000485 .chg_params = &chg,
486 .fg_params = &fg,
Lee Jones861a30d2012-08-29 20:36:51 +0800487 .chg_input_curr = ab8500_charge_input_curr_map,
488 .n_chg_in_curr = ARRAY_SIZE(ab8500_charge_input_curr_map),
489};
490
Linus Torvalds5a120392013-02-20 10:19:07 -0800491int ab8500_bm_of_probe(struct device *dev,
492 struct device_node *np,
Linus Walleij484a9cc2021-07-13 17:27:07 +0200493 struct ab8500_bm_data *bm)
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800494{
Hongbo Zhang2c899402013-04-03 20:18:10 +0800495 const struct batres_vs_temp *tmp_batres_tbl;
Lee Jones215cf5c2012-11-30 11:38:52 +0000496 struct device_node *battery_node;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800497 const char *btech;
Lee Jones8e3a71e2012-11-30 09:16:40 +0000498 int i;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800499
Linus Walleij1a678432021-10-07 00:40:07 +0200500 battery_node = of_parse_phandle(np, "monitored-battery", 0);
Lee Jones215cf5c2012-11-30 11:38:52 +0000501 if (!battery_node) {
Lee Jones8e3a71e2012-11-30 09:16:40 +0000502 dev_err(dev, "battery node or reference missing\n");
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800503 return -EINVAL;
504 }
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800505
Lee Jones215cf5c2012-11-30 11:38:52 +0000506 btech = of_get_property(battery_node, "stericsson,battery-type", NULL);
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800507 if (!btech) {
508 dev_warn(dev, "missing property battery-name/type\n");
Wen Yang0b646fd2019-04-17 10:43:02 +0800509 of_node_put(battery_node);
Rajanikanth H.Vf5695a32012-11-29 00:57:45 +0530510 return -EINVAL;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800511 }
512
Rajanikanth H.Vf5695a32012-11-29 00:57:45 +0530513 if (strncmp(btech, "LION", 4) == 0) {
Lee Jones23a04f92012-11-29 15:08:41 +0000514 bm->no_maintenance = true;
515 bm->chg_unknown_bat = true;
516 bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
517 bm->bat_type[BATTERY_UNKNOWN].termination_vol = 4150;
Marcus Cooperea402402013-01-11 13:12:54 +0000518 bm->bat_type[BATTERY_UNKNOWN].recharge_cap = 95;
Lee Jones23a04f92012-11-29 15:08:41 +0000519 bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl = 520;
520 bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl = 4200;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800521 }
Lee Jones43dc4472012-11-29 15:26:22 +0000522
Lee Jones215cf5c2012-11-30 11:38:52 +0000523 if (of_property_read_bool(battery_node, "thermistor-on-batctrl")) {
Lee Jones8e3a71e2012-11-30 09:16:40 +0000524 if (strncmp(btech, "LION", 4) == 0)
525 tmp_batres_tbl = temp_to_batres_tbl_9100;
526 else
527 tmp_batres_tbl = temp_to_batres_tbl_thermistor;
528 } else {
Lee Jones23a04f92012-11-29 15:08:41 +0000529 bm->n_btypes = 4;
530 bm->bat_type = bat_type_ext_thermistor;
Linus Walleij484a9cc2021-07-13 17:27:07 +0200531 bm->adc_therm = AB8500_ADC_THERM_BATTEMP;
Lee Jones23a04f92012-11-29 15:08:41 +0000532 tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800533 }
Lee Jones8e3a71e2012-11-30 09:16:40 +0000534
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800535 /* select the battery resolution table */
Lee Jones23a04f92012-11-29 15:08:41 +0000536 for (i = 0; i < bm->n_btypes; ++i)
537 bm->bat_type[i].batres_tbl = tmp_batres_tbl;
Lee Jones8e3a71e2012-11-30 09:16:40 +0000538
Lee Jones215cf5c2012-11-30 11:38:52 +0000539 of_node_put(battery_node);
Lee Jones43dc4472012-11-29 15:26:22 +0000540
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800541 return 0;
542}