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