1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/init.h>
16#include <linux/module.h>
17#include <linux/device.h>
18#include <linux/hrtimer.h>
19#include <linux/interrupt.h>
20#include <linux/delay.h>
21#include <linux/slab.h>
22#include <linux/platform_device.h>
23#include <linux/power_supply.h>
24#include <linux/completion.h>
25#include <linux/workqueue.h>
26#include <linux/kobject.h>
27#include <linux/of.h>
28#include <linux/mfd/core.h>
29#include <linux/mfd/abx500.h>
30#include <linux/mfd/abx500/ab8500.h>
31#include <linux/mfd/abx500/ux500_chargalg.h>
32#include <linux/mfd/abx500/ab8500-bm.h>
33#include <linux/notifier.h>
34
35
36#define CHG_WD_INTERVAL (6 * HZ)
37
38
39#define EOC_COND_CNT 10
40
41
42#define ONE_HOUR_IN_SECONDS 3600
43
44
45#define FIVE_MINUTES_IN_SECONDS 300
46
47
48#define BAT_PLUS_MARGIN (100)
49
50#define CHARGALG_CURR_STEP_LOW 0
51#define CHARGALG_CURR_STEP_HIGH 100
52
53#define to_abx500_chargalg_device_info(x) container_of((x), \
54 struct abx500_chargalg, chargalg_psy);
55
56enum abx500_chargers {
57 NO_CHG,
58 AC_CHG,
59 USB_CHG,
60};
61
62struct abx500_chargalg_charger_info {
63 enum abx500_chargers conn_chg;
64 enum abx500_chargers prev_conn_chg;
65 enum abx500_chargers online_chg;
66 enum abx500_chargers prev_online_chg;
67 enum abx500_chargers charger_type;
68 bool usb_chg_ok;
69 bool ac_chg_ok;
70 int usb_volt;
71 int usb_curr;
72 int ac_volt;
73 int ac_curr;
74 int usb_vset;
75 int usb_iset;
76 int ac_vset;
77 int ac_iset;
78};
79
80struct abx500_chargalg_suspension_status {
81 bool suspended_change;
82 bool ac_suspended;
83 bool usb_suspended;
84};
85
86struct abx500_chargalg_current_step_status {
87 bool curr_step_change;
88 int curr_step;
89};
90
91struct abx500_chargalg_battery_data {
92 int temp;
93 int volt;
94 int avg_curr;
95 int inst_curr;
96 int percent;
97};
98
99enum abx500_chargalg_states {
100 STATE_HANDHELD_INIT,
101 STATE_HANDHELD,
102 STATE_CHG_NOT_OK_INIT,
103 STATE_CHG_NOT_OK,
104 STATE_HW_TEMP_PROTECT_INIT,
105 STATE_HW_TEMP_PROTECT,
106 STATE_NORMAL_INIT,
107 STATE_USB_PP_PRE_CHARGE,
108 STATE_NORMAL,
109 STATE_WAIT_FOR_RECHARGE_INIT,
110 STATE_WAIT_FOR_RECHARGE,
111 STATE_MAINTENANCE_A_INIT,
112 STATE_MAINTENANCE_A,
113 STATE_MAINTENANCE_B_INIT,
114 STATE_MAINTENANCE_B,
115 STATE_TEMP_UNDEROVER_INIT,
116 STATE_TEMP_UNDEROVER,
117 STATE_TEMP_LOWHIGH_INIT,
118 STATE_TEMP_LOWHIGH,
119 STATE_SUSPENDED_INIT,
120 STATE_SUSPENDED,
121 STATE_OVV_PROTECT_INIT,
122 STATE_OVV_PROTECT,
123 STATE_SAFETY_TIMER_EXPIRED_INIT,
124 STATE_SAFETY_TIMER_EXPIRED,
125 STATE_BATT_REMOVED_INIT,
126 STATE_BATT_REMOVED,
127 STATE_WD_EXPIRED_INIT,
128 STATE_WD_EXPIRED,
129};
130
131static const char *states[] = {
132 "HANDHELD_INIT",
133 "HANDHELD",
134 "CHG_NOT_OK_INIT",
135 "CHG_NOT_OK",
136 "HW_TEMP_PROTECT_INIT",
137 "HW_TEMP_PROTECT",
138 "NORMAL_INIT",
139 "USB_PP_PRE_CHARGE",
140 "NORMAL",
141 "WAIT_FOR_RECHARGE_INIT",
142 "WAIT_FOR_RECHARGE",
143 "MAINTENANCE_A_INIT",
144 "MAINTENANCE_A",
145 "MAINTENANCE_B_INIT",
146 "MAINTENANCE_B",
147 "TEMP_UNDEROVER_INIT",
148 "TEMP_UNDEROVER",
149 "TEMP_LOWHIGH_INIT",
150 "TEMP_LOWHIGH",
151 "SUSPENDED_INIT",
152 "SUSPENDED",
153 "OVV_PROTECT_INIT",
154 "OVV_PROTECT",
155 "SAFETY_TIMER_EXPIRED_INIT",
156 "SAFETY_TIMER_EXPIRED",
157 "BATT_REMOVED_INIT",
158 "BATT_REMOVED",
159 "WD_EXPIRED_INIT",
160 "WD_EXPIRED",
161};
162
163struct abx500_chargalg_events {
164 bool batt_unknown;
165 bool mainextchnotok;
166 bool batt_ovv;
167 bool batt_rem;
168 bool btemp_underover;
169 bool btemp_lowhigh;
170 bool main_thermal_prot;
171 bool usb_thermal_prot;
172 bool main_ovv;
173 bool vbus_ovv;
174 bool usbchargernotok;
175 bool safety_timer_expired;
176 bool maintenance_timer_expired;
177 bool ac_wd_expired;
178 bool usb_wd_expired;
179 bool ac_cv_active;
180 bool usb_cv_active;
181 bool vbus_collapsed;
182};
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199struct abx500_charge_curr_maximization {
200 int original_iset;
201 int current_iset;
202 int test_delta_i;
203 int condition_cnt;
204 int max_current;
205 int wait_cnt;
206 u8 level;
207};
208
209enum maxim_ret {
210 MAXIM_RET_NOACTION,
211 MAXIM_RET_CHANGE,
212 MAXIM_RET_IBAT_TOO_HIGH,
213};
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244struct abx500_chargalg {
245 struct device *dev;
246 int charge_status;
247 int eoc_cnt;
248 bool maintenance_chg;
249 int t_hyst_norm;
250 int t_hyst_lowhigh;
251 enum abx500_chargalg_states charge_state;
252 struct abx500_charge_curr_maximization ccm;
253 struct abx500_chargalg_charger_info chg_info;
254 struct abx500_chargalg_battery_data batt_data;
255 struct abx500_chargalg_suspension_status susp_status;
256 struct ab8500 *parent;
257 struct abx500_chargalg_current_step_status curr_status;
258 struct abx500_bm_data *bm;
259 struct power_supply chargalg_psy;
260 struct ux500_charger *ac_chg;
261 struct ux500_charger *usb_chg;
262 struct abx500_chargalg_events events;
263 struct workqueue_struct *chargalg_wq;
264 struct delayed_work chargalg_periodic_work;
265 struct delayed_work chargalg_wd_work;
266 struct work_struct chargalg_work;
267 struct hrtimer safety_timer;
268 struct hrtimer maintenance_timer;
269 struct kobject chargalg_kobject;
270};
271
272
273BLOCKING_NOTIFIER_HEAD(charger_notifier_list);
274
275
276static enum power_supply_property abx500_chargalg_props[] = {
277 POWER_SUPPLY_PROP_STATUS,
278 POWER_SUPPLY_PROP_HEALTH,
279};
280
281struct abx500_chargalg_sysfs_entry {
282 struct attribute attr;
283 ssize_t (*show)(struct abx500_chargalg *, char *);
284 ssize_t (*store)(struct abx500_chargalg *, const char *, size_t);
285};
286
287
288
289
290
291
292
293
294static enum hrtimer_restart
295abx500_chargalg_safety_timer_expired(struct hrtimer *timer)
296{
297 struct abx500_chargalg *di = container_of(timer, struct abx500_chargalg,
298 safety_timer);
299 dev_err(di->dev, "Safety timer expired\n");
300 di->events.safety_timer_expired = true;
301
302
303 queue_work(di->chargalg_wq, &di->chargalg_work);
304
305 return HRTIMER_NORESTART;
306}
307
308
309
310
311
312
313
314
315
316static enum hrtimer_restart
317abx500_chargalg_maintenance_timer_expired(struct hrtimer *timer)
318{
319
320 struct abx500_chargalg *di = container_of(timer, struct abx500_chargalg,
321 maintenance_timer);
322
323 dev_dbg(di->dev, "Maintenance timer expired\n");
324 di->events.maintenance_timer_expired = true;
325
326
327 queue_work(di->chargalg_wq, &di->chargalg_work);
328
329 return HRTIMER_NORESTART;
330}
331
332
333
334
335
336
337
338static void abx500_chargalg_state_to(struct abx500_chargalg *di,
339 enum abx500_chargalg_states state)
340{
341 dev_dbg(di->dev,
342 "State changed: %s (From state: [%d] %s =to=> [%d] %s )\n",
343 di->charge_state == state ? "NO" : "YES",
344 di->charge_state,
345 states[di->charge_state],
346 state,
347 states[state]);
348
349 di->charge_state = state;
350}
351
352static int abx500_chargalg_check_charger_enable(struct abx500_chargalg *di)
353{
354 switch (di->charge_state) {
355 case STATE_NORMAL:
356 case STATE_MAINTENANCE_A:
357 case STATE_MAINTENANCE_B:
358 break;
359 default:
360 return 0;
361 }
362
363 if (di->chg_info.charger_type & USB_CHG) {
364 return di->usb_chg->ops.check_enable(di->usb_chg,
365 di->bm->bat_type[di->bm->batt_id].normal_vol_lvl,
366 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl);
367 } else if ((di->chg_info.charger_type & AC_CHG) &&
368 !(di->ac_chg->external)) {
369 return di->ac_chg->ops.check_enable(di->ac_chg,
370 di->bm->bat_type[di->bm->batt_id].normal_vol_lvl,
371 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl);
372 }
373 return 0;
374}
375
376
377
378
379
380
381
382
383static int abx500_chargalg_check_charger_connection(struct abx500_chargalg *di)
384{
385 if (di->chg_info.conn_chg != di->chg_info.prev_conn_chg ||
386 di->susp_status.suspended_change) {
387
388
389
390
391 if ((di->chg_info.conn_chg & AC_CHG) &&
392 !di->susp_status.ac_suspended) {
393 dev_dbg(di->dev, "Charging source is AC\n");
394 if (di->chg_info.charger_type != AC_CHG) {
395 di->chg_info.charger_type = AC_CHG;
396 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
397 }
398 } else if ((di->chg_info.conn_chg & USB_CHG) &&
399 !di->susp_status.usb_suspended) {
400 dev_dbg(di->dev, "Charging source is USB\n");
401 di->chg_info.charger_type = USB_CHG;
402 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
403 } else if (di->chg_info.conn_chg &&
404 (di->susp_status.ac_suspended ||
405 di->susp_status.usb_suspended)) {
406 dev_dbg(di->dev, "Charging is suspended\n");
407 di->chg_info.charger_type = NO_CHG;
408 abx500_chargalg_state_to(di, STATE_SUSPENDED_INIT);
409 } else {
410 dev_dbg(di->dev, "Charging source is OFF\n");
411 di->chg_info.charger_type = NO_CHG;
412 abx500_chargalg_state_to(di, STATE_HANDHELD_INIT);
413 }
414 di->chg_info.prev_conn_chg = di->chg_info.conn_chg;
415 di->susp_status.suspended_change = false;
416 }
417 return di->chg_info.conn_chg;
418}
419
420
421
422
423
424
425
426
427
428static void abx500_chargalg_check_current_step_status
429 (struct abx500_chargalg *di)
430{
431 if (di->curr_status.curr_step_change)
432 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
433 di->curr_status.curr_step_change = false;
434}
435
436
437
438
439
440
441
442
443static void abx500_chargalg_start_safety_timer(struct abx500_chargalg *di)
444{
445
446 int timer_expiration = 0;
447
448 switch (di->chg_info.charger_type) {
449 case AC_CHG:
450 timer_expiration = di->bm->main_safety_tmr_h;
451 break;
452
453 case USB_CHG:
454 timer_expiration = di->bm->usb_safety_tmr_h;
455 break;
456
457 default:
458 dev_err(di->dev, "Unknown charger to charge from\n");
459 break;
460 }
461
462 di->events.safety_timer_expired = false;
463 hrtimer_set_expires_range(&di->safety_timer,
464 ktime_set(timer_expiration * ONE_HOUR_IN_SECONDS, 0),
465 ktime_set(FIVE_MINUTES_IN_SECONDS, 0));
466 hrtimer_start_expires(&di->safety_timer, HRTIMER_MODE_REL);
467}
468
469
470
471
472
473
474
475static void abx500_chargalg_stop_safety_timer(struct abx500_chargalg *di)
476{
477 if (hrtimer_try_to_cancel(&di->safety_timer) >= 0)
478 di->events.safety_timer_expired = false;
479}
480
481
482
483
484
485
486
487
488
489
490static void abx500_chargalg_start_maintenance_timer(struct abx500_chargalg *di,
491 int duration)
492{
493 hrtimer_set_expires_range(&di->maintenance_timer,
494 ktime_set(duration * ONE_HOUR_IN_SECONDS, 0),
495 ktime_set(FIVE_MINUTES_IN_SECONDS, 0));
496 di->events.maintenance_timer_expired = false;
497 hrtimer_start_expires(&di->maintenance_timer, HRTIMER_MODE_REL);
498}
499
500
501
502
503
504
505
506
507static void abx500_chargalg_stop_maintenance_timer(struct abx500_chargalg *di)
508{
509 if (hrtimer_try_to_cancel(&di->maintenance_timer) >= 0)
510 di->events.maintenance_timer_expired = false;
511}
512
513
514
515
516
517
518
519
520static int abx500_chargalg_kick_watchdog(struct abx500_chargalg *di)
521{
522
523 if (di->ac_chg && di->ac_chg->ops.kick_wd &&
524 di->chg_info.online_chg & AC_CHG) {
525
526
527
528
529
530 if (di->ac_chg->external &&
531 di->usb_chg && di->usb_chg->ops.kick_wd)
532 di->usb_chg->ops.kick_wd(di->usb_chg);
533
534 return di->ac_chg->ops.kick_wd(di->ac_chg);
535 }
536 else if (di->usb_chg && di->usb_chg->ops.kick_wd &&
537 di->chg_info.online_chg & USB_CHG)
538 return di->usb_chg->ops.kick_wd(di->usb_chg);
539
540 return -ENXIO;
541}
542
543
544
545
546
547
548
549
550
551
552
553static int abx500_chargalg_ac_en(struct abx500_chargalg *di, int enable,
554 int vset, int iset)
555{
556 static int abx500_chargalg_ex_ac_enable_toggle;
557
558 if (!di->ac_chg || !di->ac_chg->ops.enable)
559 return -ENXIO;
560
561
562 if (di->ac_chg->max_out_volt)
563 vset = min(vset, di->ac_chg->max_out_volt);
564 if (di->ac_chg->max_out_curr)
565 iset = min(iset, di->ac_chg->max_out_curr);
566
567 di->chg_info.ac_iset = iset;
568 di->chg_info.ac_vset = vset;
569
570
571 if (enable && di->ac_chg->external &&
572 !abx500_chargalg_ex_ac_enable_toggle) {
573 blocking_notifier_call_chain(&charger_notifier_list,
574 0, di->dev);
575 abx500_chargalg_ex_ac_enable_toggle++;
576 }
577
578 return di->ac_chg->ops.enable(di->ac_chg, enable, vset, iset);
579}
580
581
582
583
584
585
586
587
588
589
590
591static int abx500_chargalg_usb_en(struct abx500_chargalg *di, int enable,
592 int vset, int iset)
593{
594 if (!di->usb_chg || !di->usb_chg->ops.enable)
595 return -ENXIO;
596
597
598 if (di->usb_chg->max_out_volt)
599 vset = min(vset, di->usb_chg->max_out_volt);
600 if (di->usb_chg->max_out_curr)
601 iset = min(iset, di->usb_chg->max_out_curr);
602
603 di->chg_info.usb_iset = iset;
604 di->chg_info.usb_vset = vset;
605
606 return di->usb_chg->ops.enable(di->usb_chg, enable, vset, iset);
607}
608
609
610
611
612
613
614
615
616static int ab8540_chargalg_usb_pp_en(struct abx500_chargalg *di, bool enable)
617{
618 if (!di->usb_chg || !di->usb_chg->ops.pp_enable)
619 return -ENXIO;
620
621 return di->usb_chg->ops.pp_enable(di->usb_chg, enable);
622}
623
624
625
626
627
628
629
630
631static int ab8540_chargalg_usb_pre_chg_en(struct abx500_chargalg *di,
632 bool enable)
633{
634 if (!di->usb_chg || !di->usb_chg->ops.pre_chg_enable)
635 return -ENXIO;
636
637 return di->usb_chg->ops.pre_chg_enable(di->usb_chg, enable);
638}
639
640
641
642
643
644
645
646
647
648static int abx500_chargalg_update_chg_curr(struct abx500_chargalg *di,
649 int iset)
650{
651
652 if (di->ac_chg && di->ac_chg->ops.update_curr &&
653 di->chg_info.charger_type & AC_CHG) {
654
655
656
657
658 if (di->ac_chg->max_out_curr)
659 iset = min(iset, di->ac_chg->max_out_curr);
660
661 di->chg_info.ac_iset = iset;
662
663 return di->ac_chg->ops.update_curr(di->ac_chg, iset);
664 } else if (di->usb_chg && di->usb_chg->ops.update_curr &&
665 di->chg_info.charger_type & USB_CHG) {
666
667
668
669
670 if (di->usb_chg->max_out_curr)
671 iset = min(iset, di->usb_chg->max_out_curr);
672
673 di->chg_info.usb_iset = iset;
674
675 return di->usb_chg->ops.update_curr(di->usb_chg, iset);
676 }
677
678 return -ENXIO;
679}
680
681
682
683
684
685
686
687
688
689static void abx500_chargalg_stop_charging(struct abx500_chargalg *di)
690{
691 abx500_chargalg_ac_en(di, false, 0, 0);
692 abx500_chargalg_usb_en(di, false, 0, 0);
693 abx500_chargalg_stop_safety_timer(di);
694 abx500_chargalg_stop_maintenance_timer(di);
695 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
696 di->maintenance_chg = false;
697 cancel_delayed_work(&di->chargalg_wd_work);
698 power_supply_changed(&di->chargalg_psy);
699}
700
701
702
703
704
705
706
707
708
709static void abx500_chargalg_hold_charging(struct abx500_chargalg *di)
710{
711 abx500_chargalg_ac_en(di, false, 0, 0);
712 abx500_chargalg_usb_en(di, false, 0, 0);
713 abx500_chargalg_stop_safety_timer(di);
714 abx500_chargalg_stop_maintenance_timer(di);
715 di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
716 di->maintenance_chg = false;
717 cancel_delayed_work(&di->chargalg_wd_work);
718 power_supply_changed(&di->chargalg_psy);
719}
720
721
722
723
724
725
726
727
728
729
730static void abx500_chargalg_start_charging(struct abx500_chargalg *di,
731 int vset, int iset)
732{
733 switch (di->chg_info.charger_type) {
734 case AC_CHG:
735 dev_dbg(di->dev,
736 "AC parameters: Vset %d, Ich %d\n", vset, iset);
737 abx500_chargalg_usb_en(di, false, 0, 0);
738 abx500_chargalg_ac_en(di, true, vset, iset);
739 break;
740
741 case USB_CHG:
742 dev_dbg(di->dev,
743 "USB parameters: Vset %d, Ich %d\n", vset, iset);
744 abx500_chargalg_ac_en(di, false, 0, 0);
745 abx500_chargalg_usb_en(di, true, vset, iset);
746 break;
747
748 default:
749 dev_err(di->dev, "Unknown charger to charge from\n");
750 break;
751 }
752}
753
754
755
756
757
758
759
760
761static void abx500_chargalg_check_temp(struct abx500_chargalg *di)
762{
763 if (di->batt_data.temp > (di->bm->temp_low + di->t_hyst_norm) &&
764 di->batt_data.temp < (di->bm->temp_high - di->t_hyst_norm)) {
765
766 di->events.btemp_underover = false;
767 di->events.btemp_lowhigh = false;
768 di->t_hyst_norm = 0;
769 di->t_hyst_lowhigh = 0;
770 } else {
771 if (((di->batt_data.temp >= di->bm->temp_high) &&
772 (di->batt_data.temp <
773 (di->bm->temp_over - di->t_hyst_lowhigh))) ||
774 ((di->batt_data.temp >
775 (di->bm->temp_under + di->t_hyst_lowhigh)) &&
776 (di->batt_data.temp <= di->bm->temp_low))) {
777
778 di->events.btemp_underover = false;
779 di->events.btemp_lowhigh = true;
780 di->t_hyst_norm = di->bm->temp_hysteresis;
781 di->t_hyst_lowhigh = 0;
782 } else if (di->batt_data.temp <= di->bm->temp_under ||
783 di->batt_data.temp >= di->bm->temp_over) {
784
785 di->events.btemp_underover = true;
786 di->events.btemp_lowhigh = false;
787 di->t_hyst_norm = 0;
788 di->t_hyst_lowhigh = di->bm->temp_hysteresis;
789 } else {
790
791 dev_dbg(di->dev, "Within hysteresis limit temp: %d "
792 "hyst_lowhigh %d, hyst normal %d\n",
793 di->batt_data.temp, di->t_hyst_lowhigh,
794 di->t_hyst_norm);
795 }
796 }
797}
798
799
800
801
802
803
804
805static void abx500_chargalg_check_charger_voltage(struct abx500_chargalg *di)
806{
807 if (di->chg_info.usb_volt > di->bm->chg_params->usb_volt_max)
808 di->chg_info.usb_chg_ok = false;
809 else
810 di->chg_info.usb_chg_ok = true;
811
812 if (di->chg_info.ac_volt > di->bm->chg_params->ac_volt_max)
813 di->chg_info.ac_chg_ok = false;
814 else
815 di->chg_info.ac_chg_ok = true;
816
817}
818
819
820
821
822
823
824
825
826
827static void abx500_chargalg_end_of_charge(struct abx500_chargalg *di)
828{
829 if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING &&
830 di->charge_state == STATE_NORMAL &&
831 !di->maintenance_chg && (di->batt_data.volt >=
832 di->bm->bat_type[di->bm->batt_id].termination_vol ||
833 di->events.usb_cv_active || di->events.ac_cv_active) &&
834 di->batt_data.avg_curr <
835 di->bm->bat_type[di->bm->batt_id].termination_curr &&
836 di->batt_data.avg_curr > 0) {
837 if (++di->eoc_cnt >= EOC_COND_CNT) {
838 di->eoc_cnt = 0;
839 if ((di->chg_info.charger_type & USB_CHG) &&
840 (di->usb_chg->power_path))
841 ab8540_chargalg_usb_pp_en(di, true);
842 di->charge_status = POWER_SUPPLY_STATUS_FULL;
843 di->maintenance_chg = true;
844 dev_dbg(di->dev, "EOC reached!\n");
845 power_supply_changed(&di->chargalg_psy);
846 } else {
847 dev_dbg(di->dev,
848 " EOC limit reached for the %d"
849 " time, out of %d before EOC\n",
850 di->eoc_cnt,
851 EOC_COND_CNT);
852 }
853 } else {
854 di->eoc_cnt = 0;
855 }
856}
857
858static void init_maxim_chg_curr(struct abx500_chargalg *di)
859{
860 di->ccm.original_iset =
861 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl;
862 di->ccm.current_iset =
863 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl;
864 di->ccm.test_delta_i = di->bm->maxi->charger_curr_step;
865 di->ccm.max_current = di->bm->maxi->chg_curr;
866 di->ccm.condition_cnt = di->bm->maxi->wait_cycles;
867 di->ccm.level = 0;
868}
869
870
871
872
873
874
875
876
877
878
879static enum maxim_ret abx500_chargalg_chg_curr_maxim(struct abx500_chargalg *di)
880{
881 int delta_i;
882
883 if (!di->bm->maxi->ena_maxi)
884 return MAXIM_RET_NOACTION;
885
886 delta_i = di->ccm.original_iset - di->batt_data.inst_curr;
887
888 if (di->events.vbus_collapsed) {
889 dev_dbg(di->dev, "Charger voltage has collapsed %d\n",
890 di->ccm.wait_cnt);
891 if (di->ccm.wait_cnt == 0) {
892 dev_dbg(di->dev, "lowering current\n");
893 di->ccm.wait_cnt++;
894 di->ccm.condition_cnt = di->bm->maxi->wait_cycles;
895 di->ccm.max_current =
896 di->ccm.current_iset - di->ccm.test_delta_i;
897 di->ccm.current_iset = di->ccm.max_current;
898 di->ccm.level--;
899 return MAXIM_RET_CHANGE;
900 } else {
901 dev_dbg(di->dev, "waiting\n");
902
903 di->ccm.wait_cnt = (di->ccm.wait_cnt + 1) % 3;
904 return MAXIM_RET_NOACTION;
905 }
906 }
907
908 di->ccm.wait_cnt = 0;
909
910 if ((di->batt_data.inst_curr > di->ccm.original_iset)) {
911 dev_dbg(di->dev, " Maximization Ibat (%dmA) too high"
912 " (limit %dmA) (current iset: %dmA)!\n",
913 di->batt_data.inst_curr, di->ccm.original_iset,
914 di->ccm.current_iset);
915
916 if (di->ccm.current_iset == di->ccm.original_iset)
917 return MAXIM_RET_NOACTION;
918
919 di->ccm.condition_cnt = di->bm->maxi->wait_cycles;
920 di->ccm.current_iset = di->ccm.original_iset;
921 di->ccm.level = 0;
922
923 return MAXIM_RET_IBAT_TOO_HIGH;
924 }
925
926 if (delta_i > di->ccm.test_delta_i &&
927 (di->ccm.current_iset + di->ccm.test_delta_i) <
928 di->ccm.max_current) {
929 if (di->ccm.condition_cnt-- == 0) {
930
931 di->ccm.condition_cnt = di->bm->maxi->wait_cycles;
932 di->ccm.current_iset += di->ccm.test_delta_i;
933 di->ccm.level++;
934 dev_dbg(di->dev, " Maximization needed, increase"
935 " with %d mA to %dmA (Optimal ibat: %d)"
936 " Level %d\n",
937 di->ccm.test_delta_i,
938 di->ccm.current_iset,
939 di->ccm.original_iset,
940 di->ccm.level);
941 return MAXIM_RET_CHANGE;
942 } else {
943 return MAXIM_RET_NOACTION;
944 }
945 } else {
946 di->ccm.condition_cnt = di->bm->maxi->wait_cycles;
947 return MAXIM_RET_NOACTION;
948 }
949}
950
951static void handle_maxim_chg_curr(struct abx500_chargalg *di)
952{
953 enum maxim_ret ret;
954 int result;
955
956 ret = abx500_chargalg_chg_curr_maxim(di);
957 switch (ret) {
958 case MAXIM_RET_CHANGE:
959 result = abx500_chargalg_update_chg_curr(di,
960 di->ccm.current_iset);
961 if (result)
962 dev_err(di->dev, "failed to set chg curr\n");
963 break;
964 case MAXIM_RET_IBAT_TOO_HIGH:
965 result = abx500_chargalg_update_chg_curr(di,
966 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl);
967 if (result)
968 dev_err(di->dev, "failed to set chg curr\n");
969 break;
970
971 case MAXIM_RET_NOACTION:
972 default:
973
974 break;
975 }
976}
977
978static int abx500_chargalg_get_ext_psy_data(struct device *dev, void *data)
979{
980 struct power_supply *psy;
981 struct power_supply *ext;
982 struct abx500_chargalg *di;
983 union power_supply_propval ret;
984 int i, j;
985 bool psy_found = false;
986 bool capacity_updated = false;
987
988 psy = (struct power_supply *)data;
989 ext = dev_get_drvdata(dev);
990 di = to_abx500_chargalg_device_info(psy);
991
992 for (i = 0; i < ext->num_supplicants; i++) {
993 if (!strcmp(ext->supplied_to[i], psy->name))
994 psy_found = true;
995 }
996 if (!psy_found)
997 return 0;
998
999
1000
1001
1002
1003
1004 if (!ext->get_property(ext, POWER_SUPPLY_PROP_CAPACITY, &ret)) {
1005 di->batt_data.percent = ret.intval;
1006 capacity_updated = true;
1007 }
1008
1009
1010 for (j = 0; j < ext->num_properties; j++) {
1011 enum power_supply_property prop;
1012 prop = ext->properties[j];
1013
1014
1015 if (!di->ac_chg &&
1016 ext->type == POWER_SUPPLY_TYPE_MAINS)
1017 di->ac_chg = psy_to_ux500_charger(ext);
1018 else if (!di->usb_chg &&
1019 ext->type == POWER_SUPPLY_TYPE_USB)
1020 di->usb_chg = psy_to_ux500_charger(ext);
1021
1022 if (ext->get_property(ext, prop, &ret))
1023 continue;
1024 switch (prop) {
1025 case POWER_SUPPLY_PROP_PRESENT:
1026 switch (ext->type) {
1027 case POWER_SUPPLY_TYPE_BATTERY:
1028
1029 if (ret.intval)
1030 di->events.batt_rem = false;
1031
1032 else
1033 di->events.batt_rem = true;
1034 break;
1035 case POWER_SUPPLY_TYPE_MAINS:
1036
1037 if (!ret.intval &&
1038 (di->chg_info.conn_chg & AC_CHG)) {
1039 di->chg_info.prev_conn_chg =
1040 di->chg_info.conn_chg;
1041 di->chg_info.conn_chg &= ~AC_CHG;
1042 }
1043
1044 else if (ret.intval &&
1045 !(di->chg_info.conn_chg & AC_CHG)) {
1046 di->chg_info.prev_conn_chg =
1047 di->chg_info.conn_chg;
1048 di->chg_info.conn_chg |= AC_CHG;
1049 }
1050 break;
1051 case POWER_SUPPLY_TYPE_USB:
1052
1053 if (!ret.intval &&
1054 (di->chg_info.conn_chg & USB_CHG)) {
1055 di->chg_info.prev_conn_chg =
1056 di->chg_info.conn_chg;
1057 di->chg_info.conn_chg &= ~USB_CHG;
1058 }
1059
1060 else if (ret.intval &&
1061 !(di->chg_info.conn_chg & USB_CHG)) {
1062 di->chg_info.prev_conn_chg =
1063 di->chg_info.conn_chg;
1064 di->chg_info.conn_chg |= USB_CHG;
1065 }
1066 break;
1067 default:
1068 break;
1069 }
1070 break;
1071
1072 case POWER_SUPPLY_PROP_ONLINE:
1073 switch (ext->type) {
1074 case POWER_SUPPLY_TYPE_BATTERY:
1075 break;
1076 case POWER_SUPPLY_TYPE_MAINS:
1077
1078 if (!ret.intval &&
1079 (di->chg_info.online_chg & AC_CHG)) {
1080 di->chg_info.prev_online_chg =
1081 di->chg_info.online_chg;
1082 di->chg_info.online_chg &= ~AC_CHG;
1083 }
1084
1085 else if (ret.intval &&
1086 !(di->chg_info.online_chg & AC_CHG)) {
1087 di->chg_info.prev_online_chg =
1088 di->chg_info.online_chg;
1089 di->chg_info.online_chg |= AC_CHG;
1090 queue_delayed_work(di->chargalg_wq,
1091 &di->chargalg_wd_work, 0);
1092 }
1093 break;
1094 case POWER_SUPPLY_TYPE_USB:
1095
1096 if (!ret.intval &&
1097 (di->chg_info.online_chg & USB_CHG)) {
1098 di->chg_info.prev_online_chg =
1099 di->chg_info.online_chg;
1100 di->chg_info.online_chg &= ~USB_CHG;
1101 }
1102
1103 else if (ret.intval &&
1104 !(di->chg_info.online_chg & USB_CHG)) {
1105 di->chg_info.prev_online_chg =
1106 di->chg_info.online_chg;
1107 di->chg_info.online_chg |= USB_CHG;
1108 queue_delayed_work(di->chargalg_wq,
1109 &di->chargalg_wd_work, 0);
1110 }
1111 break;
1112 default:
1113 break;
1114 }
1115 break;
1116
1117 case POWER_SUPPLY_PROP_HEALTH:
1118 switch (ext->type) {
1119 case POWER_SUPPLY_TYPE_BATTERY:
1120 break;
1121 case POWER_SUPPLY_TYPE_MAINS:
1122 switch (ret.intval) {
1123 case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE:
1124 di->events.mainextchnotok = true;
1125 di->events.main_thermal_prot = false;
1126 di->events.main_ovv = false;
1127 di->events.ac_wd_expired = false;
1128 break;
1129 case POWER_SUPPLY_HEALTH_DEAD:
1130 di->events.ac_wd_expired = true;
1131 di->events.mainextchnotok = false;
1132 di->events.main_ovv = false;
1133 di->events.main_thermal_prot = false;
1134 break;
1135 case POWER_SUPPLY_HEALTH_COLD:
1136 case POWER_SUPPLY_HEALTH_OVERHEAT:
1137 di->events.main_thermal_prot = true;
1138 di->events.mainextchnotok = false;
1139 di->events.main_ovv = false;
1140 di->events.ac_wd_expired = false;
1141 break;
1142 case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
1143 di->events.main_ovv = true;
1144 di->events.mainextchnotok = false;
1145 di->events.main_thermal_prot = false;
1146 di->events.ac_wd_expired = false;
1147 break;
1148 case POWER_SUPPLY_HEALTH_GOOD:
1149 di->events.main_thermal_prot = false;
1150 di->events.mainextchnotok = false;
1151 di->events.main_ovv = false;
1152 di->events.ac_wd_expired = false;
1153 break;
1154 default:
1155 break;
1156 }
1157 break;
1158
1159 case POWER_SUPPLY_TYPE_USB:
1160 switch (ret.intval) {
1161 case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE:
1162 di->events.usbchargernotok = true;
1163 di->events.usb_thermal_prot = false;
1164 di->events.vbus_ovv = false;
1165 di->events.usb_wd_expired = false;
1166 break;
1167 case POWER_SUPPLY_HEALTH_DEAD:
1168 di->events.usb_wd_expired = true;
1169 di->events.usbchargernotok = false;
1170 di->events.usb_thermal_prot = false;
1171 di->events.vbus_ovv = false;
1172 break;
1173 case POWER_SUPPLY_HEALTH_COLD:
1174 case POWER_SUPPLY_HEALTH_OVERHEAT:
1175 di->events.usb_thermal_prot = true;
1176 di->events.usbchargernotok = false;
1177 di->events.vbus_ovv = false;
1178 di->events.usb_wd_expired = false;
1179 break;
1180 case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
1181 di->events.vbus_ovv = true;
1182 di->events.usbchargernotok = false;
1183 di->events.usb_thermal_prot = false;
1184 di->events.usb_wd_expired = false;
1185 break;
1186 case POWER_SUPPLY_HEALTH_GOOD:
1187 di->events.usbchargernotok = false;
1188 di->events.usb_thermal_prot = false;
1189 di->events.vbus_ovv = false;
1190 di->events.usb_wd_expired = false;
1191 break;
1192 default:
1193 break;
1194 }
1195 default:
1196 break;
1197 }
1198 break;
1199
1200 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1201 switch (ext->type) {
1202 case POWER_SUPPLY_TYPE_BATTERY:
1203 di->batt_data.volt = ret.intval / 1000;
1204 break;
1205 case POWER_SUPPLY_TYPE_MAINS:
1206 di->chg_info.ac_volt = ret.intval / 1000;
1207 break;
1208 case POWER_SUPPLY_TYPE_USB:
1209 di->chg_info.usb_volt = ret.intval / 1000;
1210 break;
1211 default:
1212 break;
1213 }
1214 break;
1215
1216 case POWER_SUPPLY_PROP_VOLTAGE_AVG:
1217 switch (ext->type) {
1218 case POWER_SUPPLY_TYPE_MAINS:
1219
1220
1221 if (ret.intval)
1222 di->events.ac_cv_active = true;
1223 else
1224 di->events.ac_cv_active = false;
1225
1226 break;
1227 case POWER_SUPPLY_TYPE_USB:
1228
1229
1230 if (ret.intval)
1231 di->events.usb_cv_active = true;
1232 else
1233 di->events.usb_cv_active = false;
1234
1235 break;
1236 default:
1237 break;
1238 }
1239 break;
1240
1241 case POWER_SUPPLY_PROP_TECHNOLOGY:
1242 switch (ext->type) {
1243 case POWER_SUPPLY_TYPE_BATTERY:
1244 if (ret.intval)
1245 di->events.batt_unknown = false;
1246 else
1247 di->events.batt_unknown = true;
1248
1249 break;
1250 default:
1251 break;
1252 }
1253 break;
1254
1255 case POWER_SUPPLY_PROP_TEMP:
1256 di->batt_data.temp = ret.intval / 10;
1257 break;
1258
1259 case POWER_SUPPLY_PROP_CURRENT_NOW:
1260 switch (ext->type) {
1261 case POWER_SUPPLY_TYPE_MAINS:
1262 di->chg_info.ac_curr =
1263 ret.intval / 1000;
1264 break;
1265 case POWER_SUPPLY_TYPE_USB:
1266 di->chg_info.usb_curr =
1267 ret.intval / 1000;
1268 break;
1269 case POWER_SUPPLY_TYPE_BATTERY:
1270 di->batt_data.inst_curr = ret.intval / 1000;
1271 break;
1272 default:
1273 break;
1274 }
1275 break;
1276
1277 case POWER_SUPPLY_PROP_CURRENT_AVG:
1278 switch (ext->type) {
1279 case POWER_SUPPLY_TYPE_BATTERY:
1280 di->batt_data.avg_curr = ret.intval / 1000;
1281 break;
1282 case POWER_SUPPLY_TYPE_USB:
1283 if (ret.intval)
1284 di->events.vbus_collapsed = true;
1285 else
1286 di->events.vbus_collapsed = false;
1287 break;
1288 default:
1289 break;
1290 }
1291 break;
1292 case POWER_SUPPLY_PROP_CAPACITY:
1293 if (!capacity_updated)
1294 di->batt_data.percent = ret.intval;
1295 break;
1296 default:
1297 break;
1298 }
1299 }
1300 return 0;
1301}
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312static void abx500_chargalg_external_power_changed(struct power_supply *psy)
1313{
1314 struct abx500_chargalg *di = to_abx500_chargalg_device_info(psy);
1315
1316
1317
1318
1319
1320 queue_work(di->chargalg_wq, &di->chargalg_work);
1321}
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331static void abx500_chargalg_algorithm(struct abx500_chargalg *di)
1332{
1333 int charger_status;
1334 int ret;
1335 int curr_step_lvl;
1336
1337
1338 class_for_each_device(power_supply_class, NULL,
1339 &di->chargalg_psy, abx500_chargalg_get_ext_psy_data);
1340
1341 abx500_chargalg_end_of_charge(di);
1342 abx500_chargalg_check_temp(di);
1343 abx500_chargalg_check_charger_voltage(di);
1344
1345 charger_status = abx500_chargalg_check_charger_connection(di);
1346 abx500_chargalg_check_current_step_status(di);
1347
1348 if (is_ab8500(di->parent)) {
1349 ret = abx500_chargalg_check_charger_enable(di);
1350 if (ret < 0)
1351 dev_err(di->dev, "Checking charger is enabled error"
1352 ": Returned Value %d\n", ret);
1353 }
1354
1355
1356
1357
1358
1359
1360 if (!charger_status ||
1361 (di->events.batt_unknown && !di->bm->chg_unknown_bat)) {
1362 if (di->charge_state != STATE_HANDHELD) {
1363 di->events.safety_timer_expired = false;
1364 abx500_chargalg_state_to(di, STATE_HANDHELD_INIT);
1365 }
1366 }
1367
1368
1369 else if (di->charge_state == STATE_SUSPENDED_INIT ||
1370 di->charge_state == STATE_SUSPENDED) {
1371
1372 }
1373
1374
1375 else if (di->events.safety_timer_expired) {
1376 if (di->charge_state != STATE_SAFETY_TIMER_EXPIRED)
1377 abx500_chargalg_state_to(di,
1378 STATE_SAFETY_TIMER_EXPIRED_INIT);
1379 }
1380
1381
1382
1383
1384
1385
1386 else if (di->events.batt_rem) {
1387 if (di->charge_state != STATE_BATT_REMOVED)
1388 abx500_chargalg_state_to(di, STATE_BATT_REMOVED_INIT);
1389 }
1390
1391 else if (di->events.mainextchnotok || di->events.usbchargernotok) {
1392
1393
1394
1395
1396 if (di->charge_state != STATE_CHG_NOT_OK &&
1397 !di->events.vbus_collapsed)
1398 abx500_chargalg_state_to(di, STATE_CHG_NOT_OK_INIT);
1399 }
1400
1401 else if (di->events.vbus_ovv ||
1402 di->events.main_ovv ||
1403 di->events.batt_ovv ||
1404 !di->chg_info.usb_chg_ok ||
1405 !di->chg_info.ac_chg_ok) {
1406 if (di->charge_state != STATE_OVV_PROTECT)
1407 abx500_chargalg_state_to(di, STATE_OVV_PROTECT_INIT);
1408 }
1409
1410 else if (di->events.main_thermal_prot ||
1411 di->events.usb_thermal_prot) {
1412 if (di->charge_state != STATE_HW_TEMP_PROTECT)
1413 abx500_chargalg_state_to(di,
1414 STATE_HW_TEMP_PROTECT_INIT);
1415 }
1416
1417 else if (di->events.btemp_underover) {
1418 if (di->charge_state != STATE_TEMP_UNDEROVER)
1419 abx500_chargalg_state_to(di,
1420 STATE_TEMP_UNDEROVER_INIT);
1421 }
1422
1423 else if (di->events.ac_wd_expired ||
1424 di->events.usb_wd_expired) {
1425 if (di->charge_state != STATE_WD_EXPIRED)
1426 abx500_chargalg_state_to(di, STATE_WD_EXPIRED_INIT);
1427 }
1428
1429 else if (di->events.btemp_lowhigh) {
1430 if (di->charge_state != STATE_TEMP_LOWHIGH)
1431 abx500_chargalg_state_to(di, STATE_TEMP_LOWHIGH_INIT);
1432 }
1433
1434 dev_dbg(di->dev,
1435 "[CHARGALG] Vb %d Ib_avg %d Ib_inst %d Tb %d Cap %d Maint %d "
1436 "State %s Active_chg %d Chg_status %d AC %d USB %d "
1437 "AC_online %d USB_online %d AC_CV %d USB_CV %d AC_I %d "
1438 "USB_I %d AC_Vset %d AC_Iset %d USB_Vset %d USB_Iset %d\n",
1439 di->batt_data.volt,
1440 di->batt_data.avg_curr,
1441 di->batt_data.inst_curr,
1442 di->batt_data.temp,
1443 di->batt_data.percent,
1444 di->maintenance_chg,
1445 states[di->charge_state],
1446 di->chg_info.charger_type,
1447 di->charge_status,
1448 di->chg_info.conn_chg & AC_CHG,
1449 di->chg_info.conn_chg & USB_CHG,
1450 di->chg_info.online_chg & AC_CHG,
1451 di->chg_info.online_chg & USB_CHG,
1452 di->events.ac_cv_active,
1453 di->events.usb_cv_active,
1454 di->chg_info.ac_curr,
1455 di->chg_info.usb_curr,
1456 di->chg_info.ac_vset,
1457 di->chg_info.ac_iset,
1458 di->chg_info.usb_vset,
1459 di->chg_info.usb_iset);
1460
1461 switch (di->charge_state) {
1462 case STATE_HANDHELD_INIT:
1463 abx500_chargalg_stop_charging(di);
1464 di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
1465 abx500_chargalg_state_to(di, STATE_HANDHELD);
1466
1467
1468 case STATE_HANDHELD:
1469 break;
1470
1471 case STATE_SUSPENDED_INIT:
1472 if (di->susp_status.ac_suspended)
1473 abx500_chargalg_ac_en(di, false, 0, 0);
1474 if (di->susp_status.usb_suspended)
1475 abx500_chargalg_usb_en(di, false, 0, 0);
1476 abx500_chargalg_stop_safety_timer(di);
1477 abx500_chargalg_stop_maintenance_timer(di);
1478 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1479 di->maintenance_chg = false;
1480 abx500_chargalg_state_to(di, STATE_SUSPENDED);
1481 power_supply_changed(&di->chargalg_psy);
1482
1483
1484 case STATE_SUSPENDED:
1485
1486 break;
1487
1488 case STATE_BATT_REMOVED_INIT:
1489 abx500_chargalg_stop_charging(di);
1490 abx500_chargalg_state_to(di, STATE_BATT_REMOVED);
1491
1492
1493 case STATE_BATT_REMOVED:
1494 if (!di->events.batt_rem)
1495 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1496 break;
1497
1498 case STATE_HW_TEMP_PROTECT_INIT:
1499 abx500_chargalg_stop_charging(di);
1500 abx500_chargalg_state_to(di, STATE_HW_TEMP_PROTECT);
1501
1502
1503 case STATE_HW_TEMP_PROTECT:
1504 if (!di->events.main_thermal_prot &&
1505 !di->events.usb_thermal_prot)
1506 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1507 break;
1508
1509 case STATE_OVV_PROTECT_INIT:
1510 abx500_chargalg_stop_charging(di);
1511 abx500_chargalg_state_to(di, STATE_OVV_PROTECT);
1512
1513
1514 case STATE_OVV_PROTECT:
1515 if (!di->events.vbus_ovv &&
1516 !di->events.main_ovv &&
1517 !di->events.batt_ovv &&
1518 di->chg_info.usb_chg_ok &&
1519 di->chg_info.ac_chg_ok)
1520 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1521 break;
1522
1523 case STATE_CHG_NOT_OK_INIT:
1524 abx500_chargalg_stop_charging(di);
1525 abx500_chargalg_state_to(di, STATE_CHG_NOT_OK);
1526
1527
1528 case STATE_CHG_NOT_OK:
1529 if (!di->events.mainextchnotok &&
1530 !di->events.usbchargernotok)
1531 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1532 break;
1533
1534 case STATE_SAFETY_TIMER_EXPIRED_INIT:
1535 abx500_chargalg_stop_charging(di);
1536 abx500_chargalg_state_to(di, STATE_SAFETY_TIMER_EXPIRED);
1537
1538
1539 case STATE_SAFETY_TIMER_EXPIRED:
1540
1541 break;
1542
1543 case STATE_NORMAL_INIT:
1544 if ((di->chg_info.charger_type & USB_CHG) &&
1545 di->usb_chg->power_path) {
1546 if (di->batt_data.volt >
1547 (di->bm->fg_params->lowbat_threshold +
1548 BAT_PLUS_MARGIN)) {
1549 ab8540_chargalg_usb_pre_chg_en(di, false);
1550 ab8540_chargalg_usb_pp_en(di, false);
1551 } else {
1552 ab8540_chargalg_usb_pp_en(di, true);
1553 ab8540_chargalg_usb_pre_chg_en(di, true);
1554 abx500_chargalg_state_to(di,
1555 STATE_USB_PP_PRE_CHARGE);
1556 break;
1557 }
1558 }
1559
1560 if (di->curr_status.curr_step == CHARGALG_CURR_STEP_LOW)
1561 abx500_chargalg_stop_charging(di);
1562 else {
1563 curr_step_lvl = di->bm->bat_type[
1564 di->bm->batt_id].normal_cur_lvl
1565 * di->curr_status.curr_step
1566 / CHARGALG_CURR_STEP_HIGH;
1567 abx500_chargalg_start_charging(di,
1568 di->bm->bat_type[di->bm->batt_id]
1569 .normal_vol_lvl, curr_step_lvl);
1570 }
1571
1572 abx500_chargalg_state_to(di, STATE_NORMAL);
1573 abx500_chargalg_start_safety_timer(di);
1574 abx500_chargalg_stop_maintenance_timer(di);
1575 init_maxim_chg_curr(di);
1576 di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
1577 di->eoc_cnt = 0;
1578 di->maintenance_chg = false;
1579 power_supply_changed(&di->chargalg_psy);
1580
1581 break;
1582
1583 case STATE_USB_PP_PRE_CHARGE:
1584 if (di->batt_data.volt >
1585 (di->bm->fg_params->lowbat_threshold +
1586 BAT_PLUS_MARGIN))
1587 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1588 break;
1589
1590 case STATE_NORMAL:
1591 handle_maxim_chg_curr(di);
1592 if (di->charge_status == POWER_SUPPLY_STATUS_FULL &&
1593 di->maintenance_chg) {
1594 if (di->bm->no_maintenance)
1595 abx500_chargalg_state_to(di,
1596 STATE_WAIT_FOR_RECHARGE_INIT);
1597 else
1598 abx500_chargalg_state_to(di,
1599 STATE_MAINTENANCE_A_INIT);
1600 }
1601 break;
1602
1603
1604 case STATE_WAIT_FOR_RECHARGE_INIT:
1605 abx500_chargalg_hold_charging(di);
1606 abx500_chargalg_state_to(di, STATE_WAIT_FOR_RECHARGE);
1607
1608
1609 case STATE_WAIT_FOR_RECHARGE:
1610 if (di->batt_data.percent <=
1611 di->bm->bat_type[di->bm->batt_id].
1612 recharge_cap)
1613 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1614 break;
1615
1616 case STATE_MAINTENANCE_A_INIT:
1617 abx500_chargalg_stop_safety_timer(di);
1618 abx500_chargalg_start_maintenance_timer(di,
1619 di->bm->bat_type[
1620 di->bm->batt_id].maint_a_chg_timer_h);
1621 abx500_chargalg_start_charging(di,
1622 di->bm->bat_type[
1623 di->bm->batt_id].maint_a_vol_lvl,
1624 di->bm->bat_type[
1625 di->bm->batt_id].maint_a_cur_lvl);
1626 abx500_chargalg_state_to(di, STATE_MAINTENANCE_A);
1627 power_supply_changed(&di->chargalg_psy);
1628
1629
1630 case STATE_MAINTENANCE_A:
1631 if (di->events.maintenance_timer_expired) {
1632 abx500_chargalg_stop_maintenance_timer(di);
1633 abx500_chargalg_state_to(di, STATE_MAINTENANCE_B_INIT);
1634 }
1635 break;
1636
1637 case STATE_MAINTENANCE_B_INIT:
1638 abx500_chargalg_start_maintenance_timer(di,
1639 di->bm->bat_type[
1640 di->bm->batt_id].maint_b_chg_timer_h);
1641 abx500_chargalg_start_charging(di,
1642 di->bm->bat_type[
1643 di->bm->batt_id].maint_b_vol_lvl,
1644 di->bm->bat_type[
1645 di->bm->batt_id].maint_b_cur_lvl);
1646 abx500_chargalg_state_to(di, STATE_MAINTENANCE_B);
1647 power_supply_changed(&di->chargalg_psy);
1648
1649
1650 case STATE_MAINTENANCE_B:
1651 if (di->events.maintenance_timer_expired) {
1652 abx500_chargalg_stop_maintenance_timer(di);
1653 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1654 }
1655 break;
1656
1657 case STATE_TEMP_LOWHIGH_INIT:
1658 abx500_chargalg_start_charging(di,
1659 di->bm->bat_type[
1660 di->bm->batt_id].low_high_vol_lvl,
1661 di->bm->bat_type[
1662 di->bm->batt_id].low_high_cur_lvl);
1663 abx500_chargalg_stop_maintenance_timer(di);
1664 di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
1665 abx500_chargalg_state_to(di, STATE_TEMP_LOWHIGH);
1666 power_supply_changed(&di->chargalg_psy);
1667
1668
1669 case STATE_TEMP_LOWHIGH:
1670 if (!di->events.btemp_lowhigh)
1671 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1672 break;
1673
1674 case STATE_WD_EXPIRED_INIT:
1675 abx500_chargalg_stop_charging(di);
1676 abx500_chargalg_state_to(di, STATE_WD_EXPIRED);
1677
1678
1679 case STATE_WD_EXPIRED:
1680 if (!di->events.ac_wd_expired &&
1681 !di->events.usb_wd_expired)
1682 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1683 break;
1684
1685 case STATE_TEMP_UNDEROVER_INIT:
1686 abx500_chargalg_stop_charging(di);
1687 abx500_chargalg_state_to(di, STATE_TEMP_UNDEROVER);
1688
1689
1690 case STATE_TEMP_UNDEROVER:
1691 if (!di->events.btemp_underover)
1692 abx500_chargalg_state_to(di, STATE_NORMAL_INIT);
1693 break;
1694 }
1695
1696
1697 if (di->charge_state == STATE_NORMAL_INIT ||
1698 di->charge_state == STATE_MAINTENANCE_A_INIT ||
1699 di->charge_state == STATE_MAINTENANCE_B_INIT)
1700 queue_work(di->chargalg_wq, &di->chargalg_work);
1701}
1702
1703
1704
1705
1706
1707
1708
1709static void abx500_chargalg_periodic_work(struct work_struct *work)
1710{
1711 struct abx500_chargalg *di = container_of(work,
1712 struct abx500_chargalg, chargalg_periodic_work.work);
1713
1714 abx500_chargalg_algorithm(di);
1715
1716
1717
1718
1719
1720 if (di->chg_info.conn_chg)
1721 queue_delayed_work(di->chargalg_wq,
1722 &di->chargalg_periodic_work,
1723 di->bm->interval_charging * HZ);
1724 else
1725 queue_delayed_work(di->chargalg_wq,
1726 &di->chargalg_periodic_work,
1727 di->bm->interval_not_charging * HZ);
1728}
1729
1730
1731
1732
1733
1734
1735
1736static void abx500_chargalg_wd_work(struct work_struct *work)
1737{
1738 int ret;
1739 struct abx500_chargalg *di = container_of(work,
1740 struct abx500_chargalg, chargalg_wd_work.work);
1741
1742 dev_dbg(di->dev, "abx500_chargalg_wd_work\n");
1743
1744 ret = abx500_chargalg_kick_watchdog(di);
1745 if (ret < 0)
1746 dev_err(di->dev, "failed to kick watchdog\n");
1747
1748 queue_delayed_work(di->chargalg_wq,
1749 &di->chargalg_wd_work, CHG_WD_INTERVAL);
1750}
1751
1752
1753
1754
1755
1756
1757
1758static void abx500_chargalg_work(struct work_struct *work)
1759{
1760 struct abx500_chargalg *di = container_of(work,
1761 struct abx500_chargalg, chargalg_work);
1762
1763 abx500_chargalg_algorithm(di);
1764}
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778static int abx500_chargalg_get_property(struct power_supply *psy,
1779 enum power_supply_property psp,
1780 union power_supply_propval *val)
1781{
1782 struct abx500_chargalg *di;
1783
1784 di = to_abx500_chargalg_device_info(psy);
1785
1786 switch (psp) {
1787 case POWER_SUPPLY_PROP_STATUS:
1788 val->intval = di->charge_status;
1789 break;
1790 case POWER_SUPPLY_PROP_HEALTH:
1791 if (di->events.batt_ovv) {
1792 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1793 } else if (di->events.btemp_underover) {
1794 if (di->batt_data.temp <= di->bm->temp_under)
1795 val->intval = POWER_SUPPLY_HEALTH_COLD;
1796 else
1797 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
1798 } else if (di->charge_state == STATE_SAFETY_TIMER_EXPIRED ||
1799 di->charge_state == STATE_SAFETY_TIMER_EXPIRED_INIT) {
1800 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
1801 } else {
1802 val->intval = POWER_SUPPLY_HEALTH_GOOD;
1803 }
1804 break;
1805 default:
1806 return -EINVAL;
1807 }
1808 return 0;
1809}
1810
1811
1812
1813static ssize_t abx500_chargalg_curr_step_show(struct abx500_chargalg *di,
1814 char *buf)
1815{
1816 return sprintf(buf, "%d\n", di->curr_status.curr_step);
1817}
1818
1819static ssize_t abx500_chargalg_curr_step_store(struct abx500_chargalg *di,
1820 const char *buf, size_t length)
1821{
1822 long int param;
1823 int ret;
1824
1825 ret = kstrtol(buf, 10, ¶m);
1826 if (ret < 0)
1827 return ret;
1828
1829 di->curr_status.curr_step = param;
1830 if (di->curr_status.curr_step >= CHARGALG_CURR_STEP_LOW &&
1831 di->curr_status.curr_step <= CHARGALG_CURR_STEP_HIGH) {
1832 di->curr_status.curr_step_change = true;
1833 queue_work(di->chargalg_wq, &di->chargalg_work);
1834 } else
1835 dev_info(di->dev, "Wrong current step\n"
1836 "Enter 0. Disable AC/USB Charging\n"
1837 "1--100. Set AC/USB charging current step\n"
1838 "100. Enable AC/USB Charging\n");
1839
1840 return strlen(buf);
1841}
1842
1843
1844static ssize_t abx500_chargalg_en_show(struct abx500_chargalg *di,
1845 char *buf)
1846{
1847 return sprintf(buf, "%d\n",
1848 di->susp_status.ac_suspended &&
1849 di->susp_status.usb_suspended);
1850}
1851
1852static ssize_t abx500_chargalg_en_store(struct abx500_chargalg *di,
1853 const char *buf, size_t length)
1854{
1855 long int param;
1856 int ac_usb;
1857 int ret;
1858
1859 ret = kstrtol(buf, 10, ¶m);
1860 if (ret < 0)
1861 return ret;
1862
1863 ac_usb = param;
1864 switch (ac_usb) {
1865 case 0:
1866
1867 di->susp_status.ac_suspended = true;
1868 di->susp_status.usb_suspended = true;
1869 di->susp_status.suspended_change = true;
1870
1871 queue_work(di->chargalg_wq,
1872 &di->chargalg_work);
1873 break;
1874 case 1:
1875
1876 di->susp_status.ac_suspended = false;
1877 di->susp_status.suspended_change = true;
1878
1879 queue_work(di->chargalg_wq,
1880 &di->chargalg_work);
1881 break;
1882 case 2:
1883
1884 di->susp_status.usb_suspended = false;
1885 di->susp_status.suspended_change = true;
1886
1887 queue_work(di->chargalg_wq,
1888 &di->chargalg_work);
1889 break;
1890 default:
1891 dev_info(di->dev, "Wrong input\n"
1892 "Enter 0. Disable AC/USB Charging\n"
1893 "1. Enable AC charging\n"
1894 "2. Enable USB Charging\n");
1895 };
1896 return strlen(buf);
1897}
1898
1899static struct abx500_chargalg_sysfs_entry abx500_chargalg_en_charger =
1900 __ATTR(chargalg, 0644, abx500_chargalg_en_show,
1901 abx500_chargalg_en_store);
1902
1903static struct abx500_chargalg_sysfs_entry abx500_chargalg_curr_step =
1904 __ATTR(chargalg_curr_step, 0644, abx500_chargalg_curr_step_show,
1905 abx500_chargalg_curr_step_store);
1906
1907static ssize_t abx500_chargalg_sysfs_show(struct kobject *kobj,
1908 struct attribute *attr, char *buf)
1909{
1910 struct abx500_chargalg_sysfs_entry *entry = container_of(attr,
1911 struct abx500_chargalg_sysfs_entry, attr);
1912
1913 struct abx500_chargalg *di = container_of(kobj,
1914 struct abx500_chargalg, chargalg_kobject);
1915
1916 if (!entry->show)
1917 return -EIO;
1918
1919 return entry->show(di, buf);
1920}
1921
1922static ssize_t abx500_chargalg_sysfs_charger(struct kobject *kobj,
1923 struct attribute *attr, const char *buf, size_t length)
1924{
1925 struct abx500_chargalg_sysfs_entry *entry = container_of(attr,
1926 struct abx500_chargalg_sysfs_entry, attr);
1927
1928 struct abx500_chargalg *di = container_of(kobj,
1929 struct abx500_chargalg, chargalg_kobject);
1930
1931 if (!entry->store)
1932 return -EIO;
1933
1934 return entry->store(di, buf, length);
1935}
1936
1937static struct attribute *abx500_chargalg_chg[] = {
1938 &abx500_chargalg_en_charger.attr,
1939 &abx500_chargalg_curr_step.attr,
1940 NULL,
1941};
1942
1943static const struct sysfs_ops abx500_chargalg_sysfs_ops = {
1944 .show = abx500_chargalg_sysfs_show,
1945 .store = abx500_chargalg_sysfs_charger,
1946};
1947
1948static struct kobj_type abx500_chargalg_ktype = {
1949 .sysfs_ops = &abx500_chargalg_sysfs_ops,
1950 .default_attrs = abx500_chargalg_chg,
1951};
1952
1953
1954
1955
1956
1957
1958
1959static void abx500_chargalg_sysfs_exit(struct abx500_chargalg *di)
1960{
1961 kobject_del(&di->chargalg_kobject);
1962}
1963
1964
1965
1966
1967
1968
1969
1970
1971static int abx500_chargalg_sysfs_init(struct abx500_chargalg *di)
1972{
1973 int ret = 0;
1974
1975 ret = kobject_init_and_add(&di->chargalg_kobject,
1976 &abx500_chargalg_ktype,
1977 NULL, "abx500_chargalg");
1978 if (ret < 0)
1979 dev_err(di->dev, "failed to create sysfs entry\n");
1980
1981 return ret;
1982}
1983
1984
1985#if defined(CONFIG_PM)
1986static int abx500_chargalg_resume(struct platform_device *pdev)
1987{
1988 struct abx500_chargalg *di = platform_get_drvdata(pdev);
1989
1990
1991 if (di->chg_info.online_chg)
1992 queue_delayed_work(di->chargalg_wq, &di->chargalg_wd_work, 0);
1993
1994
1995
1996
1997
1998 queue_delayed_work(di->chargalg_wq, &di->chargalg_periodic_work, 0);
1999
2000 return 0;
2001}
2002
2003static int abx500_chargalg_suspend(struct platform_device *pdev,
2004 pm_message_t state)
2005{
2006 struct abx500_chargalg *di = platform_get_drvdata(pdev);
2007
2008 if (di->chg_info.online_chg)
2009 cancel_delayed_work_sync(&di->chargalg_wd_work);
2010
2011 cancel_delayed_work_sync(&di->chargalg_periodic_work);
2012
2013 return 0;
2014}
2015#else
2016#define abx500_chargalg_suspend NULL
2017#define abx500_chargalg_resume NULL
2018#endif
2019
2020static int abx500_chargalg_remove(struct platform_device *pdev)
2021{
2022 struct abx500_chargalg *di = platform_get_drvdata(pdev);
2023
2024
2025 abx500_chargalg_sysfs_exit(di);
2026
2027 hrtimer_cancel(&di->safety_timer);
2028 hrtimer_cancel(&di->maintenance_timer);
2029
2030 cancel_delayed_work_sync(&di->chargalg_periodic_work);
2031 cancel_delayed_work_sync(&di->chargalg_wd_work);
2032 cancel_work_sync(&di->chargalg_work);
2033
2034
2035 destroy_workqueue(di->chargalg_wq);
2036
2037 power_supply_unregister(&di->chargalg_psy);
2038 platform_set_drvdata(pdev, NULL);
2039
2040 return 0;
2041}
2042
2043static char *supply_interface[] = {
2044 "ab8500_fg",
2045};
2046
2047static int abx500_chargalg_probe(struct platform_device *pdev)
2048{
2049 struct device_node *np = pdev->dev.of_node;
2050 struct abx500_bm_data *plat = pdev->dev.platform_data;
2051 struct abx500_chargalg *di;
2052 int ret = 0;
2053
2054 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL);
2055 if (!di) {
2056 dev_err(&pdev->dev, "%s no mem for ab8500_chargalg\n", __func__);
2057 return -ENOMEM;
2058 }
2059
2060 if (!plat) {
2061 dev_err(&pdev->dev, "no battery management data supplied\n");
2062 return -EINVAL;
2063 }
2064 di->bm = plat;
2065
2066 if (np) {
2067 ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm);
2068 if (ret) {
2069 dev_err(&pdev->dev, "failed to get battery information\n");
2070 return ret;
2071 }
2072 }
2073
2074
2075 di->dev = &pdev->dev;
2076 di->parent = dev_get_drvdata(pdev->dev.parent);
2077
2078
2079 di->chargalg_psy.name = "abx500_chargalg";
2080 di->chargalg_psy.type = POWER_SUPPLY_TYPE_BATTERY;
2081 di->chargalg_psy.properties = abx500_chargalg_props;
2082 di->chargalg_psy.num_properties = ARRAY_SIZE(abx500_chargalg_props);
2083 di->chargalg_psy.get_property = abx500_chargalg_get_property;
2084 di->chargalg_psy.supplied_to = supply_interface;
2085 di->chargalg_psy.num_supplicants = ARRAY_SIZE(supply_interface),
2086 di->chargalg_psy.external_power_changed =
2087 abx500_chargalg_external_power_changed;
2088
2089
2090 hrtimer_init(&di->safety_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
2091 di->safety_timer.function = abx500_chargalg_safety_timer_expired;
2092
2093
2094 hrtimer_init(&di->maintenance_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
2095 di->maintenance_timer.function =
2096 abx500_chargalg_maintenance_timer_expired;
2097
2098
2099 di->chargalg_wq =
2100 create_singlethread_workqueue("abx500_chargalg_wq");
2101 if (di->chargalg_wq == NULL) {
2102 dev_err(di->dev, "failed to create work queue\n");
2103 return -ENOMEM;
2104 }
2105
2106
2107 INIT_DEFERRABLE_WORK(&di->chargalg_periodic_work,
2108 abx500_chargalg_periodic_work);
2109 INIT_DEFERRABLE_WORK(&di->chargalg_wd_work,
2110 abx500_chargalg_wd_work);
2111
2112
2113 INIT_WORK(&di->chargalg_work, abx500_chargalg_work);
2114
2115
2116 di->chg_info.prev_conn_chg = -1;
2117
2118
2119 ret = power_supply_register(di->dev, &di->chargalg_psy);
2120 if (ret) {
2121 dev_err(di->dev, "failed to register chargalg psy\n");
2122 goto free_chargalg_wq;
2123 }
2124
2125 platform_set_drvdata(pdev, di);
2126
2127
2128 ret = abx500_chargalg_sysfs_init(di);
2129 if (ret) {
2130 dev_err(di->dev, "failed to create sysfs entry\n");
2131 goto free_psy;
2132 }
2133 di->curr_status.curr_step = CHARGALG_CURR_STEP_HIGH;
2134
2135
2136 queue_delayed_work(di->chargalg_wq, &di->chargalg_periodic_work, 0);
2137
2138 dev_info(di->dev, "probe success\n");
2139 return ret;
2140
2141free_psy:
2142 power_supply_unregister(&di->chargalg_psy);
2143free_chargalg_wq:
2144 destroy_workqueue(di->chargalg_wq);
2145 return ret;
2146}
2147
2148static const struct of_device_id ab8500_chargalg_match[] = {
2149 { .compatible = "stericsson,ab8500-chargalg", },
2150 { },
2151};
2152
2153static struct platform_driver abx500_chargalg_driver = {
2154 .probe = abx500_chargalg_probe,
2155 .remove = abx500_chargalg_remove,
2156 .suspend = abx500_chargalg_suspend,
2157 .resume = abx500_chargalg_resume,
2158 .driver = {
2159 .name = "ab8500-chargalg",
2160 .owner = THIS_MODULE,
2161 .of_match_table = ab8500_chargalg_match,
2162 },
2163};
2164
2165module_platform_driver(abx500_chargalg_driver);
2166
2167MODULE_LICENSE("GPL v2");
2168MODULE_AUTHOR("Johan Palsson, Karl Komierowski");
2169MODULE_ALIAS("platform:abx500-chargalg");
2170MODULE_DESCRIPTION("abx500 battery charging algorithm");
2171