blob: d2986453309348ce8a5fa832c694b27406e89456 [file] [log] [blame]
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -08001#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 */
Hongbo Zhangea2be6f2013-04-03 20:18:11 +080014const struct abx500_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
36const struct abx500_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
Hongbo Zhang2c899402013-04-03 20:18:10 +080058static const struct abx500_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
Hongbo Zhang2c899402013-04-03 20:18:10 +080081static const struct abx500_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
Hongbo Zhang2c899402013-04-03 20:18:10 +0800104static const struct abx500_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 */
Hongbo Zhang2c899402013-04-03 20:18:10 +0800135static const struct abx500_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
192static struct abx500_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
278static struct abx500_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
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,
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
Lee Jones861a30d2012-08-29 20:36:51 +0800425static const struct abx500_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
Lee Jones861a30d2012-08-29 20:36:51 +0800432static 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
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800439static 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
Lee Jones861a30d2012-08-29 20:36:51 +0800446/*
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
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800486struct abx500_bm_data ab8500_bm_data = {
Lee Jones43dc4472012-11-29 15:26:22 +0000487 .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,
Marcus Cooperea402402013-01-11 13:12:54 +0000498 .capacity_scaling = false,
Lee Jones43dc4472012-11-29 15:26:22 +0000499 .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,
Lee Jones861a30d2012-08-29 20:36:51 +0800505 .n_btypes = ARRAY_SIZE(bat_type_thermistor),
Lee Jones43dc4472012-11-29 15:26:22 +0000506 .batt_id = 0,
507 .interval_charging = 5,
508 .interval_not_charging = 120,
509 .temp_hysteresis = 3,
510 .gnd_lift_resistance = 34,
Lee Jones861a30d2012-08-29 20:36:51 +0800511 .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,
Lee Jones43dc4472012-11-29 15:26:22 +0000514 .chg_params = &chg,
515 .fg_params = &fg,
Lee Jones861a30d2012-08-29 20:36:51 +0800516 .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),
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800552};
553
Linus Torvalds5a120392013-02-20 10:19:07 -0800554int ab8500_bm_of_probe(struct device *dev,
555 struct device_node *np,
556 struct abx500_bm_data *bm)
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800557{
Hongbo Zhang2c899402013-04-03 20:18:10 +0800558 const struct batres_vs_temp *tmp_batres_tbl;
Lee Jones215cf5c2012-11-30 11:38:52 +0000559 struct device_node *battery_node;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800560 const char *btech;
Lee Jones8e3a71e2012-11-30 09:16:40 +0000561 int i;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800562
563 /* get phandle to 'battery-info' node */
Lee Jones215cf5c2012-11-30 11:38:52 +0000564 battery_node = of_parse_phandle(np, "battery", 0);
565 if (!battery_node) {
Lee Jones8e3a71e2012-11-30 09:16:40 +0000566 dev_err(dev, "battery node or reference missing\n");
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800567 return -EINVAL;
568 }
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800569
Lee Jones215cf5c2012-11-30 11:38:52 +0000570 btech = of_get_property(battery_node, "stericsson,battery-type", NULL);
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800571 if (!btech) {
572 dev_warn(dev, "missing property battery-name/type\n");
Rajanikanth H.Vf5695a32012-11-29 00:57:45 +0530573 return -EINVAL;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800574 }
575
Rajanikanth H.Vf5695a32012-11-29 00:57:45 +0530576 if (strncmp(btech, "LION", 4) == 0) {
Lee Jones23a04f92012-11-29 15:08:41 +0000577 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;
Marcus Cooperea402402013-01-11 13:12:54 +0000581 bm->bat_type[BATTERY_UNKNOWN].recharge_cap = 95;
Lee Jones23a04f92012-11-29 15:08:41 +0000582 bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl = 520;
583 bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl = 4200;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800584 }
Lee Jones43dc4472012-11-29 15:26:22 +0000585
Lee Jones215cf5c2012-11-30 11:38:52 +0000586 if (of_property_read_bool(battery_node, "thermistor-on-batctrl")) {
Lee Jones8e3a71e2012-11-30 09:16:40 +0000587 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 {
Lee Jones23a04f92012-11-29 15:08:41 +0000592 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;
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800596 }
Lee Jones8e3a71e2012-11-30 09:16:40 +0000597
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800598 /* select the battery resolution table */
Lee Jones23a04f92012-11-29 15:08:41 +0000599 for (i = 0; i < bm->n_btypes; ++i)
600 bm->bat_type[i].batres_tbl = tmp_batres_tbl;
Lee Jones8e3a71e2012-11-30 09:16:40 +0000601
Lee Jones215cf5c2012-11-30 11:38:52 +0000602 of_node_put(battery_node);
Lee Jones43dc4472012-11-29 15:26:22 +0000603
Rajanikanth H.Ve0f1abe2012-11-18 18:45:41 -0800604 return 0;
605}