• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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