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