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