Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[linux-2.6-microblaze.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_cap = 95,
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_cap = 95,
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_cap = 95,
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_cap = 95,
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_cap = 95,
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_cap = 95,
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_cap = 95,
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         .maint_thres = 95,
409         .user_cap_limit = 15,
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         .capacity_scaling       = false,
439         .adc_therm              = ABx500_ADC_THERM_BATCTRL,
440         .chg_unknown_bat        = false,
441         .enable_overshoot       = false,
442         .fg_res                 = 100,
443         .cap_levels             = &cap_levels,
444         .bat_type               = bat_type_thermistor,
445         .n_btypes               = 3,
446         .batt_id                = 0,
447         .interval_charging      = 5,
448         .interval_not_charging  = 120,
449         .temp_hysteresis        = 3,
450         .gnd_lift_resistance    = 34,
451         .maxi                   = &maxi_params,
452         .chg_params             = &chg,
453         .fg_params              = &fg,
454 };
455
456 int ab8500_bm_of_probe(struct device *dev,
457                        struct device_node *np,
458                        struct abx500_bm_data *bm)
459 {
460         struct batres_vs_temp *tmp_batres_tbl;
461         struct device_node *battery_node;
462         const char *btech;
463         int i;
464
465         /* get phandle to 'battery-info' node */
466         battery_node = of_parse_phandle(np, "battery", 0);
467         if (!battery_node) {
468                 dev_err(dev, "battery node or reference missing\n");
469                 return -EINVAL;
470         }
471
472         btech = of_get_property(battery_node, "stericsson,battery-type", NULL);
473         if (!btech) {
474                 dev_warn(dev, "missing property battery-name/type\n");
475                 return -EINVAL;
476         }
477
478         if (strncmp(btech, "LION", 4) == 0) {
479                 bm->no_maintenance  = true;
480                 bm->chg_unknown_bat = true;
481                 bm->bat_type[BATTERY_UNKNOWN].charge_full_design = 2600;
482                 bm->bat_type[BATTERY_UNKNOWN].termination_vol    = 4150;
483                 bm->bat_type[BATTERY_UNKNOWN].recharge_cap       = 95;
484                 bm->bat_type[BATTERY_UNKNOWN].normal_cur_lvl     = 520;
485                 bm->bat_type[BATTERY_UNKNOWN].normal_vol_lvl     = 4200;
486         }
487
488         if (of_property_read_bool(battery_node, "thermistor-on-batctrl")) {
489                 if (strncmp(btech, "LION", 4) == 0)
490                         tmp_batres_tbl = temp_to_batres_tbl_9100;
491                 else
492                         tmp_batres_tbl = temp_to_batres_tbl_thermistor;
493         } else {
494                 bm->n_btypes   = 4;
495                 bm->bat_type   = bat_type_ext_thermistor;
496                 bm->adc_therm  = ABx500_ADC_THERM_BATTEMP;
497                 tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor;
498         }
499
500         /* select the battery resolution table */
501         for (i = 0; i < bm->n_btypes; ++i)
502                 bm->bat_type[i].batres_tbl = tmp_batres_tbl;
503
504         of_node_put(battery_node);
505
506         return 0;
507 }