1#include <linux/export.h>
2#include <linux/power_supply.h>
3#include <linux/of.h>
4#include <linux/mfd/abx500.h>
5#include <linux/mfd/abx500/ab8500.h>
6#include <linux/mfd/abx500/ab8500-bm.h>
7
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 */
14const struct abx500_res_to_temp ab8500_temp_tbl_a_thermistor[] = {
15	{-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};
31EXPORT_SYMBOL(ab8500_temp_tbl_a_thermistor);
32
33const int ab8500_temp_tbl_a_size = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor);
34EXPORT_SYMBOL(ab8500_temp_tbl_a_size);
35
36const struct abx500_res_to_temp ab8500_temp_tbl_b_thermistor[] = {
37	{-5, 200000},
38	{ 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};
53EXPORT_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);
57
58static const struct abx500_v_to_cap cap_tbl_a_thermistor[] = {
59	{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
81static const struct abx500_v_to_cap cap_tbl_b_thermistor[] = {
82	{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
104static const struct abx500_v_to_cap cap_tbl[] = {
105	{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 */
135static const struct abx500_res_to_temp temp_tbl[] = {
136	{-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 */
157static const struct batres_vs_temp temp_to_batres_tbl_thermistor[] = {
158	{ 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 */
171static const struct batres_vs_temp temp_to_batres_tbl_ext_thermistor[] = {
172	{ 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 */
182static const struct batres_vs_temp temp_to_batres_tbl_9100[] = {
183	{ 60, 180},
184	{ 30, 180},
185	{ 20, 180},
186	{ 10, 180},
187	{ 00, 180},
188	{-10, 180},
189	{-20, 180},
190};
191
192static struct abx500_battery_type bat_type_thermistor[] = {
193	[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,
203		.recharge_cap = 95,
204		.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,
230		.recharge_cap = 95,
231		.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,
241		.n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor),
242		.r_to_t_tbl = ab8500_temp_tbl_a_thermistor,
243		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_a_thermistor),
244		.v_to_cap_tbl = cap_tbl_a_thermistor,
245		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
246		.batres_tbl = temp_to_batres_tbl_thermistor,
247
248	},
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,
258		.recharge_cap = 95,
259		.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,
269		.n_temp_tbl_elements = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor),
270		.r_to_t_tbl = ab8500_temp_tbl_b_thermistor,
271		.n_v_cap_tbl_elements = ARRAY_SIZE(cap_tbl_b_thermistor),
272		.v_to_cap_tbl = cap_tbl_b_thermistor,
273		.n_batres_tbl_elements = ARRAY_SIZE(temp_to_batres_tbl_thermistor),
274		.batres_tbl = temp_to_batres_tbl_thermistor,
275	},
276};
277
278static struct abx500_battery_type bat_type_ext_thermistor[] = {
279	[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,
289		.recharge_cap = 95,
290		.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	},
307/*
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 */
312	{
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,
321		.recharge_cap = 95,
322		.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,
348		.recharge_cap = 95,
349		.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,
375		.recharge_cap = 95,
376		.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	},
393};
394
395static const struct abx500_bm_capacity_levels cap_levels = {
396	.critical	= 2,
397	.low		= 10,
398	.normal		= 70,
399	.high		= 95,
400	.full		= 100,
401};
402
403static const struct abx500_fg_parameters fg = {
404	.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,
416	.maint_thres = 95,
417	.user_cap_limit = 15,
418	.pcut_enable = 1,
419	.pcut_max_time = 127,
420	.pcut_flag_time = 112,
421	.pcut_max_restart = 15,
422	.pcut_debounce_time = 2,
423};
424
425static const struct abx500_maxim_parameters ab8500_maxi_params = {
426	.ena_maxi = true,
427	.chg_curr = 910,
428	.wait_cycles = 10,
429	.charger_curr_step = 100,
430};
431
432static const struct abx500_maxim_parameters abx540_maxi_params = {
433        .ena_maxi = true,
434        .chg_curr = 3000,
435        .wait_cycles = 10,
436        .charger_curr_step = 200,
437};
438
439static const struct abx500_bm_charger_parameters chg = {
440	.usb_volt_max		= 5500,
441	.usb_curr_max		= 1500,
442	.ac_volt_max		= 7500,
443	.ac_curr_max		= 1500,
444};
445
446/*
447 * This array maps the raw hex value to charger output current used by the
448 * AB8500 values
449 */
450static int ab8500_charge_output_curr_map[] = {
451        100,    200,    300,    400,    500,    600,    700,    800,
452        900,    1000,   1100,   1200,   1300,   1400,   1500,   1500,
453};
454
455static int ab8540_charge_output_curr_map[] = {
456        0,      0,      0,      75,     100,    125,    150,    175,
457        200,    225,    250,    275,    300,    325,    350,    375,
458        400,    425,    450,    475,    500,    525,    550,    575,
459        600,    625,    650,    675,    700,    725,    750,    775,
460        800,    825,    850,    875,    900,    925,    950,    975,
461        1000,   1025,   1050,   1075,   1100,   1125,   1150,   1175,
462        1200,   1225,   1250,   1275,   1300,   1325,   1350,   1375,
463        1400,   1425,   1450,   1500,   1600,   1700,   1900,   2000,
464};
465
466/*
467 * This array maps the raw hex value to charger input current used by the
468 * AB8500 values
469 */
470static int ab8500_charge_input_curr_map[] = {
471        50,     98,     193,    290,    380,    450,    500,    600,
472        700,    800,    900,    1000,   1100,   1300,   1400,   1500,
473};
474
475static int ab8540_charge_input_curr_map[] = {
476        25,     50,     75,     100,    125,    150,    175,    200,
477        225,    250,    275,    300,    325,    350,    375,    400,
478        425,    450,    475,    500,    525,    550,    575,    600,
479        625,    650,    675,    700,    725,    750,    775,    800,
480        825,    850,    875,    900,    925,    950,    975,    1000,
481        1025,   1050,   1075,   1100,   1125,   1150,   1175,   1200,
482        1225,   1250,   1275,   1300,   1325,   1350,   1375,   1400,
483        1425,   1450,   1475,   1500,   1500,   1500,   1500,   1500,
484};
485
486struct abx500_bm_data ab8500_bm_data = {
487	.temp_under             = 3,
488	.temp_low               = 8,
489	.temp_high              = 43,
490	.temp_over              = 48,
491	.main_safety_tmr_h      = 4,
492	.temp_interval_chg      = 20,
493	.temp_interval_nochg    = 120,
494	.usb_safety_tmr_h       = 4,
495	.bkup_bat_v             = BUP_VCH_SEL_2P6V,
496	.bkup_bat_i             = BUP_ICH_SEL_150UA,
497	.no_maintenance         = false,
498	.capacity_scaling       = false,
499	.adc_therm              = ABx500_ADC_THERM_BATCTRL,
500	.chg_unknown_bat        = false,
501	.enable_overshoot       = false,
502	.fg_res                 = 100,
503	.cap_levels             = &cap_levels,
504	.bat_type               = bat_type_thermistor,
505	.n_btypes               = ARRAY_SIZE(bat_type_thermistor),
506	.batt_id                = 0,
507	.interval_charging      = 5,
508	.interval_not_charging  = 120,
509	.temp_hysteresis        = 3,
510	.gnd_lift_resistance    = 34,
511	.chg_output_curr        = ab8500_charge_output_curr_map,
512	.n_chg_out_curr         = ARRAY_SIZE(ab8500_charge_output_curr_map),
513	.maxi                   = &ab8500_maxi_params,
514	.chg_params             = &chg,
515	.fg_params              = &fg,
516        .chg_input_curr         = ab8500_charge_input_curr_map,
517        .n_chg_in_curr          = ARRAY_SIZE(ab8500_charge_input_curr_map),
518};
519
520struct abx500_bm_data ab8540_bm_data = {
521        .temp_under             = 3,
522        .temp_low               = 8,
523        .temp_high              = 43,
524        .temp_over              = 48,
525        .main_safety_tmr_h      = 4,
526        .temp_interval_chg      = 20,
527        .temp_interval_nochg    = 120,
528        .usb_safety_tmr_h       = 4,
529        .bkup_bat_v             = BUP_VCH_SEL_2P6V,
530        .bkup_bat_i             = BUP_ICH_SEL_150UA,
531        .no_maintenance         = false,
532        .capacity_scaling       = false,
533        .adc_therm              = ABx500_ADC_THERM_BATCTRL,
534        .chg_unknown_bat        = false,
535        .enable_overshoot       = false,
536        .fg_res                 = 100,
537        .cap_levels             = &cap_levels,
538        .bat_type               = bat_type_thermistor,
539        .n_btypes               = ARRAY_SIZE(bat_type_thermistor),
540        .batt_id                = 0,
541        .interval_charging      = 5,
542        .interval_not_charging  = 120,
543        .temp_hysteresis        = 3,
544        .gnd_lift_resistance    = 0,
545        .maxi                   = &abx540_maxi_params,
546        .chg_params             = &chg,
547        .fg_params              = &fg,
548        .chg_output_curr        = ab8540_charge_output_curr_map,
549        .n_chg_out_curr         = ARRAY_SIZE(ab8540_charge_output_curr_map),
550        .chg_input_curr         = ab8540_charge_input_curr_map,
551        .n_chg_in_curr          = ARRAY_SIZE(ab8540_charge_input_curr_map),
552};
553
554int ab8500_bm_of_probe(struct device *dev,
555		       struct device_node *np,
556		       struct abx500_bm_data *bm)
557{
558	const struct batres_vs_temp *tmp_batres_tbl;
559	struct device_node *battery_node;
560	const char *btech;
561	int i;
562
563	/* get phandle to 'battery-info' node */
564	battery_node = of_parse_phandle(np, "battery", 0);
565	if (!battery_node) {
566		dev_err(dev, "battery node or reference missing\n");
567		return -EINVAL;
568	}
569
570	btech = of_get_property(battery_node, "stericsson,battery-type", NULL);
571	if (!btech) {
572		dev_warn(dev, "missing property battery-name/type\n");
573		return -EINVAL;
574	}
575
576	if (strncmp(btech, "LION", 4) == 0) {
577		bm->no_maintenance  = true;
578		bm->chg_unknown_bat = true;
579		bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
580		bm->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
581		bm->bat_type[BATTERY_UNKNOWN].recharge_cap       = 95;
582		bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl     = 520;
583		bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl     = 4200;
584	}
585
586	if (of_property_read_bool(battery_node, "thermistor-on-batctrl")) {
587		if (strncmp(btech, "LION", 4) == 0)
588			tmp_batres_tbl = temp_to_batres_tbl_9100;
589		else
590			tmp_batres_tbl = temp_to_batres_tbl_thermistor;
591	} else {
592		bm->n_btypes   = 4;
593		bm->bat_type   = bat_type_ext_thermistor;
594		bm->adc_therm  = ABx500_ADC_THERM_BATTEMP;
595		tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor;
596	}
597
598	/* select the battery resolution table */
599	for (i = 0; i < bm->n_btypes; ++i)
600		bm->bat_type[i].batres_tbl = tmp_batres_tbl;
601
602	of_node_put(battery_node);
603
604	return 0;
605}
606