1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/init.h>
19#include <linux/module.h>
20#include <linux/device.h>
21#include <linux/interrupt.h>
22#include <linux/platform_device.h>
23#include <linux/power_supply.h>
24#include <linux/kobject.h>
25#include <linux/mfd/abx500/ab8500.h>
26#include <linux/mfd/abx500.h>
27#include <linux/slab.h>
28#include <linux/mfd/abx500/ab8500-bm.h>
29#include <linux/delay.h>
30#include <linux/mfd/abx500/ab8500-gpadc.h>
31#include <linux/mfd/abx500.h>
32#include <linux/time.h>
33#include <linux/completion.h>
34
35#define MILLI_TO_MICRO 1000
36#define FG_LSB_IN_MA 1627
37#define QLSB_NANO_AMP_HOURS_X10 1129
38#define INS_CURR_TIMEOUT (3 * HZ)
39
40#define SEC_TO_SAMPLE(S) (S * 4)
41
42#define NBR_AVG_SAMPLES 20
43
44#define LOW_BAT_CHECK_INTERVAL (2 * HZ)
45
46#define VALID_CAPACITY_SEC (45 * 60)
47#define BATT_OK_MIN 2360
48#define BATT_OK_INCREMENT 50
49#define BATT_OK_MAX_NR_INCREMENTS 0xE
50
51
52#define BATT_OVV 0x01
53
54#define interpolate(x, x1, y1, x2, y2) \
55 ((y1) + ((((y2) - (y1)) * ((x) - (x1))) / ((x2) - (x1))));
56
57#define to_ab8500_fg_device_info(x) container_of((x), \
58 struct ab8500_fg, fg_psy);
59
60
61
62
63
64
65struct ab8500_fg_interrupts {
66 char *name;
67 irqreturn_t (*isr)(int irq, void *data);
68};
69
70enum ab8500_fg_discharge_state {
71 AB8500_FG_DISCHARGE_INIT,
72 AB8500_FG_DISCHARGE_INITMEASURING,
73 AB8500_FG_DISCHARGE_INIT_RECOVERY,
74 AB8500_FG_DISCHARGE_RECOVERY,
75 AB8500_FG_DISCHARGE_READOUT_INIT,
76 AB8500_FG_DISCHARGE_READOUT,
77 AB8500_FG_DISCHARGE_WAKEUP,
78};
79
80static char *discharge_state[] = {
81 "DISCHARGE_INIT",
82 "DISCHARGE_INITMEASURING",
83 "DISCHARGE_INIT_RECOVERY",
84 "DISCHARGE_RECOVERY",
85 "DISCHARGE_READOUT_INIT",
86 "DISCHARGE_READOUT",
87 "DISCHARGE_WAKEUP",
88};
89
90enum ab8500_fg_charge_state {
91 AB8500_FG_CHARGE_INIT,
92 AB8500_FG_CHARGE_READOUT,
93};
94
95static char *charge_state[] = {
96 "CHARGE_INIT",
97 "CHARGE_READOUT",
98};
99
100enum ab8500_fg_calibration_state {
101 AB8500_FG_CALIB_INIT,
102 AB8500_FG_CALIB_WAIT,
103 AB8500_FG_CALIB_END,
104};
105
106struct ab8500_fg_avg_cap {
107 int avg;
108 int samples[NBR_AVG_SAMPLES];
109 __kernel_time_t time_stamps[NBR_AVG_SAMPLES];
110 int pos;
111 int nbr_samples;
112 int sum;
113};
114
115struct ab8500_fg_battery_capacity {
116 int max_mah_design;
117 int max_mah;
118 int mah;
119 int permille;
120 int level;
121 int prev_mah;
122 int prev_percent;
123 int prev_level;
124 int user_mah;
125};
126
127struct ab8500_fg_flags {
128 bool fg_enabled;
129 bool conv_done;
130 bool charging;
131 bool fully_charged;
132 bool force_full;
133 bool low_bat_delay;
134 bool low_bat;
135 bool bat_ovv;
136 bool batt_unknown;
137 bool calibrate;
138 bool user_cap;
139 bool batt_id_received;
140};
141
142struct inst_curr_result_list {
143 struct list_head list;
144 int *result;
145};
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188struct ab8500_fg {
189 struct device *dev;
190 struct list_head node;
191 int irq;
192 int vbat;
193 int vbat_nom;
194 int inst_curr;
195 int avg_curr;
196 int bat_temp;
197 int fg_samples;
198 int accu_charge;
199 int recovery_cnt;
200 int high_curr_cnt;
201 int init_cnt;
202 bool recovery_needed;
203 bool high_curr_mode;
204 bool init_capacity;
205 bool turn_off_fg;
206 enum ab8500_fg_calibration_state calib_state;
207 enum ab8500_fg_discharge_state discharge_state;
208 enum ab8500_fg_charge_state charge_state;
209 struct completion ab8500_fg_complete;
210 struct ab8500_fg_flags flags;
211 struct ab8500_fg_battery_capacity bat_cap;
212 struct ab8500_fg_avg_cap avg_cap;
213 struct ab8500 *parent;
214 struct ab8500_gpadc *gpadc;
215 struct abx500_fg_platform_data *pdata;
216 struct abx500_bm_data *bat;
217 struct power_supply fg_psy;
218 struct workqueue_struct *fg_wq;
219 struct delayed_work fg_periodic_work;
220 struct delayed_work fg_low_bat_work;
221 struct delayed_work fg_reinit_work;
222 struct work_struct fg_work;
223 struct work_struct fg_acc_cur_work;
224 struct delayed_work fg_check_hw_failure_work;
225 struct mutex cc_lock;
226 struct kobject fg_kobject;
227};
228static LIST_HEAD(ab8500_fg_list);
229
230
231
232
233
234struct ab8500_fg *ab8500_fg_get(void)
235{
236 struct ab8500_fg *fg;
237
238 if (list_empty(&ab8500_fg_list))
239 return NULL;
240
241 fg = list_first_entry(&ab8500_fg_list, struct ab8500_fg, node);
242 return fg;
243}
244
245
246static enum power_supply_property ab8500_fg_props[] = {
247 POWER_SUPPLY_PROP_VOLTAGE_NOW,
248 POWER_SUPPLY_PROP_CURRENT_NOW,
249 POWER_SUPPLY_PROP_CURRENT_AVG,
250 POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
251 POWER_SUPPLY_PROP_ENERGY_FULL,
252 POWER_SUPPLY_PROP_ENERGY_NOW,
253 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
254 POWER_SUPPLY_PROP_CHARGE_FULL,
255 POWER_SUPPLY_PROP_CHARGE_NOW,
256 POWER_SUPPLY_PROP_CAPACITY,
257 POWER_SUPPLY_PROP_CAPACITY_LEVEL,
258};
259
260
261
262
263
264static int ab8500_fg_lowbat_voltage_map[] = {
265 2300 ,
266 2325 ,
267 2350 ,
268 2375 ,
269 2400 ,
270 2425 ,
271 2450 ,
272 2475 ,
273 2500 ,
274 2525 ,
275 2550 ,
276 2575 ,
277 2600 ,
278 2625 ,
279 2650 ,
280 2675 ,
281 2700 ,
282 2725 ,
283 2750 ,
284 2775 ,
285 2800 ,
286 2825 ,
287 2850 ,
288 2875 ,
289 2900 ,
290 2925 ,
291 2950 ,
292 2975 ,
293 3000 ,
294 3025 ,
295 3050 ,
296 3075 ,
297 3100 ,
298 3125 ,
299 3150 ,
300 3175 ,
301 3200 ,
302 3225 ,
303 3250 ,
304 3275 ,
305 3300 ,
306 3325 ,
307 3350 ,
308 3375 ,
309 3400 ,
310 3425 ,
311 3450 ,
312 3475 ,
313 3500 ,
314 3525 ,
315 3550 ,
316 3575 ,
317 3600 ,
318 3625 ,
319 3650 ,
320 3675 ,
321 3700 ,
322 3725 ,
323 3750 ,
324 3775 ,
325 3800 ,
326 3825 ,
327 3850 ,
328 3850 ,
329};
330
331static u8 ab8500_volt_to_regval(int voltage)
332{
333 int i;
334
335 if (voltage < ab8500_fg_lowbat_voltage_map[0])
336 return 0;
337
338 for (i = 0; i < ARRAY_SIZE(ab8500_fg_lowbat_voltage_map); i++) {
339 if (voltage < ab8500_fg_lowbat_voltage_map[i])
340 return (u8) i - 1;
341 }
342
343
344 return (u8) ARRAY_SIZE(ab8500_fg_lowbat_voltage_map) - 1;
345}
346
347
348
349
350
351
352
353
354static int ab8500_fg_is_low_curr(struct ab8500_fg *di, int curr)
355{
356
357
358
359 if (curr > -di->bat->fg_params->high_curr_threshold)
360 return true;
361 else
362 return false;
363}
364
365
366
367
368
369
370
371
372
373static int ab8500_fg_add_cap_sample(struct ab8500_fg *di, int sample)
374{
375 struct timespec ts;
376 struct ab8500_fg_avg_cap *avg = &di->avg_cap;
377
378 getnstimeofday(&ts);
379
380 do {
381 avg->sum += sample - avg->samples[avg->pos];
382 avg->samples[avg->pos] = sample;
383 avg->time_stamps[avg->pos] = ts.tv_sec;
384 avg->pos++;
385
386 if (avg->pos == NBR_AVG_SAMPLES)
387 avg->pos = 0;
388
389 if (avg->nbr_samples < NBR_AVG_SAMPLES)
390 avg->nbr_samples++;
391
392
393
394
395
396 } while (ts.tv_sec - VALID_CAPACITY_SEC > avg->time_stamps[avg->pos]);
397
398 avg->avg = avg->sum / avg->nbr_samples;
399
400 return avg->avg;
401}
402
403
404
405
406
407
408
409static void ab8500_fg_clear_cap_samples(struct ab8500_fg *di)
410{
411 int i;
412 struct ab8500_fg_avg_cap *avg = &di->avg_cap;
413
414 avg->pos = 0;
415 avg->nbr_samples = 0;
416 avg->sum = 0;
417 avg->avg = 0;
418
419 for (i = 0; i < NBR_AVG_SAMPLES; i++) {
420 avg->samples[i] = 0;
421 avg->time_stamps[i] = 0;
422 }
423}
424
425
426
427
428
429
430
431
432static void ab8500_fg_fill_cap_sample(struct ab8500_fg *di, int sample)
433{
434 int i;
435 struct timespec ts;
436 struct ab8500_fg_avg_cap *avg = &di->avg_cap;
437
438 getnstimeofday(&ts);
439
440 for (i = 0; i < NBR_AVG_SAMPLES; i++) {
441 avg->samples[i] = sample;
442 avg->time_stamps[i] = ts.tv_sec;
443 }
444
445 avg->pos = 0;
446 avg->nbr_samples = NBR_AVG_SAMPLES;
447 avg->sum = sample * NBR_AVG_SAMPLES;
448 avg->avg = sample;
449}
450
451
452
453
454
455
456
457
458
459static int ab8500_fg_coulomb_counter(struct ab8500_fg *di, bool enable)
460{
461 int ret = 0;
462 mutex_lock(&di->cc_lock);
463 if (enable) {
464
465
466 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
467 AB8500_RTC_CC_CONF_REG, 0x00);
468 if (ret)
469 goto cc_err;
470
471
472 ret = abx500_set_register_interruptible(di->dev,
473 AB8500_GAS_GAUGE, AB8500_GASG_CC_NCOV_ACCU,
474 di->fg_samples);
475 if (ret)
476 goto cc_err;
477
478
479 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
480 AB8500_RTC_CC_CONF_REG,
481 (CC_DEEP_SLEEP_ENA | CC_PWR_UP_ENA));
482 if (ret)
483 goto cc_err;
484
485 di->flags.fg_enabled = true;
486 } else {
487
488 ret = abx500_set_register_interruptible(di->dev,
489 AB8500_GAS_GAUGE, AB8500_GASG_CC_CTRL_REG, 0);
490 if (ret)
491 goto cc_err;
492
493 ret = abx500_set_register_interruptible(di->dev,
494 AB8500_GAS_GAUGE, AB8500_GASG_CC_NCOV_ACCU_CTRL, 0);
495 if (ret)
496 goto cc_err;
497
498
499 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
500 AB8500_RTC_CC_CONF_REG, 0);
501 if (ret)
502 goto cc_err;
503
504 di->flags.fg_enabled = false;
505
506 }
507 dev_dbg(di->dev, " CC enabled: %d Samples: %d\n",
508 enable, di->fg_samples);
509
510 mutex_unlock(&di->cc_lock);
511
512 return ret;
513cc_err:
514 dev_err(di->dev, "%s Enabling coulomb counter failed\n", __func__);
515 mutex_unlock(&di->cc_lock);
516 return ret;
517}
518
519
520
521
522
523
524
525
526
527 int ab8500_fg_inst_curr_start(struct ab8500_fg *di)
528{
529 u8 reg_val;
530 int ret;
531
532 mutex_lock(&di->cc_lock);
533
534 ret = abx500_get_register_interruptible(di->dev, AB8500_RTC,
535 AB8500_RTC_CC_CONF_REG, ®_val);
536 if (ret < 0)
537 goto fail;
538
539 if (!(reg_val & CC_PWR_UP_ENA)) {
540 dev_dbg(di->dev, "%s Enable FG\n", __func__);
541 di->turn_off_fg = true;
542
543
544 ret = abx500_set_register_interruptible(di->dev,
545 AB8500_GAS_GAUGE, AB8500_GASG_CC_NCOV_ACCU,
546 SEC_TO_SAMPLE(10));
547 if (ret)
548 goto fail;
549
550
551 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
552 AB8500_RTC_CC_CONF_REG,
553 (CC_DEEP_SLEEP_ENA | CC_PWR_UP_ENA));
554 if (ret)
555 goto fail;
556 } else {
557 di->turn_off_fg = false;
558 }
559
560
561 INIT_COMPLETION(di->ab8500_fg_complete);
562 enable_irq(di->irq);
563
564
565 return 0;
566fail:
567 mutex_unlock(&di->cc_lock);
568 return ret;
569}
570
571
572
573
574
575
576
577int ab8500_fg_inst_curr_done(struct ab8500_fg *di)
578{
579 return completion_done(&di->ab8500_fg_complete);
580}
581
582
583
584
585
586
587
588
589
590
591int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res)
592{
593 u8 low, high;
594 int val;
595 int ret;
596 int timeout;
597
598 if (!completion_done(&di->ab8500_fg_complete)) {
599 timeout = wait_for_completion_timeout(&di->ab8500_fg_complete,
600 INS_CURR_TIMEOUT);
601 dev_dbg(di->dev, "Finalize time: %d ms\n",
602 ((INS_CURR_TIMEOUT - timeout) * 1000) / HZ);
603 if (!timeout) {
604 ret = -ETIME;
605 disable_irq(di->irq);
606 dev_err(di->dev, "completion timed out [%d]\n",
607 __LINE__);
608 goto fail;
609 }
610 }
611
612 disable_irq(di->irq);
613
614 ret = abx500_mask_and_set_register_interruptible(di->dev,
615 AB8500_GAS_GAUGE, AB8500_GASG_CC_CTRL_REG,
616 READ_REQ, READ_REQ);
617
618
619 usleep_range(100, 100);
620
621
622 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE,
623 AB8500_GASG_CC_SMPL_CNVL_REG, &low);
624 if (ret < 0)
625 goto fail;
626
627 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE,
628 AB8500_GASG_CC_SMPL_CNVH_REG, &high);
629 if (ret < 0)
630 goto fail;
631
632
633
634
635
636 if (high & 0x10)
637 val = (low | (high << 8) | 0xFFFFE000);
638 else
639 val = (low | (high << 8));
640
641
642
643
644
645
646
647
648
649
650 val = (val * QLSB_NANO_AMP_HOURS_X10 * 36 * 4) /
651 (1000 * di->bat->fg_res);
652
653 if (di->turn_off_fg) {
654 dev_dbg(di->dev, "%s Disable FG\n", __func__);
655
656
657 ret = abx500_set_register_interruptible(di->dev,
658 AB8500_GAS_GAUGE, AB8500_GASG_CC_CTRL_REG, 0);
659 if (ret)
660 goto fail;
661
662
663 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
664 AB8500_RTC_CC_CONF_REG, 0);
665 if (ret)
666 goto fail;
667 }
668 mutex_unlock(&di->cc_lock);
669 (*res) = val;
670
671 return 0;
672fail:
673 mutex_unlock(&di->cc_lock);
674 return ret;
675}
676
677
678
679
680
681
682
683
684int ab8500_fg_inst_curr_blocking(struct ab8500_fg *di)
685{
686 int ret;
687 int res = 0;
688
689 ret = ab8500_fg_inst_curr_start(di);
690 if (ret) {
691 dev_err(di->dev, "Failed to initialize fg_inst\n");
692 return 0;
693 }
694
695 ret = ab8500_fg_inst_curr_finalize(di, &res);
696 if (ret) {
697 dev_err(di->dev, "Failed to finalize fg_inst\n");
698 return 0;
699 }
700
701 return res;
702}
703
704
705
706
707
708
709
710
711static void ab8500_fg_acc_cur_work(struct work_struct *work)
712{
713 int val;
714 int ret;
715 u8 low, med, high;
716
717 struct ab8500_fg *di = container_of(work,
718 struct ab8500_fg, fg_acc_cur_work);
719
720 mutex_lock(&di->cc_lock);
721 ret = abx500_set_register_interruptible(di->dev, AB8500_GAS_GAUGE,
722 AB8500_GASG_CC_NCOV_ACCU_CTRL, RD_NCONV_ACCU_REQ);
723 if (ret)
724 goto exit;
725
726 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE,
727 AB8500_GASG_CC_NCOV_ACCU_LOW, &low);
728 if (ret < 0)
729 goto exit;
730
731 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE,
732 AB8500_GASG_CC_NCOV_ACCU_MED, &med);
733 if (ret < 0)
734 goto exit;
735
736 ret = abx500_get_register_interruptible(di->dev, AB8500_GAS_GAUGE,
737 AB8500_GASG_CC_NCOV_ACCU_HIGH, &high);
738 if (ret < 0)
739 goto exit;
740
741
742 if (high & 0x10)
743 val = (low | (med << 8) | (high << 16) | 0xFFE00000);
744 else
745 val = (low | (med << 8) | (high << 16));
746
747
748
749
750
751
752
753 di->accu_charge = (val * QLSB_NANO_AMP_HOURS_X10) /
754 (100 * di->bat->fg_res);
755
756
757
758
759
760
761
762
763
764
765 di->avg_curr = (val * QLSB_NANO_AMP_HOURS_X10 * 36) /
766 (1000 * di->bat->fg_res * (di->fg_samples / 4));
767
768 di->flags.conv_done = true;
769
770 mutex_unlock(&di->cc_lock);
771
772 queue_work(di->fg_wq, &di->fg_work);
773
774 return;
775exit:
776 dev_err(di->dev,
777 "Failed to read or write gas gauge registers\n");
778 mutex_unlock(&di->cc_lock);
779 queue_work(di->fg_wq, &di->fg_work);
780}
781
782
783
784
785
786
787
788static int ab8500_fg_bat_voltage(struct ab8500_fg *di)
789{
790 int vbat;
791 static int prev;
792
793 vbat = ab8500_gpadc_convert(di->gpadc, MAIN_BAT_V);
794 if (vbat < 0) {
795 dev_err(di->dev,
796 "%s gpadc conversion failed, using previous value\n",
797 __func__);
798 return prev;
799 }
800
801 prev = vbat;
802 return vbat;
803}
804
805
806
807
808
809
810
811
812static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage)
813{
814 int i, tbl_size;
815 struct abx500_v_to_cap *tbl;
816 int cap = 0;
817
818 tbl = di->bat->bat_type[di->bat->batt_id].v_to_cap_tbl,
819 tbl_size = di->bat->bat_type[di->bat->batt_id].n_v_cap_tbl_elements;
820
821 for (i = 0; i < tbl_size; ++i) {
822 if (voltage > tbl[i].voltage)
823 break;
824 }
825
826 if ((i > 0) && (i < tbl_size)) {
827 cap = interpolate(voltage,
828 tbl[i].voltage,
829 tbl[i].capacity * 10,
830 tbl[i-1].voltage,
831 tbl[i-1].capacity * 10);
832 } else if (i == 0) {
833 cap = 1000;
834 } else {
835 cap = 0;
836 }
837
838 dev_dbg(di->dev, "%s Vbat: %d, Cap: %d per mille",
839 __func__, voltage, cap);
840
841 return cap;
842}
843
844
845
846
847
848
849
850
851static int ab8500_fg_uncomp_volt_to_capacity(struct ab8500_fg *di)
852{
853 di->vbat = ab8500_fg_bat_voltage(di);
854 return ab8500_fg_volt_to_capacity(di, di->vbat);
855}
856
857
858
859
860
861
862
863
864static int ab8500_fg_battery_resistance(struct ab8500_fg *di)
865{
866 int i, tbl_size;
867 struct batres_vs_temp *tbl;
868 int resist = 0;
869
870 tbl = di->bat->bat_type[di->bat->batt_id].batres_tbl;
871 tbl_size = di->bat->bat_type[di->bat->batt_id].n_batres_tbl_elements;
872
873 for (i = 0; i < tbl_size; ++i) {
874 if (di->bat_temp / 10 > tbl[i].temp)
875 break;
876 }
877
878 if ((i > 0) && (i < tbl_size)) {
879 resist = interpolate(di->bat_temp / 10,
880 tbl[i].temp,
881 tbl[i].resist,
882 tbl[i-1].temp,
883 tbl[i-1].resist);
884 } else if (i == 0) {
885 resist = tbl[0].resist;
886 } else {
887 resist = tbl[tbl_size - 1].resist;
888 }
889
890 dev_dbg(di->dev, "%s Temp: %d battery internal resistance: %d"
891 " fg resistance %d, total: %d (mOhm)\n",
892 __func__, di->bat_temp, resist, di->bat->fg_res / 10,
893 (di->bat->fg_res / 10) + resist);
894
895
896 resist += di->bat->fg_res / 10;
897
898 return resist;
899}
900
901
902
903
904
905
906
907
908static int ab8500_fg_load_comp_volt_to_capacity(struct ab8500_fg *di)
909{
910 int vbat_comp, res;
911 int i = 0;
912 int vbat = 0;
913
914 ab8500_fg_inst_curr_start(di);
915
916 do {
917 vbat += ab8500_fg_bat_voltage(di);
918 i++;
919 msleep(5);
920 } while (!ab8500_fg_inst_curr_done(di));
921
922 ab8500_fg_inst_curr_finalize(di, &di->inst_curr);
923
924 di->vbat = vbat / i;
925 res = ab8500_fg_battery_resistance(di);
926
927
928 vbat_comp = di->vbat - (di->inst_curr * res) / 1000;
929
930 dev_dbg(di->dev, "%s Measured Vbat: %dmV,Compensated Vbat %dmV, "
931 "R: %dmOhm, Current: %dmA Vbat Samples: %d\n",
932 __func__, di->vbat, vbat_comp, res, di->inst_curr, i);
933
934 return ab8500_fg_volt_to_capacity(di, vbat_comp);
935}
936
937
938
939
940
941
942
943
944static int ab8500_fg_convert_mah_to_permille(struct ab8500_fg *di, int cap_mah)
945{
946 return (cap_mah * 1000) / di->bat_cap.max_mah_design;
947}
948
949
950
951
952
953
954
955
956static int ab8500_fg_convert_permille_to_mah(struct ab8500_fg *di, int cap_pm)
957{
958 return cap_pm * di->bat_cap.max_mah_design / 1000;
959}
960
961
962
963
964
965
966
967
968static int ab8500_fg_convert_mah_to_uwh(struct ab8500_fg *di, int cap_mah)
969{
970 u64 div_res;
971 u32 div_rem;
972
973 div_res = ((u64) cap_mah) * ((u64) di->vbat_nom);
974 div_rem = do_div(div_res, 1000);
975
976
977 if (div_rem >= 1000 / 2)
978 div_res++;
979
980 return (int) div_res;
981}
982
983
984
985
986
987
988
989
990static int ab8500_fg_calc_cap_charging(struct ab8500_fg *di)
991{
992 dev_dbg(di->dev, "%s cap_mah %d accu_charge %d\n",
993 __func__,
994 di->bat_cap.mah,
995 di->accu_charge);
996
997
998 if (di->bat_cap.mah + di->accu_charge > 0)
999 di->bat_cap.mah += di->accu_charge;
1000 else
1001 di->bat_cap.mah = 0;
1002
1003
1004
1005
1006 if (di->bat_cap.mah >= di->bat_cap.max_mah_design ||
1007 di->flags.force_full) {
1008 di->bat_cap.mah = di->bat_cap.max_mah_design;
1009 }
1010
1011 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah);
1012 di->bat_cap.permille =
1013 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah);
1014
1015
1016 di->vbat = ab8500_fg_bat_voltage(di);
1017 di->inst_curr = ab8500_fg_inst_curr_blocking(di);
1018
1019 return di->bat_cap.mah;
1020}
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031static int ab8500_fg_calc_cap_discharge_voltage(struct ab8500_fg *di, bool comp)
1032{
1033 int permille, mah;
1034
1035 if (comp)
1036 permille = ab8500_fg_load_comp_volt_to_capacity(di);
1037 else
1038 permille = ab8500_fg_uncomp_volt_to_capacity(di);
1039
1040 mah = ab8500_fg_convert_permille_to_mah(di, permille);
1041
1042 di->bat_cap.mah = ab8500_fg_add_cap_sample(di, mah);
1043 di->bat_cap.permille =
1044 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah);
1045
1046 return di->bat_cap.mah;
1047}
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057static int ab8500_fg_calc_cap_discharge_fg(struct ab8500_fg *di)
1058{
1059 int permille_volt, permille;
1060
1061 dev_dbg(di->dev, "%s cap_mah %d accu_charge %d\n",
1062 __func__,
1063 di->bat_cap.mah,
1064 di->accu_charge);
1065
1066
1067 if (di->bat_cap.mah + di->accu_charge > 0)
1068 di->bat_cap.mah += di->accu_charge;
1069 else
1070 di->bat_cap.mah = 0;
1071
1072 if (di->bat_cap.mah >= di->bat_cap.max_mah_design)
1073 di->bat_cap.mah = di->bat_cap.max_mah_design;
1074
1075
1076
1077
1078
1079 permille = ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah);
1080 permille_volt = ab8500_fg_uncomp_volt_to_capacity(di);
1081
1082 if (permille < permille_volt) {
1083 di->bat_cap.permille = permille_volt;
1084 di->bat_cap.mah = ab8500_fg_convert_permille_to_mah(di,
1085 di->bat_cap.permille);
1086
1087 dev_dbg(di->dev, "%s voltage based: perm %d perm_volt %d\n",
1088 __func__,
1089 permille,
1090 permille_volt);
1091
1092 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah);
1093 } else {
1094 ab8500_fg_fill_cap_sample(di, di->bat_cap.mah);
1095 di->bat_cap.permille =
1096 ab8500_fg_convert_mah_to_permille(di, di->bat_cap.mah);
1097 }
1098
1099 return di->bat_cap.mah;
1100}
1101
1102
1103
1104
1105
1106
1107
1108static int ab8500_fg_capacity_level(struct ab8500_fg *di)
1109{
1110 int ret, percent;
1111
1112 percent = di->bat_cap.permille / 10;
1113
1114 if (percent <= di->bat->cap_levels->critical ||
1115 di->flags.low_bat)
1116 ret = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
1117 else if (percent <= di->bat->cap_levels->low)
1118 ret = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
1119 else if (percent <= di->bat->cap_levels->normal)
1120 ret = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
1121 else if (percent <= di->bat->cap_levels->high)
1122 ret = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
1123 else
1124 ret = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
1125
1126 return ret;
1127}
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137static void ab8500_fg_check_capacity_limits(struct ab8500_fg *di, bool init)
1138{
1139 bool changed = false;
1140
1141 di->bat_cap.level = ab8500_fg_capacity_level(di);
1142
1143 if (di->bat_cap.level != di->bat_cap.prev_level) {
1144
1145
1146
1147
1148 if (!(!di->flags.charging && di->bat_cap.level >
1149 di->bat_cap.prev_level) || init) {
1150 dev_dbg(di->dev, "level changed from %d to %d\n",
1151 di->bat_cap.prev_level,
1152 di->bat_cap.level);
1153 di->bat_cap.prev_level = di->bat_cap.level;
1154 changed = true;
1155 } else {
1156 dev_dbg(di->dev, "level not allowed to go up "
1157 "since no charger is connected: %d to %d\n",
1158 di->bat_cap.prev_level,
1159 di->bat_cap.level);
1160 }
1161 }
1162
1163
1164
1165
1166
1167 if (di->flags.low_bat) {
1168 dev_dbg(di->dev, "Battery low, set capacity to 0\n");
1169 di->bat_cap.prev_percent = 0;
1170 di->bat_cap.permille = 0;
1171 di->bat_cap.prev_mah = 0;
1172 di->bat_cap.mah = 0;
1173 changed = true;
1174 } else if (di->flags.fully_charged) {
1175
1176
1177
1178
1179 if (di->flags.force_full) {
1180 di->bat_cap.prev_percent = di->bat_cap.permille / 10;
1181 di->bat_cap.prev_mah = di->bat_cap.mah;
1182 } else if (!di->flags.force_full &&
1183 di->bat_cap.prev_percent !=
1184 (di->bat_cap.permille) / 10 &&
1185 (di->bat_cap.permille / 10) <
1186 di->bat->fg_params->maint_thres) {
1187 dev_dbg(di->dev,
1188 "battery reported full "
1189 "but capacity dropping: %d\n",
1190 di->bat_cap.permille / 10);
1191 di->bat_cap.prev_percent = di->bat_cap.permille / 10;
1192 di->bat_cap.prev_mah = di->bat_cap.mah;
1193
1194 changed = true;
1195 }
1196 } else if (di->bat_cap.prev_percent != di->bat_cap.permille / 10) {
1197 if (di->bat_cap.permille / 10 == 0) {
1198
1199
1200
1201
1202
1203 di->bat_cap.prev_percent = 1;
1204 di->bat_cap.permille = 1;
1205 di->bat_cap.prev_mah = 1;
1206 di->bat_cap.mah = 1;
1207
1208 changed = true;
1209 } else if (!(!di->flags.charging &&
1210 (di->bat_cap.permille / 10) >
1211 di->bat_cap.prev_percent) || init) {
1212
1213
1214
1215
1216 dev_dbg(di->dev,
1217 "capacity changed from %d to %d (%d)\n",
1218 di->bat_cap.prev_percent,
1219 di->bat_cap.permille / 10,
1220 di->bat_cap.permille);
1221 di->bat_cap.prev_percent = di->bat_cap.permille / 10;
1222 di->bat_cap.prev_mah = di->bat_cap.mah;
1223
1224 changed = true;
1225 } else {
1226 dev_dbg(di->dev, "capacity not allowed to go up since "
1227 "no charger is connected: %d to %d (%d)\n",
1228 di->bat_cap.prev_percent,
1229 di->bat_cap.permille / 10,
1230 di->bat_cap.permille);
1231 }
1232 }
1233
1234 if (changed) {
1235 power_supply_changed(&di->fg_psy);
1236 if (di->flags.fully_charged && di->flags.force_full) {
1237 dev_dbg(di->dev, "Battery full, notifying.\n");
1238 di->flags.force_full = false;
1239 sysfs_notify(&di->fg_kobject, NULL, "charge_full");
1240 }
1241 sysfs_notify(&di->fg_kobject, NULL, "charge_now");
1242 }
1243}
1244
1245static void ab8500_fg_charge_state_to(struct ab8500_fg *di,
1246 enum ab8500_fg_charge_state new_state)
1247{
1248 dev_dbg(di->dev, "Charge state from %d [%s] to %d [%s]\n",
1249 di->charge_state,
1250 charge_state[di->charge_state],
1251 new_state,
1252 charge_state[new_state]);
1253
1254 di->charge_state = new_state;
1255}
1256
1257static void ab8500_fg_discharge_state_to(struct ab8500_fg *di,
1258 enum ab8500_fg_discharge_state new_state)
1259{
1260 dev_dbg(di->dev, "Disharge state from %d [%s] to %d [%s]\n",
1261 di->discharge_state,
1262 discharge_state[di->discharge_state],
1263 new_state,
1264 discharge_state[new_state]);
1265
1266 di->discharge_state = new_state;
1267}
1268
1269
1270
1271
1272
1273
1274
1275static void ab8500_fg_algorithm_charging(struct ab8500_fg *di)
1276{
1277
1278
1279
1280
1281 if (di->discharge_state != AB8500_FG_DISCHARGE_INIT_RECOVERY)
1282 ab8500_fg_discharge_state_to(di,
1283 AB8500_FG_DISCHARGE_INIT_RECOVERY);
1284
1285 switch (di->charge_state) {
1286 case AB8500_FG_CHARGE_INIT:
1287 di->fg_samples = SEC_TO_SAMPLE(
1288 di->bat->fg_params->accu_charging);
1289
1290 ab8500_fg_coulomb_counter(di, true);
1291 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_READOUT);
1292
1293 break;
1294
1295 case AB8500_FG_CHARGE_READOUT:
1296
1297
1298
1299 mutex_lock(&di->cc_lock);
1300 if (!di->flags.conv_done) {
1301
1302 mutex_unlock(&di->cc_lock);
1303 dev_dbg(di->dev, "%s CC conv not done\n",
1304 __func__);
1305
1306 break;
1307 }
1308 di->flags.conv_done = false;
1309 mutex_unlock(&di->cc_lock);
1310
1311 ab8500_fg_calc_cap_charging(di);
1312
1313 break;
1314
1315 default:
1316 break;
1317 }
1318
1319
1320 ab8500_fg_check_capacity_limits(di, false);
1321}
1322
1323static void force_capacity(struct ab8500_fg *di)
1324{
1325 int cap;
1326
1327 ab8500_fg_clear_cap_samples(di);
1328 cap = di->bat_cap.user_mah;
1329 if (cap > di->bat_cap.max_mah_design) {
1330 dev_dbg(di->dev, "Remaining cap %d can't be bigger than total"
1331 " %d\n", cap, di->bat_cap.max_mah_design);
1332 cap = di->bat_cap.max_mah_design;
1333 }
1334 ab8500_fg_fill_cap_sample(di, di->bat_cap.user_mah);
1335 di->bat_cap.permille = ab8500_fg_convert_mah_to_permille(di, cap);
1336 di->bat_cap.mah = cap;
1337 ab8500_fg_check_capacity_limits(di, true);
1338}
1339
1340static bool check_sysfs_capacity(struct ab8500_fg *di)
1341{
1342 int cap, lower, upper;
1343 int cap_permille;
1344
1345 cap = di->bat_cap.user_mah;
1346
1347 cap_permille = ab8500_fg_convert_mah_to_permille(di,
1348 di->bat_cap.user_mah);
1349
1350 lower = di->bat_cap.permille - di->bat->fg_params->user_cap_limit * 10;
1351 upper = di->bat_cap.permille + di->bat->fg_params->user_cap_limit * 10;
1352
1353 if (lower < 0)
1354 lower = 0;
1355
1356 if (upper > 1000)
1357 upper = 1000;
1358
1359 dev_dbg(di->dev, "Capacity limits:"
1360 " (Lower: %d User: %d Upper: %d) [user: %d, was: %d]\n",
1361 lower, cap_permille, upper, cap, di->bat_cap.mah);
1362
1363
1364 if (cap_permille > lower && cap_permille < upper) {
1365 dev_dbg(di->dev, "OK! Using users cap %d uAh now\n", cap);
1366 force_capacity(di);
1367 return true;
1368 }
1369 dev_dbg(di->dev, "Capacity from user out of limits, ignoring");
1370 return false;
1371}
1372
1373
1374
1375
1376
1377
1378
1379static void ab8500_fg_algorithm_discharging(struct ab8500_fg *di)
1380{
1381 int sleep_time;
1382
1383
1384 if (di->charge_state != AB8500_FG_CHARGE_INIT)
1385 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT);
1386
1387 switch (di->discharge_state) {
1388 case AB8500_FG_DISCHARGE_INIT:
1389
1390 di->init_cnt = 0;
1391 di->fg_samples = SEC_TO_SAMPLE(di->bat->fg_params->init_timer);
1392 ab8500_fg_coulomb_counter(di, true);
1393 ab8500_fg_discharge_state_to(di,
1394 AB8500_FG_DISCHARGE_INITMEASURING);
1395
1396
1397 case AB8500_FG_DISCHARGE_INITMEASURING:
1398
1399
1400
1401
1402
1403
1404 sleep_time = di->bat->fg_params->init_timer;
1405
1406
1407 if (di->init_cnt >
1408 di->bat->fg_params->init_discard_time) {
1409 ab8500_fg_calc_cap_discharge_voltage(di, true);
1410
1411 ab8500_fg_check_capacity_limits(di, true);
1412 }
1413
1414 di->init_cnt += sleep_time;
1415 if (di->init_cnt > di->bat->fg_params->init_total_time)
1416 ab8500_fg_discharge_state_to(di,
1417 AB8500_FG_DISCHARGE_READOUT_INIT);
1418
1419 break;
1420
1421 case AB8500_FG_DISCHARGE_INIT_RECOVERY:
1422 di->recovery_cnt = 0;
1423 di->recovery_needed = true;
1424 ab8500_fg_discharge_state_to(di,
1425 AB8500_FG_DISCHARGE_RECOVERY);
1426
1427
1428
1429 case AB8500_FG_DISCHARGE_RECOVERY:
1430 sleep_time = di->bat->fg_params->recovery_sleep_timer;
1431
1432
1433
1434
1435
1436
1437
1438 di->inst_curr = ab8500_fg_inst_curr_blocking(di);
1439
1440 if (ab8500_fg_is_low_curr(di, di->inst_curr)) {
1441 if (di->recovery_cnt >
1442 di->bat->fg_params->recovery_total_time) {
1443 di->fg_samples = SEC_TO_SAMPLE(
1444 di->bat->fg_params->accu_high_curr);
1445 ab8500_fg_coulomb_counter(di, true);
1446 ab8500_fg_discharge_state_to(di,
1447 AB8500_FG_DISCHARGE_READOUT);
1448 di->recovery_needed = false;
1449 } else {
1450 queue_delayed_work(di->fg_wq,
1451 &di->fg_periodic_work,
1452 sleep_time * HZ);
1453 }
1454 di->recovery_cnt += sleep_time;
1455 } else {
1456 di->fg_samples = SEC_TO_SAMPLE(
1457 di->bat->fg_params->accu_high_curr);
1458 ab8500_fg_coulomb_counter(di, true);
1459 ab8500_fg_discharge_state_to(di,
1460 AB8500_FG_DISCHARGE_READOUT);
1461 }
1462 break;
1463
1464 case AB8500_FG_DISCHARGE_READOUT_INIT:
1465 di->fg_samples = SEC_TO_SAMPLE(
1466 di->bat->fg_params->accu_high_curr);
1467 ab8500_fg_coulomb_counter(di, true);
1468 ab8500_fg_discharge_state_to(di,
1469 AB8500_FG_DISCHARGE_READOUT);
1470 break;
1471
1472 case AB8500_FG_DISCHARGE_READOUT:
1473 di->inst_curr = ab8500_fg_inst_curr_blocking(di);
1474
1475 if (ab8500_fg_is_low_curr(di, di->inst_curr)) {
1476
1477 if (di->high_curr_mode) {
1478 di->high_curr_mode = false;
1479 di->high_curr_cnt = 0;
1480 }
1481
1482 if (di->recovery_needed) {
1483 ab8500_fg_discharge_state_to(di,
1484 AB8500_FG_DISCHARGE_RECOVERY);
1485
1486 queue_delayed_work(di->fg_wq,
1487 &di->fg_periodic_work, 0);
1488
1489 break;
1490 }
1491
1492 ab8500_fg_calc_cap_discharge_voltage(di, true);
1493 } else {
1494 mutex_lock(&di->cc_lock);
1495 if (!di->flags.conv_done) {
1496
1497 mutex_unlock(&di->cc_lock);
1498 dev_dbg(di->dev, "%s CC conv not done\n",
1499 __func__);
1500
1501 break;
1502 }
1503 di->flags.conv_done = false;
1504 mutex_unlock(&di->cc_lock);
1505
1506
1507 if (!di->high_curr_mode) {
1508 di->high_curr_mode = true;
1509 di->high_curr_cnt = 0;
1510 }
1511
1512 di->high_curr_cnt +=
1513 di->bat->fg_params->accu_high_curr;
1514 if (di->high_curr_cnt >
1515 di->bat->fg_params->high_curr_time)
1516 di->recovery_needed = true;
1517
1518 ab8500_fg_calc_cap_discharge_fg(di);
1519 }
1520
1521 ab8500_fg_check_capacity_limits(di, false);
1522
1523 break;
1524
1525 case AB8500_FG_DISCHARGE_WAKEUP:
1526 ab8500_fg_coulomb_counter(di, true);
1527 di->inst_curr = ab8500_fg_inst_curr_blocking(di);
1528
1529 ab8500_fg_calc_cap_discharge_voltage(di, true);
1530
1531 di->fg_samples = SEC_TO_SAMPLE(
1532 di->bat->fg_params->accu_high_curr);
1533 ab8500_fg_coulomb_counter(di, true);
1534 ab8500_fg_discharge_state_to(di,
1535 AB8500_FG_DISCHARGE_READOUT);
1536
1537 ab8500_fg_check_capacity_limits(di, false);
1538
1539 break;
1540
1541 default:
1542 break;
1543 }
1544}
1545
1546
1547
1548
1549
1550
1551static void ab8500_fg_algorithm_calibrate(struct ab8500_fg *di)
1552{
1553 int ret;
1554
1555 switch (di->calib_state) {
1556 case AB8500_FG_CALIB_INIT:
1557 dev_dbg(di->dev, "Calibration ongoing...\n");
1558
1559 ret = abx500_mask_and_set_register_interruptible(di->dev,
1560 AB8500_GAS_GAUGE, AB8500_GASG_CC_CTRL_REG,
1561 CC_INT_CAL_N_AVG_MASK, CC_INT_CAL_SAMPLES_8);
1562 if (ret < 0)
1563 goto err;
1564
1565 ret = abx500_mask_and_set_register_interruptible(di->dev,
1566 AB8500_GAS_GAUGE, AB8500_GASG_CC_CTRL_REG,
1567 CC_INTAVGOFFSET_ENA, CC_INTAVGOFFSET_ENA);
1568 if (ret < 0)
1569 goto err;
1570 di->calib_state = AB8500_FG_CALIB_WAIT;
1571 break;
1572 case AB8500_FG_CALIB_END:
1573 ret = abx500_mask_and_set_register_interruptible(di->dev,
1574 AB8500_GAS_GAUGE, AB8500_GASG_CC_CTRL_REG,
1575 CC_MUXOFFSET, CC_MUXOFFSET);
1576 if (ret < 0)
1577 goto err;
1578 di->flags.calibrate = false;
1579 dev_dbg(di->dev, "Calibration done...\n");
1580 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
1581 break;
1582 case AB8500_FG_CALIB_WAIT:
1583 dev_dbg(di->dev, "Calibration WFI\n");
1584 default:
1585 break;
1586 }
1587 return;
1588err:
1589
1590 dev_err(di->dev, "failed to calibrate the CC\n");
1591 di->flags.calibrate = false;
1592 di->calib_state = AB8500_FG_CALIB_INIT;
1593 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
1594}
1595
1596
1597
1598
1599
1600
1601
1602static void ab8500_fg_algorithm(struct ab8500_fg *di)
1603{
1604 if (di->flags.calibrate)
1605 ab8500_fg_algorithm_calibrate(di);
1606 else {
1607 if (di->flags.charging)
1608 ab8500_fg_algorithm_charging(di);
1609 else
1610 ab8500_fg_algorithm_discharging(di);
1611 }
1612
1613 dev_dbg(di->dev, "[FG_DATA] %d %d %d %d %d %d %d %d %d "
1614 "%d %d %d %d %d %d %d\n",
1615 di->bat_cap.max_mah_design,
1616 di->bat_cap.mah,
1617 di->bat_cap.permille,
1618 di->bat_cap.level,
1619 di->bat_cap.prev_mah,
1620 di->bat_cap.prev_percent,
1621 di->bat_cap.prev_level,
1622 di->vbat,
1623 di->inst_curr,
1624 di->avg_curr,
1625 di->accu_charge,
1626 di->flags.charging,
1627 di->charge_state,
1628 di->discharge_state,
1629 di->high_curr_mode,
1630 di->recovery_needed);
1631}
1632
1633
1634
1635
1636
1637
1638
1639static void ab8500_fg_periodic_work(struct work_struct *work)
1640{
1641 struct ab8500_fg *di = container_of(work, struct ab8500_fg,
1642 fg_periodic_work.work);
1643
1644 if (di->init_capacity) {
1645
1646 di->inst_curr = ab8500_fg_inst_curr_blocking(di);
1647
1648 ab8500_fg_calc_cap_discharge_voltage(di, true);
1649 ab8500_fg_check_capacity_limits(di, true);
1650 di->init_capacity = false;
1651
1652 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
1653 } else if (di->flags.user_cap) {
1654 if (check_sysfs_capacity(di)) {
1655 ab8500_fg_check_capacity_limits(di, true);
1656 if (di->flags.charging)
1657 ab8500_fg_charge_state_to(di,
1658 AB8500_FG_CHARGE_INIT);
1659 else
1660 ab8500_fg_discharge_state_to(di,
1661 AB8500_FG_DISCHARGE_READOUT_INIT);
1662 }
1663 di->flags.user_cap = false;
1664 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
1665 } else
1666 ab8500_fg_algorithm(di);
1667
1668}
1669
1670
1671
1672
1673
1674
1675
1676static void ab8500_fg_check_hw_failure_work(struct work_struct *work)
1677{
1678 int ret;
1679 u8 reg_value;
1680
1681 struct ab8500_fg *di = container_of(work, struct ab8500_fg,
1682 fg_check_hw_failure_work.work);
1683
1684
1685
1686
1687
1688 if (di->flags.bat_ovv) {
1689 ret = abx500_get_register_interruptible(di->dev,
1690 AB8500_CHARGER, AB8500_CH_STAT_REG,
1691 ®_value);
1692 if (ret < 0) {
1693 dev_err(di->dev, "%s ab8500 read failed\n", __func__);
1694 return;
1695 }
1696 if ((reg_value & BATT_OVV) != BATT_OVV) {
1697 dev_dbg(di->dev, "Battery recovered from OVV\n");
1698 di->flags.bat_ovv = false;
1699 power_supply_changed(&di->fg_psy);
1700 return;
1701 }
1702
1703
1704 queue_delayed_work(di->fg_wq, &di->fg_check_hw_failure_work,
1705 round_jiffies(HZ));
1706 }
1707}
1708
1709
1710
1711
1712
1713
1714
1715static void ab8500_fg_low_bat_work(struct work_struct *work)
1716{
1717 int vbat;
1718
1719 struct ab8500_fg *di = container_of(work, struct ab8500_fg,
1720 fg_low_bat_work.work);
1721
1722 vbat = ab8500_fg_bat_voltage(di);
1723
1724
1725 if (vbat < di->bat->fg_params->lowbat_threshold) {
1726 di->flags.low_bat = true;
1727 dev_warn(di->dev, "Battery voltage still LOW\n");
1728
1729
1730
1731
1732
1733 queue_delayed_work(di->fg_wq, &di->fg_low_bat_work,
1734 round_jiffies(LOW_BAT_CHECK_INTERVAL));
1735 } else {
1736 di->flags.low_bat = false;
1737 dev_warn(di->dev, "Battery voltage OK again\n");
1738 }
1739
1740
1741 ab8500_fg_check_capacity_limits(di, false);
1742
1743
1744 di->flags.low_bat_delay = false;
1745}
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757static int ab8500_fg_battok_calc(struct ab8500_fg *di, int target)
1758{
1759 if (target > BATT_OK_MIN +
1760 (BATT_OK_INCREMENT * BATT_OK_MAX_NR_INCREMENTS))
1761 return BATT_OK_MAX_NR_INCREMENTS;
1762 if (target < BATT_OK_MIN)
1763 return 0;
1764 return (target - BATT_OK_MIN) / BATT_OK_INCREMENT;
1765}
1766
1767
1768
1769
1770
1771
1772
1773static int ab8500_fg_battok_init_hw_register(struct ab8500_fg *di)
1774{
1775 int selected;
1776 int sel0;
1777 int sel1;
1778 int cbp_sel0;
1779 int cbp_sel1;
1780 int ret;
1781 int new_val;
1782
1783 sel0 = di->bat->fg_params->battok_falling_th_sel0;
1784 sel1 = di->bat->fg_params->battok_raising_th_sel1;
1785
1786 cbp_sel0 = ab8500_fg_battok_calc(di, sel0);
1787 cbp_sel1 = ab8500_fg_battok_calc(di, sel1);
1788
1789 selected = BATT_OK_MIN + cbp_sel0 * BATT_OK_INCREMENT;
1790
1791 if (selected != sel0)
1792 dev_warn(di->dev, "Invalid voltage step:%d, using %d %d\n",
1793 sel0, selected, cbp_sel0);
1794
1795 selected = BATT_OK_MIN + cbp_sel1 * BATT_OK_INCREMENT;
1796
1797 if (selected != sel1)
1798 dev_warn(di->dev, "Invalid voltage step:%d, using %d %d\n",
1799 sel1, selected, cbp_sel1);
1800
1801 new_val = cbp_sel0 | (cbp_sel1 << 4);
1802
1803 dev_dbg(di->dev, "using: %x %d %d\n", new_val, cbp_sel0, cbp_sel1);
1804 ret = abx500_set_register_interruptible(di->dev, AB8500_SYS_CTRL2_BLOCK,
1805 AB8500_BATT_OK_REG, new_val);
1806 return ret;
1807}
1808
1809
1810
1811
1812
1813
1814
1815static void ab8500_fg_instant_work(struct work_struct *work)
1816{
1817 struct ab8500_fg *di = container_of(work, struct ab8500_fg, fg_work);
1818
1819 ab8500_fg_algorithm(di);
1820}
1821
1822
1823
1824
1825
1826
1827
1828
1829static irqreturn_t ab8500_fg_cc_data_end_handler(int irq, void *_di)
1830{
1831 struct ab8500_fg *di = _di;
1832 complete(&di->ab8500_fg_complete);
1833 return IRQ_HANDLED;
1834}
1835
1836
1837
1838
1839
1840
1841
1842
1843static irqreturn_t ab8500_fg_cc_int_calib_handler(int irq, void *_di)
1844{
1845 struct ab8500_fg *di = _di;
1846 di->calib_state = AB8500_FG_CALIB_END;
1847 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
1848 return IRQ_HANDLED;
1849}
1850
1851
1852
1853
1854
1855
1856
1857
1858static irqreturn_t ab8500_fg_cc_convend_handler(int irq, void *_di)
1859{
1860 struct ab8500_fg *di = _di;
1861
1862 queue_work(di->fg_wq, &di->fg_acc_cur_work);
1863
1864 return IRQ_HANDLED;
1865}
1866
1867
1868
1869
1870
1871
1872
1873
1874static irqreturn_t ab8500_fg_batt_ovv_handler(int irq, void *_di)
1875{
1876 struct ab8500_fg *di = _di;
1877
1878 dev_dbg(di->dev, "Battery OVV\n");
1879 di->flags.bat_ovv = true;
1880 power_supply_changed(&di->fg_psy);
1881
1882
1883 queue_delayed_work(di->fg_wq, &di->fg_check_hw_failure_work, 0);
1884
1885 return IRQ_HANDLED;
1886}
1887
1888
1889
1890
1891
1892
1893
1894
1895static irqreturn_t ab8500_fg_lowbatf_handler(int irq, void *_di)
1896{
1897 struct ab8500_fg *di = _di;
1898
1899 if (!di->flags.low_bat_delay) {
1900 dev_warn(di->dev, "Battery voltage is below LOW threshold\n");
1901 di->flags.low_bat_delay = true;
1902
1903
1904
1905
1906 queue_delayed_work(di->fg_wq, &di->fg_low_bat_work,
1907 round_jiffies(LOW_BAT_CHECK_INTERVAL));
1908 }
1909 return IRQ_HANDLED;
1910}
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930static int ab8500_fg_get_property(struct power_supply *psy,
1931 enum power_supply_property psp,
1932 union power_supply_propval *val)
1933{
1934 struct ab8500_fg *di;
1935
1936 di = to_ab8500_fg_device_info(psy);
1937
1938
1939
1940
1941
1942
1943
1944
1945 switch (psp) {
1946 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1947 if (di->flags.bat_ovv)
1948 val->intval = BATT_OVV_VALUE * 1000;
1949 else
1950 val->intval = di->vbat * 1000;
1951 break;
1952 case POWER_SUPPLY_PROP_CURRENT_NOW:
1953 val->intval = di->inst_curr * 1000;
1954 break;
1955 case POWER_SUPPLY_PROP_CURRENT_AVG:
1956 val->intval = di->avg_curr * 1000;
1957 break;
1958 case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
1959 val->intval = ab8500_fg_convert_mah_to_uwh(di,
1960 di->bat_cap.max_mah_design);
1961 break;
1962 case POWER_SUPPLY_PROP_ENERGY_FULL:
1963 val->intval = ab8500_fg_convert_mah_to_uwh(di,
1964 di->bat_cap.max_mah);
1965 break;
1966 case POWER_SUPPLY_PROP_ENERGY_NOW:
1967 if (di->flags.batt_unknown && !di->bat->chg_unknown_bat &&
1968 di->flags.batt_id_received)
1969 val->intval = ab8500_fg_convert_mah_to_uwh(di,
1970 di->bat_cap.max_mah);
1971 else
1972 val->intval = ab8500_fg_convert_mah_to_uwh(di,
1973 di->bat_cap.prev_mah);
1974 break;
1975 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
1976 val->intval = di->bat_cap.max_mah_design;
1977 break;
1978 case POWER_SUPPLY_PROP_CHARGE_FULL:
1979 val->intval = di->bat_cap.max_mah;
1980 break;
1981 case POWER_SUPPLY_PROP_CHARGE_NOW:
1982 if (di->flags.batt_unknown && !di->bat->chg_unknown_bat &&
1983 di->flags.batt_id_received)
1984 val->intval = di->bat_cap.max_mah;
1985 else
1986 val->intval = di->bat_cap.prev_mah;
1987 break;
1988 case POWER_SUPPLY_PROP_CAPACITY:
1989 if (di->flags.batt_unknown && !di->bat->chg_unknown_bat &&
1990 di->flags.batt_id_received)
1991 val->intval = 100;
1992 else
1993 val->intval = di->bat_cap.prev_percent;
1994 break;
1995 case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
1996 if (di->flags.batt_unknown && !di->bat->chg_unknown_bat &&
1997 di->flags.batt_id_received)
1998 val->intval = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
1999 else
2000 val->intval = di->bat_cap.prev_level;
2001 break;
2002 default:
2003 return -EINVAL;
2004 }
2005 return 0;
2006}
2007
2008static int ab8500_fg_get_ext_psy_data(struct device *dev, void *data)
2009{
2010 struct power_supply *psy;
2011 struct power_supply *ext;
2012 struct ab8500_fg *di;
2013 union power_supply_propval ret;
2014 int i, j;
2015 bool psy_found = false;
2016
2017 psy = (struct power_supply *)data;
2018 ext = dev_get_drvdata(dev);
2019 di = to_ab8500_fg_device_info(psy);
2020
2021
2022
2023
2024
2025 for (i = 0; i < ext->num_supplicants; i++) {
2026 if (!strcmp(ext->supplied_to[i], psy->name))
2027 psy_found = true;
2028 }
2029
2030 if (!psy_found)
2031 return 0;
2032
2033
2034 for (j = 0; j < ext->num_properties; j++) {
2035 enum power_supply_property prop;
2036 prop = ext->properties[j];
2037
2038 if (ext->get_property(ext, prop, &ret))
2039 continue;
2040
2041 switch (prop) {
2042 case POWER_SUPPLY_PROP_STATUS:
2043 switch (ext->type) {
2044 case POWER_SUPPLY_TYPE_BATTERY:
2045 switch (ret.intval) {
2046 case POWER_SUPPLY_STATUS_UNKNOWN:
2047 case POWER_SUPPLY_STATUS_DISCHARGING:
2048 case POWER_SUPPLY_STATUS_NOT_CHARGING:
2049 if (!di->flags.charging)
2050 break;
2051 di->flags.charging = false;
2052 di->flags.fully_charged = false;
2053 queue_work(di->fg_wq, &di->fg_work);
2054 break;
2055 case POWER_SUPPLY_STATUS_FULL:
2056 if (di->flags.fully_charged)
2057 break;
2058 di->flags.fully_charged = true;
2059 di->flags.force_full = true;
2060
2061 di->bat_cap.max_mah = di->bat_cap.mah;
2062 queue_work(di->fg_wq, &di->fg_work);
2063 break;
2064 case POWER_SUPPLY_STATUS_CHARGING:
2065 if (di->flags.charging)
2066 break;
2067 di->flags.charging = true;
2068 di->flags.fully_charged = false;
2069 queue_work(di->fg_wq, &di->fg_work);
2070 break;
2071 };
2072 default:
2073 break;
2074 };
2075 break;
2076 case POWER_SUPPLY_PROP_TECHNOLOGY:
2077 switch (ext->type) {
2078 case POWER_SUPPLY_TYPE_BATTERY:
2079 if (!di->flags.batt_id_received) {
2080 const struct abx500_battery_type *b;
2081
2082 b = &(di->bat->bat_type[di->bat->batt_id]);
2083
2084 di->flags.batt_id_received = true;
2085
2086 di->bat_cap.max_mah_design =
2087 MILLI_TO_MICRO *
2088 b->charge_full_design;
2089
2090 di->bat_cap.max_mah =
2091 di->bat_cap.max_mah_design;
2092
2093 di->vbat_nom = b->nominal_voltage;
2094 }
2095
2096 if (ret.intval)
2097 di->flags.batt_unknown = false;
2098 else
2099 di->flags.batt_unknown = true;
2100 break;
2101 default:
2102 break;
2103 }
2104 break;
2105 case POWER_SUPPLY_PROP_TEMP:
2106 switch (ext->type) {
2107 case POWER_SUPPLY_TYPE_BATTERY:
2108 if (di->flags.batt_id_received)
2109 di->bat_temp = ret.intval;
2110 break;
2111 default:
2112 break;
2113 }
2114 break;
2115 default:
2116 break;
2117 }
2118 }
2119 return 0;
2120}
2121
2122
2123
2124
2125
2126
2127
2128static int ab8500_fg_init_hw_registers(struct ab8500_fg *di)
2129{
2130 int ret;
2131
2132
2133 ret = abx500_mask_and_set_register_interruptible(di->dev,
2134 AB8500_CHARGER,
2135 AB8500_BATT_OVV,
2136 BATT_OVV_TH_4P75,
2137 BATT_OVV_TH_4P75);
2138 if (ret) {
2139 dev_err(di->dev, "failed to set BATT_OVV\n");
2140 goto out;
2141 }
2142
2143
2144 ret = abx500_mask_and_set_register_interruptible(di->dev,
2145 AB8500_CHARGER,
2146 AB8500_BATT_OVV,
2147 BATT_OVV_ENA,
2148 BATT_OVV_ENA);
2149 if (ret) {
2150 dev_err(di->dev, "failed to enable BATT_OVV\n");
2151 goto out;
2152 }
2153
2154
2155 ret = abx500_set_register_interruptible(di->dev,
2156 AB8500_SYS_CTRL2_BLOCK,
2157 AB8500_LOW_BAT_REG,
2158 ab8500_volt_to_regval(
2159 di->bat->fg_params->lowbat_threshold) << 1 |
2160 LOW_BAT_ENABLE);
2161 if (ret) {
2162 dev_err(di->dev, "%s write failed\n", __func__);
2163 goto out;
2164 }
2165
2166
2167 ret = ab8500_fg_battok_init_hw_register(di);
2168 if (ret) {
2169 dev_err(di->dev, "BattOk init write failed.\n");
2170 goto out;
2171 }
2172out:
2173 return ret;
2174}
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185static void ab8500_fg_external_power_changed(struct power_supply *psy)
2186{
2187 struct ab8500_fg *di = to_ab8500_fg_device_info(psy);
2188
2189 class_for_each_device(power_supply_class, NULL,
2190 &di->fg_psy, ab8500_fg_get_ext_psy_data);
2191}
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201static void ab8500_fg_reinit_work(struct work_struct *work)
2202{
2203 struct ab8500_fg *di = container_of(work, struct ab8500_fg,
2204 fg_reinit_work.work);
2205
2206 if (di->flags.calibrate == false) {
2207 dev_dbg(di->dev, "Resetting FG state machine to init.\n");
2208 ab8500_fg_clear_cap_samples(di);
2209 ab8500_fg_calc_cap_discharge_voltage(di, true);
2210 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT);
2211 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_INIT);
2212 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
2213
2214 } else {
2215 dev_err(di->dev, "Residual offset calibration ongoing "
2216 "retrying..\n");
2217
2218 queue_delayed_work(di->fg_wq, &di->fg_reinit_work,
2219 round_jiffies(1));
2220 }
2221}
2222
2223
2224
2225
2226
2227
2228
2229void ab8500_fg_reinit(void)
2230{
2231 struct ab8500_fg *di = ab8500_fg_get();
2232
2233 if (di != NULL)
2234 queue_delayed_work(di->fg_wq, &di->fg_reinit_work, 0);
2235}
2236
2237
2238
2239struct ab8500_fg_sysfs_entry {
2240 struct attribute attr;
2241 ssize_t (*show)(struct ab8500_fg *, char *);
2242 ssize_t (*store)(struct ab8500_fg *, const char *, size_t);
2243};
2244
2245static ssize_t charge_full_show(struct ab8500_fg *di, char *buf)
2246{
2247 return sprintf(buf, "%d\n", di->bat_cap.max_mah);
2248}
2249
2250static ssize_t charge_full_store(struct ab8500_fg *di, const char *buf,
2251 size_t count)
2252{
2253 unsigned long charge_full;
2254 ssize_t ret = -EINVAL;
2255
2256 ret = strict_strtoul(buf, 10, &charge_full);
2257
2258 dev_dbg(di->dev, "Ret %zd charge_full %lu", ret, charge_full);
2259
2260 if (!ret) {
2261 di->bat_cap.max_mah = (int) charge_full;
2262 ret = count;
2263 }
2264 return ret;
2265}
2266
2267static ssize_t charge_now_show(struct ab8500_fg *di, char *buf)
2268{
2269 return sprintf(buf, "%d\n", di->bat_cap.prev_mah);
2270}
2271
2272static ssize_t charge_now_store(struct ab8500_fg *di, const char *buf,
2273 size_t count)
2274{
2275 unsigned long charge_now;
2276 ssize_t ret;
2277
2278 ret = strict_strtoul(buf, 10, &charge_now);
2279
2280 dev_dbg(di->dev, "Ret %zd charge_now %lu was %d",
2281 ret, charge_now, di->bat_cap.prev_mah);
2282
2283 if (!ret) {
2284 di->bat_cap.user_mah = (int) charge_now;
2285 di->flags.user_cap = true;
2286 ret = count;
2287 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
2288 }
2289 return ret;
2290}
2291
2292static struct ab8500_fg_sysfs_entry charge_full_attr =
2293 __ATTR(charge_full, 0644, charge_full_show, charge_full_store);
2294
2295static struct ab8500_fg_sysfs_entry charge_now_attr =
2296 __ATTR(charge_now, 0644, charge_now_show, charge_now_store);
2297
2298static ssize_t
2299ab8500_fg_show(struct kobject *kobj, struct attribute *attr, char *buf)
2300{
2301 struct ab8500_fg_sysfs_entry *entry;
2302 struct ab8500_fg *di;
2303
2304 entry = container_of(attr, struct ab8500_fg_sysfs_entry, attr);
2305 di = container_of(kobj, struct ab8500_fg, fg_kobject);
2306
2307 if (!entry->show)
2308 return -EIO;
2309
2310 return entry->show(di, buf);
2311}
2312static ssize_t
2313ab8500_fg_store(struct kobject *kobj, struct attribute *attr, const char *buf,
2314 size_t count)
2315{
2316 struct ab8500_fg_sysfs_entry *entry;
2317 struct ab8500_fg *di;
2318
2319 entry = container_of(attr, struct ab8500_fg_sysfs_entry, attr);
2320 di = container_of(kobj, struct ab8500_fg, fg_kobject);
2321
2322 if (!entry->store)
2323 return -EIO;
2324
2325 return entry->store(di, buf, count);
2326}
2327
2328static const struct sysfs_ops ab8500_fg_sysfs_ops = {
2329 .show = ab8500_fg_show,
2330 .store = ab8500_fg_store,
2331};
2332
2333static struct attribute *ab8500_fg_attrs[] = {
2334 &charge_full_attr.attr,
2335 &charge_now_attr.attr,
2336 NULL,
2337};
2338
2339static struct kobj_type ab8500_fg_ktype = {
2340 .sysfs_ops = &ab8500_fg_sysfs_ops,
2341 .default_attrs = ab8500_fg_attrs,
2342};
2343
2344
2345
2346
2347
2348
2349
2350static void ab8500_fg_sysfs_exit(struct ab8500_fg *di)
2351{
2352 kobject_del(&di->fg_kobject);
2353}
2354
2355
2356
2357
2358
2359
2360
2361
2362static int ab8500_fg_sysfs_init(struct ab8500_fg *di)
2363{
2364 int ret = 0;
2365
2366 ret = kobject_init_and_add(&di->fg_kobject,
2367 &ab8500_fg_ktype,
2368 NULL, "battery");
2369 if (ret < 0)
2370 dev_err(di->dev, "failed to create sysfs entry\n");
2371
2372 return ret;
2373}
2374
2375
2376#if defined(CONFIG_PM)
2377static int ab8500_fg_resume(struct platform_device *pdev)
2378{
2379 struct ab8500_fg *di = platform_get_drvdata(pdev);
2380
2381
2382
2383
2384
2385 if (!di->flags.charging) {
2386 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_WAKEUP);
2387 queue_work(di->fg_wq, &di->fg_work);
2388 }
2389
2390 return 0;
2391}
2392
2393static int ab8500_fg_suspend(struct platform_device *pdev,
2394 pm_message_t state)
2395{
2396 struct ab8500_fg *di = platform_get_drvdata(pdev);
2397
2398 flush_delayed_work(&di->fg_periodic_work);
2399
2400
2401
2402
2403
2404 if (di->flags.fg_enabled && !di->flags.charging)
2405 ab8500_fg_coulomb_counter(di, false);
2406
2407 return 0;
2408}
2409#else
2410#define ab8500_fg_suspend NULL
2411#define ab8500_fg_resume NULL
2412#endif
2413
2414static int __devexit ab8500_fg_remove(struct platform_device *pdev)
2415{
2416 int ret = 0;
2417 struct ab8500_fg *di = platform_get_drvdata(pdev);
2418
2419 list_del(&di->node);
2420
2421
2422 ret = ab8500_fg_coulomb_counter(di, false);
2423 if (ret)
2424 dev_err(di->dev, "failed to disable coulomb counter\n");
2425
2426 destroy_workqueue(di->fg_wq);
2427 ab8500_fg_sysfs_exit(di);
2428
2429 flush_scheduled_work();
2430 power_supply_unregister(&di->fg_psy);
2431 platform_set_drvdata(pdev, NULL);
2432 kfree(di);
2433 return ret;
2434}
2435
2436
2437static struct ab8500_fg_interrupts ab8500_fg_irq[] = {
2438 {"NCONV_ACCU", ab8500_fg_cc_convend_handler},
2439 {"BATT_OVV", ab8500_fg_batt_ovv_handler},
2440 {"LOW_BAT_F", ab8500_fg_lowbatf_handler},
2441 {"CC_INT_CALIB", ab8500_fg_cc_int_calib_handler},
2442 {"CCEOC", ab8500_fg_cc_data_end_handler},
2443};
2444
2445static int __devinit ab8500_fg_probe(struct platform_device *pdev)
2446{
2447 int i, irq;
2448 int ret = 0;
2449 struct abx500_bm_plat_data *plat_data = pdev->dev.platform_data;
2450 struct ab8500_fg *di;
2451
2452 if (!plat_data) {
2453 dev_err(&pdev->dev, "No platform data\n");
2454 return -EINVAL;
2455 }
2456
2457 di = kzalloc(sizeof(*di), GFP_KERNEL);
2458 if (!di)
2459 return -ENOMEM;
2460
2461 mutex_init(&di->cc_lock);
2462
2463
2464 di->dev = &pdev->dev;
2465 di->parent = dev_get_drvdata(pdev->dev.parent);
2466 di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
2467
2468
2469 di->pdata = plat_data->fg;
2470 if (!di->pdata) {
2471 dev_err(di->dev, "no fg platform data supplied\n");
2472 ret = -EINVAL;
2473 goto free_device_info;
2474 }
2475
2476
2477 di->bat = plat_data->battery;
2478 if (!di->bat) {
2479 dev_err(di->dev, "no battery platform data supplied\n");
2480 ret = -EINVAL;
2481 goto free_device_info;
2482 }
2483
2484 di->fg_psy.name = "ab8500_fg";
2485 di->fg_psy.type = POWER_SUPPLY_TYPE_BATTERY;
2486 di->fg_psy.properties = ab8500_fg_props;
2487 di->fg_psy.num_properties = ARRAY_SIZE(ab8500_fg_props);
2488 di->fg_psy.get_property = ab8500_fg_get_property;
2489 di->fg_psy.supplied_to = di->pdata->supplied_to;
2490 di->fg_psy.num_supplicants = di->pdata->num_supplicants;
2491 di->fg_psy.external_power_changed = ab8500_fg_external_power_changed;
2492
2493 di->bat_cap.max_mah_design = MILLI_TO_MICRO *
2494 di->bat->bat_type[di->bat->batt_id].charge_full_design;
2495
2496 di->bat_cap.max_mah = di->bat_cap.max_mah_design;
2497
2498 di->vbat_nom = di->bat->bat_type[di->bat->batt_id].nominal_voltage;
2499
2500 di->init_capacity = true;
2501
2502 ab8500_fg_charge_state_to(di, AB8500_FG_CHARGE_INIT);
2503 ab8500_fg_discharge_state_to(di, AB8500_FG_DISCHARGE_INIT);
2504
2505
2506 di->fg_wq = create_singlethread_workqueue("ab8500_fg_wq");
2507 if (di->fg_wq == NULL) {
2508 dev_err(di->dev, "failed to create work queue\n");
2509 goto free_device_info;
2510 }
2511
2512
2513 INIT_WORK(&di->fg_work, ab8500_fg_instant_work);
2514
2515
2516 INIT_WORK(&di->fg_acc_cur_work, ab8500_fg_acc_cur_work);
2517
2518
2519 INIT_DELAYED_WORK_DEFERRABLE(&di->fg_reinit_work,
2520 ab8500_fg_reinit_work);
2521
2522
2523 INIT_DELAYED_WORK_DEFERRABLE(&di->fg_periodic_work,
2524 ab8500_fg_periodic_work);
2525
2526
2527 INIT_DELAYED_WORK_DEFERRABLE(&di->fg_low_bat_work,
2528 ab8500_fg_low_bat_work);
2529
2530
2531 INIT_DELAYED_WORK_DEFERRABLE(&di->fg_check_hw_failure_work,
2532 ab8500_fg_check_hw_failure_work);
2533
2534
2535 ret = ab8500_fg_init_hw_registers(di);
2536 if (ret) {
2537 dev_err(di->dev, "failed to initialize registers\n");
2538 goto free_inst_curr_wq;
2539 }
2540
2541
2542 di->flags.batt_unknown = true;
2543 di->flags.batt_id_received = false;
2544
2545
2546 ret = power_supply_register(di->dev, &di->fg_psy);
2547 if (ret) {
2548 dev_err(di->dev, "failed to register FG psy\n");
2549 goto free_inst_curr_wq;
2550 }
2551
2552 di->fg_samples = SEC_TO_SAMPLE(di->bat->fg_params->init_timer);
2553 ab8500_fg_coulomb_counter(di, true);
2554
2555
2556 init_completion(&di->ab8500_fg_complete);
2557
2558
2559 for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq); i++) {
2560 irq = platform_get_irq_byname(pdev, ab8500_fg_irq[i].name);
2561 ret = request_threaded_irq(irq, NULL, ab8500_fg_irq[i].isr,
2562 IRQF_SHARED | IRQF_NO_SUSPEND,
2563 ab8500_fg_irq[i].name, di);
2564
2565 if (ret != 0) {
2566 dev_err(di->dev, "failed to request %s IRQ %d: %d\n"
2567 , ab8500_fg_irq[i].name, irq, ret);
2568 goto free_irq;
2569 }
2570 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
2571 ab8500_fg_irq[i].name, irq, ret);
2572 }
2573 di->irq = platform_get_irq_byname(pdev, "CCEOC");
2574 disable_irq(di->irq);
2575
2576 platform_set_drvdata(pdev, di);
2577
2578 ret = ab8500_fg_sysfs_init(di);
2579 if (ret) {
2580 dev_err(di->dev, "failed to create sysfs entry\n");
2581 goto free_irq;
2582 }
2583
2584
2585 di->flags.calibrate = true;
2586 di->calib_state = AB8500_FG_CALIB_INIT;
2587
2588
2589 di->bat_temp = 210;
2590
2591
2592 queue_delayed_work(di->fg_wq, &di->fg_periodic_work, 0);
2593
2594 list_add_tail(&di->node, &ab8500_fg_list);
2595
2596 return ret;
2597
2598free_irq:
2599 power_supply_unregister(&di->fg_psy);
2600
2601
2602 for (i = i - 1; i >= 0; i--) {
2603 irq = platform_get_irq_byname(pdev, ab8500_fg_irq[i].name);
2604 free_irq(irq, di);
2605 }
2606free_inst_curr_wq:
2607 destroy_workqueue(di->fg_wq);
2608free_device_info:
2609 kfree(di);
2610
2611 return ret;
2612}
2613
2614static struct platform_driver ab8500_fg_driver = {
2615 .probe = ab8500_fg_probe,
2616 .remove = __devexit_p(ab8500_fg_remove),
2617 .suspend = ab8500_fg_suspend,
2618 .resume = ab8500_fg_resume,
2619 .driver = {
2620 .name = "ab8500-fg",
2621 .owner = THIS_MODULE,
2622 },
2623};
2624
2625static int __init ab8500_fg_init(void)
2626{
2627 return platform_driver_register(&ab8500_fg_driver);
2628}
2629
2630static void __exit ab8500_fg_exit(void)
2631{
2632 platform_driver_unregister(&ab8500_fg_driver);
2633}
2634
2635subsys_initcall_sync(ab8500_fg_init);
2636module_exit(ab8500_fg_exit);
2637
2638MODULE_LICENSE("GPL v2");
2639MODULE_AUTHOR("Johan Palsson, Karl Komierowski");
2640MODULE_ALIAS("platform:ab8500-fg");
2641MODULE_DESCRIPTION("AB8500 Fuel Gauge driver");
2642