3 * Samsung Mobile Battery Driver
5 * Copyright (C) 2012 Samsung Electronics
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
14 #include <linux/battery/sec_battery.h>
16 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
17 #include <linux/suspend.h>
20 #ifdef CONFIG_SLEEP_MONITOR
21 #include <linux/power/sleep_monitor.h>
24 #if defined(CONFIG_MACH_CORSICA_VE) || defined(CONFIG_MACH_VIVALTO)
25 extern int get_hw_rev();
27 //extern int sprdbat_creat_caliberate_attr(struct device *dev);
29 extern void sec_bat_initial_check(void);
31 static struct device_attribute sec_battery_attrs[] = {
32 SEC_BATTERY_ATTR(batt_reset_soc),
33 SEC_BATTERY_ATTR(batt_read_raw_soc),
34 SEC_BATTERY_ATTR(batt_read_adj_soc),
35 SEC_BATTERY_ATTR(batt_type),
36 SEC_BATTERY_ATTR(batt_vfocv),
37 SEC_BATTERY_ATTR(batt_vol_adc),
38 SEC_BATTERY_ATTR(batt_vol_adc_cal),
39 SEC_BATTERY_ATTR(batt_vol_aver),
40 SEC_BATTERY_ATTR(batt_vol_adc_aver),
41 SEC_BATTERY_ATTR(batt_current_ua_now),
42 SEC_BATTERY_ATTR(batt_current_ua_avg),
43 SEC_BATTERY_ATTR(batt_temp),
44 SEC_BATTERY_ATTR(batt_temp_adc),
45 SEC_BATTERY_ATTR(batt_temp_aver),
46 SEC_BATTERY_ATTR(batt_temp_adc_aver),
47 SEC_BATTERY_ATTR(batt_vf_adc),
48 SEC_BATTERY_ATTR(batt_slate_mode),
50 SEC_BATTERY_ATTR(batt_lp_charging),
51 SEC_BATTERY_ATTR(siop_activated),
52 SEC_BATTERY_ATTR(siop_level),
53 SEC_BATTERY_ATTR(batt_charging_source),
54 SEC_BATTERY_ATTR(fg_reg_dump),
55 SEC_BATTERY_ATTR(fg_reset_cap),
56 SEC_BATTERY_ATTR(fg_capacity),
57 SEC_BATTERY_ATTR(auth),
58 SEC_BATTERY_ATTR(chg_current_adc),
59 SEC_BATTERY_ATTR(wc_adc),
60 SEC_BATTERY_ATTR(wc_status),
61 SEC_BATTERY_ATTR(wc_enable),
62 SEC_BATTERY_ATTR(factory_mode),
63 SEC_BATTERY_ATTR(update),
64 SEC_BATTERY_ATTR(test_mode),
66 SEC_BATTERY_ATTR(call),
67 SEC_BATTERY_ATTR(2g_call),
68 SEC_BATTERY_ATTR(talk_gsm),
69 SEC_BATTERY_ATTR(3g_call),
70 SEC_BATTERY_ATTR(talk_wcdma),
71 SEC_BATTERY_ATTR(music),
72 SEC_BATTERY_ATTR(video),
73 SEC_BATTERY_ATTR(browser),
74 SEC_BATTERY_ATTR(hotspot),
75 SEC_BATTERY_ATTR(camera),
76 SEC_BATTERY_ATTR(camcorger),
77 SEC_BATTERY_ATTR(data_call),
78 SEC_BATTERY_ATTR(wifi),
79 SEC_BATTERY_ATTR(wibro),
80 SEC_BATTERY_ATTR(lte),
81 SEC_BATTERY_ATTR(lcd),
82 SEC_BATTERY_ATTR(gps),
83 SEC_BATTERY_ATTR(event),
84 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
85 SEC_BATTERY_ATTR(test_charge_current),
86 SEC_BATTERY_ATTR(set_stability_test),
90 static enum power_supply_property sec_battery_props[] = {
91 POWER_SUPPLY_PROP_STATUS,
92 POWER_SUPPLY_PROP_CHARGE_TYPE,
93 POWER_SUPPLY_PROP_HEALTH,
94 POWER_SUPPLY_PROP_PRESENT,
95 POWER_SUPPLY_PROP_ONLINE,
96 POWER_SUPPLY_PROP_TECHNOLOGY,
97 POWER_SUPPLY_PROP_VOLTAGE_NOW,
98 POWER_SUPPLY_PROP_VOLTAGE_AVG,
99 POWER_SUPPLY_PROP_CURRENT_NOW,
100 POWER_SUPPLY_PROP_CURRENT_AVG,
101 POWER_SUPPLY_PROP_CHARGE_NOW,
102 POWER_SUPPLY_PROP_CAPACITY,
103 POWER_SUPPLY_PROP_TEMP,
104 POWER_SUPPLY_PROP_TEMP_AMBIENT,
107 static enum power_supply_property sec_power_props[] = {
108 POWER_SUPPLY_PROP_ONLINE,
111 static enum power_supply_property sec_ps_props[] = {
112 POWER_SUPPLY_PROP_STATUS,
113 POWER_SUPPLY_PROP_ONLINE,
116 static char *supply_list[] = {
120 char *sec_bat_charging_mode_str[] = {
128 char *sec_bat_status_str[] = {
136 char *sec_bat_health_str[] = {
146 "Watchdog timer expier",
147 "Safety timer expier",
152 static int sec_bat_set_charge(
153 struct sec_battery_info *battery,
156 union power_supply_propval val;
159 ktime_t current_time;
161 val.intval = battery->status;
162 psy_do_property(battery->pdata->charger_name, set,
163 POWER_SUPPLY_PROP_STATUS, val);
164 #if defined(ANDROID_ALARM_ACTIVATED)
165 current_time = alarm_get_elapsed_realtime();
166 ts = ktime_to_timespec(current_time);
168 current_time = ktime_get_boottime();
169 ts = ktime_to_timespec(current_time);
173 val.intval = battery->cable_type;
174 /*Reset charging start time only in initial charging start */
175 if (battery->charging_start_time == 0) {
176 battery->charging_start_time =
177 ts.tv_sec ? ts.tv_sec : 1;
178 battery->charging_next_time =
179 battery->pdata->charging_reset_time;
182 val.intval = POWER_SUPPLY_TYPE_BATTERY;
183 battery->charging_start_time = 0;
184 battery->charging_passed_time = 0;
185 battery->charging_next_time = 0;
186 battery->charging_fullcharged_time = 0;
187 battery->full_check_cnt = 0;
190 battery->temp_high_cnt = 0;
191 battery->temp_low_cnt = 0;
192 battery->temp_recover_cnt = 0;
194 psy_do_property(battery->pdata->charger_name, set,
195 POWER_SUPPLY_PROP_ONLINE, val);
197 psy_do_property(battery->pdata->fuelgauge_name, set,
198 POWER_SUPPLY_PROP_ONLINE, val);
203 static int sec_bat_get_adc_data(struct sec_battery_info *battery,
204 int adc_ch, int count)
217 for (i = 0; i < count; i++) {
218 mutex_lock(&battery->adclock);
220 adc_data = adc_read(battery, adc_ch);
222 adc_data = adc_read(battery->pdata, adc_ch);
224 mutex_unlock(&battery->adclock);
230 if (adc_data > adc_max)
232 else if (adc_data < adc_min)
238 adc_total += adc_data;
241 return (adc_total - adc_max - adc_min) / (count - 2);
247 static unsigned long calculate_average_adc(
248 struct sec_battery_info *battery,
249 int channel, int adc)
251 unsigned int cnt = 0;
256 cnt = battery->adc_sample[channel].cnt;
257 total_adc = battery->adc_sample[channel].total_adc;
260 dev_err(battery->dev,
261 "%s : Invalid ADC : %d\n", __func__, adc);
262 adc = battery->adc_sample[channel].average_adc;
265 if (cnt < ADC_SAMPLE_COUNT) {
266 battery->adc_sample[channel].adc_arr[cnt] = adc;
267 battery->adc_sample[channel].index = cnt;
268 battery->adc_sample[channel].cnt = ++cnt;
271 average_adc = total_adc / cnt;
273 index = battery->adc_sample[channel].index;
274 if (++index >= ADC_SAMPLE_COUNT)
277 total_adc = total_adc -
278 battery->adc_sample[channel].adc_arr[index] + adc;
279 average_adc = total_adc / ADC_SAMPLE_COUNT;
281 battery->adc_sample[channel].adc_arr[index] = adc;
282 battery->adc_sample[channel].index = index;
285 battery->adc_sample[channel].total_adc = total_adc;
286 battery->adc_sample[channel].average_adc = average_adc;
292 static int sec_bat_get_adc_value(
293 struct sec_battery_info *battery, int channel)
297 adc = sec_bat_get_adc_data(battery, channel,
298 battery->pdata->adc_check_count);
301 dev_err(battery->dev,
302 "%s: Error in ADC\n", __func__);
309 static int sec_bat_get_charger_type_adc
310 (struct sec_battery_info *battery)
312 /* It is true something valid is
313 connected to the device for charging.
314 By default this something is considered to be USB.*/
315 int result = POWER_SUPPLY_TYPE_USB;
320 /* Do NOT check cable type when cable_switch_check() returns false
321 * and keep current cable type
323 if (battery->pdata->cable_switch_check &&
324 !battery->pdata->cable_switch_check())
325 return battery->cable_type;
327 adc = sec_bat_get_adc_value(battery,
328 SEC_BAT_ADC_CHANNEL_CABLE_CHECK);
330 /* Do NOT check cable type when cable_switch_normal() returns false
331 * and keep current cable type
333 if (battery->pdata->cable_switch_normal &&
334 !battery->pdata->cable_switch_normal())
335 return battery->cable_type;
337 for (i = 0; i < SEC_SIZEOF_POWER_SUPPLY_TYPE; i++)
338 if ((adc > battery->pdata->cable_adc_value[i].min) &&
339 (adc < battery->pdata->cable_adc_value[i].max))
341 if (i >= SEC_SIZEOF_POWER_SUPPLY_TYPE)
342 dev_err(battery->dev,
343 "%s : default USB\n", __func__);
347 dev_dbg(battery->dev, "%s : result(%d), adc(%d)\n",
348 __func__, result, adc);
353 static bool sec_bat_check_vf_adc(struct sec_battery_info *battery)
357 adc = sec_bat_get_adc_data(battery,
358 SEC_BAT_ADC_CHANNEL_BAT_CHECK,
359 battery->pdata->adc_check_count);
362 dev_err(battery->dev, "%s: VF ADC error\n", __func__);
363 adc = battery->check_adc_value;
365 battery->check_adc_value = adc;
367 if ((battery->check_adc_value < battery->pdata->check_adc_max) &&
368 (battery->check_adc_value >= battery->pdata->check_adc_min))
374 static bool sec_bat_check_by_psy(struct sec_battery_info *battery)
377 union power_supply_propval value;
381 switch (battery->pdata->battery_check_type) {
382 case SEC_BATTERY_CHECK_PMIC:
383 psy_name = battery->pdata->pmic_name;
385 case SEC_BATTERY_CHECK_FUELGAUGE:
386 psy_name = battery->pdata->fuelgauge_name;
388 case SEC_BATTERY_CHECK_CHARGER:
389 psy_name = battery->pdata->charger_name;
392 dev_err(battery->dev,
393 "%s: Invalid Battery Check Type\n", __func__);
395 goto battery_check_error;
399 psy_do_property(psy_name, get,
400 POWER_SUPPLY_PROP_PRESENT, value);
401 ret = (bool)value.intval;
407 static bool sec_bat_check(struct sec_battery_info *battery)
412 if (battery->pdata->check_jig_status) {
413 if (battery->factory_mode
414 || battery->pdata->check_jig_status()) {
415 dev_dbg(battery->dev, "%s: No need to check in factory mode\n",
419 } else if (battery->factory_mode) {
420 dev_dbg(battery->dev, "%s: No need to check in factory mode\n",
425 if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
426 battery->health != POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
427 dev_dbg(battery->dev, "%s: No need to check\n", __func__);
431 switch (battery->pdata->battery_check_type) {
432 case SEC_BATTERY_CHECK_ADC:
433 ret = sec_bat_check_vf_adc(battery);
435 case SEC_BATTERY_CHECK_INT:
436 case SEC_BATTERY_CHECK_CALLBACK:
437 if(battery->cable_type == POWER_SUPPLY_TYPE_BATTERY) {
438 ret = battery->present;
440 if (battery->pdata->check_battery_callback)
441 ret = battery->pdata->check_battery_callback(battery);
444 case SEC_BATTERY_CHECK_PMIC:
445 case SEC_BATTERY_CHECK_FUELGAUGE:
446 case SEC_BATTERY_CHECK_CHARGER:
447 ret = sec_bat_check_by_psy(battery);
449 case SEC_BATTERY_CHECK_NONE:
450 dev_info(battery->dev, "%s: No Check\n", __func__);
458 static bool sec_bat_get_cable_type(
459 struct sec_battery_info *battery,
460 int cable_source_type)
466 cable_type = battery->cable_type;
468 if (cable_source_type & SEC_BATTERY_CABLE_SOURCE_CALLBACK) {
469 if (battery->pdata->check_cable_callback)
471 battery->pdata->check_cable_callback(battery);
474 if (cable_source_type & SEC_BATTERY_CABLE_SOURCE_ADC) {
475 if (gpio_get_value_cansleep(
476 battery->pdata->bat_gpio_ta_nconnected) ^
477 battery->pdata->bat_polarity_ta_nconnected)
478 cable_type = POWER_SUPPLY_TYPE_BATTERY;
481 sec_bat_get_charger_type_adc(battery);
484 if (battery->cable_type == cable_type) {
485 dev_dbg(battery->dev,
486 "%s: No need to change cable status\n", __func__);
488 if (cable_type < POWER_SUPPLY_TYPE_BATTERY ||
489 cable_type >= SEC_SIZEOF_POWER_SUPPLY_TYPE) {
490 dev_err(battery->dev,
491 "%s: Invalid cable type\n", __func__);
493 battery->cable_type = cable_type;
494 if (battery->pdata->check_cable_result_callback)
495 battery->pdata->check_cable_result_callback(
496 battery->cable_type);
500 dev_dbg(battery->dev, "%s: Cable Changed (%d)\n",
501 __func__, battery->cable_type);
508 static bool sec_bat_battery_cable_check(struct sec_battery_info *battery)
510 if (!sec_bat_check(battery)) {
511 if (battery->check_count < battery->pdata->check_count)
512 battery->check_count++;
514 dev_err(battery->dev,
515 "%s: Battery Disconnected\n", __func__);
516 battery->present = false;
517 battery->health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
519 if (battery->status !=
520 POWER_SUPPLY_STATUS_DISCHARGING) {
522 POWER_SUPPLY_STATUS_NOT_CHARGING;
523 sec_bat_set_charge(battery, false);
526 if (battery->pdata->check_battery_result_callback)
528 check_battery_result_callback();
532 battery->check_count = 0;
534 battery->present = true;
536 if (battery->health == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
537 battery->health = POWER_SUPPLY_HEALTH_GOOD;
539 if (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
540 battery->status = POWER_SUPPLY_STATUS_CHARGING;
542 sec_bat_set_charge(battery, true);
546 dev_info(battery->dev, "%s: Battery Connected\n", __func__);
548 if (battery->pdata->cable_check_type &
549 SEC_BATTERY_CABLE_CHECK_POLLING) {
550 if (sec_bat_get_cable_type(battery,
551 battery->pdata->cable_source_type)) {
552 wake_lock(&battery->cable_wake_lock);
553 queue_work(battery->monitor_wqueue,
554 &battery->cable_work);
560 static int sec_bat_ovp_uvlo_by_psy(struct sec_battery_info *battery)
563 union power_supply_propval value;
565 value.intval = POWER_SUPPLY_HEALTH_GOOD;
567 switch (battery->pdata->ovp_uvlo_check_type) {
568 case SEC_BATTERY_OVP_UVLO_PMICPOLLING:
569 psy_name = battery->pdata->pmic_name;
571 case SEC_BATTERY_OVP_UVLO_CHGPOLLING:
572 psy_name = battery->pdata->charger_name;
575 dev_err(battery->dev,
576 "%s: Invalid OVP/UVLO Check Type\n", __func__);
577 goto ovp_uvlo_check_error;
581 psy_do_property(psy_name, get,
582 POWER_SUPPLY_PROP_HEALTH, value);
584 ovp_uvlo_check_error:
588 static bool sec_bat_ovp_uvlo_result(
589 struct sec_battery_info *battery, int health)
591 if (battery->health != health) {
592 battery->health = health;
594 case POWER_SUPPLY_HEALTH_GOOD:
595 dev_info(battery->dev, "%s: Safe voltage\n", __func__);
596 dev_info(battery->dev, "%s: is_recharging : %d\n", __func__, battery->is_recharging);
597 if (battery->is_recharging)
599 POWER_SUPPLY_STATUS_FULL;
600 else /* Normal Charging */
602 POWER_SUPPLY_STATUS_CHARGING;
604 case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
605 case POWER_SUPPLY_HEALTH_UNDERVOLTAGE:
606 dev_info(battery->dev,
607 "%s: Unsafe voltage (%d)\n",
610 POWER_SUPPLY_STATUS_NOT_CHARGING;
611 /* Take the wakelock during 10 seconds
612 when over-voltage status is detected */
613 wake_lock_timeout(&battery->vbus_wake_lock, HZ * 10);
616 power_supply_changed(&battery->psy_bat);
623 static bool sec_bat_ovp_uvlo(struct sec_battery_info *battery)
627 if (battery->pdata->check_jig_status) {
628 if (battery->factory_mode
629 || battery->pdata->check_jig_status()) {
630 dev_dbg(battery->dev,
631 "%s: No need to check in factory mode\n",
635 } else if (battery->factory_mode) {
636 dev_dbg(battery->dev, "%s: No need to check in factory mode\n",
641 if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
642 battery->health != POWER_SUPPLY_HEALTH_OVERVOLTAGE &&
643 battery->health != POWER_SUPPLY_HEALTH_UNDERVOLTAGE) {
644 dev_dbg(battery->dev, "%s: No need to check\n", __func__);
648 health = battery->health;
650 switch (battery->pdata->ovp_uvlo_check_type) {
651 case SEC_BATTERY_OVP_UVLO_CALLBACK:
652 if (battery->pdata->ovp_uvlo_callback)
653 health = battery->pdata->ovp_uvlo_callback();
655 case SEC_BATTERY_OVP_UVLO_PMICPOLLING:
656 case SEC_BATTERY_OVP_UVLO_CHGPOLLING:
657 health = sec_bat_ovp_uvlo_by_psy(battery);
659 case SEC_BATTERY_OVP_UVLO_PMICINT:
660 case SEC_BATTERY_OVP_UVLO_CHGINT:
661 /* nothing for interrupt check */
666 return sec_bat_ovp_uvlo_result(battery, health);
669 static bool sec_bat_check_recharge(struct sec_battery_info *battery)
671 #if defined(CONFIG_BATTERY_SWELLING)
672 if (battery->swelling_mode == SEC_BATTERY_HIGH_SWELLING_MODE) {
673 if (battery->charging_mode == SEC_BATTERY_CHARGING_NONE) {
674 if ((battery->pdata->recharge_condition_type &
675 SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
676 (battery->voltage_now <=
678 dev_info(battery->dev,
679 "%s: Re-charging by VCELL in high swelling mode(%d)\n",
680 __func__, battery->voltage_now);
681 goto check_recharge_check_count;
684 } else if (battery->swelling_mode == SEC_BATTERY_LOW_SWELLING_MODE) {
685 if (battery->charging_mode == SEC_BATTERY_CHARGING_NONE) {
686 if ((battery->pdata->recharge_condition_type &
687 SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
688 (battery->voltage_now <=
690 dev_info(battery->dev,
691 "%s: Re-charging by VCELL in low swelling mode(%d)\n",
692 __func__, battery->voltage_now);
693 goto check_recharge_check_count;
699 if ((battery->status == POWER_SUPPLY_STATUS_CHARGING) &&
700 (battery->pdata->full_condition_type &
701 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
702 (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)) {
703 dev_info(battery->dev,
704 "%s: Re-charging by NOTIMEFULL (%d)\n",
705 __func__, battery->capacity);
706 goto check_recharge_check_count;
709 if (battery->status == POWER_SUPPLY_STATUS_FULL &&
710 battery->charging_mode == SEC_BATTERY_CHARGING_NONE) {
711 if ((battery->pdata->recharge_condition_type &
712 SEC_BATTERY_RECHARGE_CONDITION_SOC) &&
713 (battery->capacity <=
714 battery->pdata->recharge_condition_soc)) {
715 dev_info(battery->dev,
716 "%s: Re-charging by SOC (%d)\n",
717 __func__, battery->capacity);
718 goto check_recharge_check_count;
721 if ((battery->pdata->recharge_condition_type &
722 SEC_BATTERY_RECHARGE_CONDITION_AVGVCELL) &&
723 (battery->voltage_avg <=
724 battery->pdata->recharge_condition_avgvcell)) {
725 dev_info(battery->dev,
726 "%s: Re-charging by average VCELL (%d)\n",
727 __func__, battery->voltage_avg);
728 goto check_recharge_check_count;
730 if ((battery->pdata->recharge_condition_type &
731 SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
732 (battery->voltage_now <=
733 battery->pdata->recharge_condition_vcell)) {
734 dev_info(battery->dev,
735 "%s: Re-charging by VCELL (%d)\n",
736 __func__, battery->voltage_now);
737 goto check_recharge_check_count;
741 battery->recharge_check_cnt = 0;
744 check_recharge_check_count:
745 if (battery->recharge_check_cnt <
746 battery->pdata->recharge_check_count)
747 battery->recharge_check_cnt++;
748 dev_dbg(battery->dev,
749 "%s: recharge count = %d\n",
750 __func__, battery->recharge_check_cnt);
752 if (battery->recharge_check_cnt >=
753 battery->pdata->recharge_check_count)
759 static bool sec_bat_voltage_check(struct sec_battery_info *battery)
761 if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
762 dev_dbg(battery->dev,
763 "%s: Charging Disabled\n", __func__);
768 if (sec_bat_ovp_uvlo(battery)) {
769 if (battery->pdata->ovp_uvlo_result_callback)
771 ovp_uvlo_result_callback(battery->health);
775 /* Re-Charging check */
776 if (sec_bat_check_recharge(battery)) {
777 if (battery->pdata->full_check_type !=
778 SEC_BATTERY_FULLCHARGED_NONE)
779 battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
781 battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
782 battery->is_recharging = true;
783 sec_bat_set_charge(battery, true);
790 static bool sec_bat_get_temperature_by_adc(
791 struct sec_battery_info *battery,
792 enum power_supply_property psp,
793 union power_supply_propval *value)
801 const sec_bat_adc_table_data_t *temp_adc_table;
802 unsigned int temp_adc_table_size;
805 case POWER_SUPPLY_PROP_TEMP:
806 channel = SEC_BAT_ADC_CHANNEL_TEMP;
807 temp_adc_table = battery->pdata->temp_adc_table;
808 temp_adc_table_size =
809 battery->pdata->temp_adc_table_size;
811 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
812 channel = SEC_BAT_ADC_CHANNEL_TEMP_AMBIENT;
813 temp_adc_table = battery->pdata->temp_amb_adc_table;
814 temp_adc_table_size =
815 battery->pdata->temp_amb_adc_table_size;
818 dev_err(battery->dev,
819 "%s: Invalid Property\n", __func__);
823 temp_adc = sec_bat_get_adc_value(battery, channel);
828 case POWER_SUPPLY_PROP_TEMP:
829 battery->temp_adc = temp_adc;
831 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
832 battery->temp_ambient_adc = temp_adc;
835 dev_err(battery->dev,
836 "%s: Invalid Property\n", __func__);
840 if (temp_adc_table[0].adc >= temp_adc) {
841 temp = temp_adc_table[0].data;
842 goto temp_by_adc_goto;
843 } else if (temp_adc_table[temp_adc_table_size-1].adc <= temp_adc) {
844 temp = temp_adc_table[temp_adc_table_size-1].data;
845 goto temp_by_adc_goto;
848 high = temp_adc_table_size - 1;
850 while (low <= high) {
851 mid = (low + high) / 2;
852 if (temp_adc_table[mid].adc > temp_adc)
854 else if (temp_adc_table[mid].adc < temp_adc)
857 temp = temp_adc_table[mid].data;
858 goto temp_by_adc_goto;
862 temp = temp_adc_table[high].data;
863 temp += (((int)temp_adc_table[low].data - (int)temp_adc_table[high].data) *
864 ((int)temp_adc - (int)temp_adc_table[high].adc)) /
865 ((int)temp_adc_table[low].adc - (int)temp_adc_table[high].adc);
868 value->intval = temp;
870 dev_info(battery->dev,
871 "%s: Temp(%d), Temp-ADC(%d)\n",
872 __func__, temp, temp_adc);
877 static bool sec_bat_temperature(
878 struct sec_battery_info *battery)
883 if (battery->pdata->event_check && battery->event) {
884 battery->temp_high_threshold =
885 battery->pdata->temp_high_threshold_event;
886 battery->temp_high_recovery =
887 battery->pdata->temp_high_recovery_event;
888 battery->temp_low_recovery =
889 battery->pdata->temp_low_recovery_event;
890 battery->temp_low_threshold =
891 battery->pdata->temp_low_threshold_event;
892 } else if (battery->pdata->is_lpm && battery->pdata->is_lpm()) {
893 battery->temp_high_threshold =
894 battery->pdata->temp_high_threshold_lpm;
895 battery->temp_high_recovery =
896 battery->pdata->temp_high_recovery_lpm;
897 battery->temp_low_recovery =
898 battery->pdata->temp_low_recovery_lpm;
899 battery->temp_low_threshold =
900 battery->pdata->temp_low_threshold_lpm;
902 battery->temp_high_threshold =
903 battery->pdata->temp_high_threshold_normal;
904 battery->temp_high_recovery =
905 battery->pdata->temp_high_recovery_normal;
906 battery->temp_low_recovery =
907 battery->pdata->temp_low_recovery_normal;
908 battery->temp_low_threshold =
909 battery->pdata->temp_low_threshold_normal;
912 dev_info(battery->dev,
913 "%s: HT(%d), HR(%d), LT(%d), LR(%d)\n",
914 __func__, battery->temp_high_threshold,
915 battery->temp_high_recovery,
916 battery->temp_low_threshold,
917 battery->temp_low_recovery);
921 #if defined(CONFIG_BATTERY_SWELLING)
922 static void sec_bat_swelling_check(struct sec_battery_info *battery, int temperature)
924 union power_supply_propval val;
926 pr_info("%s: status(%d), swell_mode(%d), temp(%d)\n",
927 __func__, battery->status, battery->swelling_mode, temperature);
930 * under voltage over voltage, battery missing */
931 if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
932 pr_info("%s: DISCHARGING. stop swelling mode\n", __func__);
933 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
934 goto skip_swelling_chek;
937 switch (battery->swelling_mode) {
938 case SEC_BATTERY_NORMAL_MODE:
939 if (temperature >= battery->swelling_temp_high_threshold) {
940 if (temperature >= battery->swelling_temp_dischg_threshold &&
941 battery->voltage_now > 4235) {
942 pr_info("%s: self discharge mode start.\n", __func__);
943 //battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
944 //sec_bat_set_charge(battery, false);
945 battery->swelling_mode = SEC_BATTERY_DISCHG_MODE;
946 #if defined(CONFIG_BATTERY_DISCHG_IC)
947 /*enable discharge */
948 gpio_set_value(battery->pdata->dischg_test, 1);
949 pr_info ("%s: enable discharge\n", __func__);
952 pr_info("%s: high swelling mode start.\n", __func__);
953 //battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
954 //sec_bat_set_charge(battery, false);
955 battery->swelling_mode = SEC_BATTERY_HIGH_SWELLING_MODE;
956 //battery->swelling_block = true;
957 battery->swelling_full_check_cnt = 0;
959 } else if (temperature <= battery->swelling_temp_low_threshold) {
960 pr_info("%s: low swelling mode start.\n", __func__);
961 //battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
962 //sec_bat_set_charge(battery, false);
963 battery->swelling_mode = SEC_BATTERY_LOW_SWELLING_MODE;
964 //battery->swelling_block = true;
965 battery->swelling_full_check_cnt = 0;
968 case SEC_BATTERY_HIGH_SWELLING_MODE:
969 if (temperature < battery->swelling_temp_high_recovery) {
970 pr_info("%s: high swelling mode end.\n", __func__);
972 /* restore float voltage */
973 val.intval = battery->pdata->chg_float_voltage;
974 psy_do_property(battery->pdata->charger_name, set,
975 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
976 battery->swelling_max_vbat = val.intval;
978 //battery->status = POWER_SUPPLY_STATUS_CHARGING;
979 //sec_bat_set_charge(battery, true);
980 //battery->swelling_block = false;
981 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
982 } else if (temperature >= battery->swelling_temp_high_recovery) {
983 if (temperature >= battery->swelling_temp_dischg_threshold &&
984 battery->voltage_now > 4235) {
985 pr_info("%s: self discharge mode start.\n", __func__);
986 //battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
987 //sec_bat_set_charge(battery, false);
988 battery->swelling_mode = SEC_BATTERY_DISCHG_MODE;
989 #if defined(CONFIG_BATTERY_DISCHG_IC)
990 /*enable discharge */
991 gpio_set_value(battery->pdata->dischg_test, 1);
992 pr_info ("%s: enable discharge\n", __func__);
995 if (battery->voltage_now < 4200) {
996 /* change to 4.20V float voltage */
998 psy_do_property(battery->pdata->charger_name, set,
999 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1000 battery->swelling_max_vbat = val.intval;
1002 pr_info("%s: high swelling mode. Vbatt(%d)\n",
1003 __func__, battery->voltage_now);
1007 case SEC_BATTERY_LOW_SWELLING_MODE:
1008 if (temperature > battery->swelling_temp_low_recovery) {
1009 pr_info("%s: low swelling mode end.\n", __func__);
1011 /* restore float voltage */
1012 val.intval = battery->pdata->chg_float_voltage;
1013 psy_do_property(battery->pdata->charger_name, set,
1014 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1015 battery->swelling_max_vbat = val.intval;
1017 //battery->status = POWER_SUPPLY_STATUS_CHARGING;
1018 //sec_bat_set_charge(battery, true);
1019 //battery->swelling_block = false;
1020 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
1021 } else if (temperature <= battery->swelling_temp_low_recovery) {
1022 if (battery->voltage_now < 4200) {
1023 /* change to 4.20V float voltage */
1025 psy_do_property(battery->pdata->charger_name, set,
1026 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1027 battery->swelling_max_vbat = val.intval;
1029 /* change to 0.5C charging current */
1030 #if 0 /* Orbis charging current is under 0.5C, thus no need to set */
1032 psy_do_property(battery->pdata->charger_name, set,
1033 POWER_SUPPLY_PROP_CURRENT_AVG, val);
1035 pr_info("%s: low swelling mode. Vbatt(%d)\n",
1036 __func__, battery->voltage_now);
1039 case SEC_BATTERY_DISCHG_MODE:
1040 if (temperature >= battery->swelling_temp_dischg_recovery) {
1041 pr_info ("%s: continue discharging... temperature is still high\n", __func__);
1042 if (battery->voltage_now < 4230) {
1043 /* cancel discharge mode, move to swelling mode */
1044 battery->swelling_mode = SEC_BATTERY_HIGH_SWELLING_MODE;
1045 #if defined(CONFIG_BATTERY_DISCHG_IC)
1046 /*disable discharge */
1047 gpio_set_value(battery->pdata->dischg_test, 0);
1048 pr_info ("%s: disable discharge\n", __func__);
1051 } else if (temperature < battery->swelling_temp_dischg_recovery) {
1052 /* cancel discharge mode, move to swelling mode */
1053 battery->swelling_mode = SEC_BATTERY_HIGH_SWELLING_MODE;
1054 #if defined(CONFIG_BATTERY_DISCHG_IC)
1055 /*disable discharge */
1056 gpio_set_value(battery->pdata->dischg_test, 0);
1057 pr_info ("%s: disable discharge\n", __func__);
1060 pr_info("%s: the latest swelling mode[%d]\n", __func__, battery->swelling_mode);
1063 pr_err("%s: unknown swelling mode[%d]\n", __func__, battery->swelling_mode);
1067 dev_dbg(battery->dev, "%s end\n", __func__);
1071 static bool sec_bat_temperature_check(
1072 struct sec_battery_info *battery)
1075 bool health_changed;
1077 /* set health_changed true as default
1078 * this value will be changed after temperature check
1080 health_changed = true;
1082 if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
1083 dev_dbg(battery->dev,
1084 "%s: Charging Disabled\n", __func__);
1088 if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
1089 battery->health != POWER_SUPPLY_HEALTH_OVERHEAT &&
1090 battery->health != POWER_SUPPLY_HEALTH_COLD) {
1091 dev_dbg(battery->dev, "%s: No need to check\n", __func__);
1095 sec_bat_temperature(battery);
1097 switch (battery->pdata->temp_check_type) {
1098 case SEC_BATTERY_TEMP_CHECK_ADC:
1099 temp_value = battery->temp_adc;
1101 case SEC_BATTERY_TEMP_CHECK_TEMP:
1102 temp_value = battery->temperature;
1105 dev_err(battery->dev,
1106 "%s: Invalid Temp Check Type\n", __func__);
1110 if (temp_value >= battery->temp_high_threshold) {
1111 if (battery->health != POWER_SUPPLY_HEALTH_OVERHEAT) {
1112 if (battery->temp_high_cnt <
1113 battery->pdata->temp_check_count)
1114 battery->temp_high_cnt++;
1115 dev_dbg(battery->dev,
1116 "%s: high count = %d\n",
1117 __func__, battery->temp_high_cnt);
1119 } else if ((temp_value <= battery->temp_high_recovery) &&
1120 (temp_value >= battery->temp_low_recovery)) {
1121 if (battery->health == POWER_SUPPLY_HEALTH_OVERHEAT ||
1122 battery->health == POWER_SUPPLY_HEALTH_COLD) {
1123 if (battery->temp_recover_cnt <
1124 battery->pdata->temp_check_count)
1125 battery->temp_recover_cnt++;
1126 dev_dbg(battery->dev,
1127 "%s: recovery count = %d\n",
1128 __func__, battery->temp_recover_cnt);
1130 } else if (temp_value <= battery->temp_low_threshold) {
1131 if (battery->health != POWER_SUPPLY_HEALTH_COLD) {
1132 if (battery->temp_low_cnt <
1133 battery->pdata->temp_check_count)
1134 battery->temp_low_cnt++;
1135 dev_dbg(battery->dev,
1136 "%s: low count = %d\n",
1137 __func__, battery->temp_low_cnt);
1140 battery->temp_high_cnt = 0;
1141 battery->temp_low_cnt = 0;
1142 battery->temp_recover_cnt = 0;
1145 if (battery->temp_high_cnt >=
1146 battery->pdata->temp_check_count)
1147 battery->health = POWER_SUPPLY_HEALTH_OVERHEAT;
1148 else if (battery->temp_low_cnt >=
1149 battery->pdata->temp_check_count)
1150 battery->health = POWER_SUPPLY_HEALTH_COLD;
1151 else if (battery->temp_recover_cnt >=
1152 battery->pdata->temp_check_count)
1153 battery->health = POWER_SUPPLY_HEALTH_GOOD;
1155 health_changed = false;
1157 if (health_changed) {
1158 if ((battery->health == POWER_SUPPLY_HEALTH_OVERHEAT) ||
1159 (battery->health == POWER_SUPPLY_HEALTH_COLD)) {
1160 dev_info(battery->dev,
1161 "%s: Unsafe Temperature\n", __func__);
1162 battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1163 /* change charging current to battery (default 0mA) */
1164 sec_bat_set_charge(battery, false);
1166 dev_info(battery->dev,
1167 "%s: Safe Temperature\n", __func__);
1168 /* if recovered from not charging */
1169 if ((battery->health == POWER_SUPPLY_HEALTH_GOOD) &&
1171 POWER_SUPPLY_STATUS_NOT_CHARGING)) {
1172 if (battery->is_recharging)
1174 POWER_SUPPLY_STATUS_FULL;
1175 else /* Normal Charging */
1177 POWER_SUPPLY_STATUS_CHARGING;
1178 /* turn on charger by cable type */
1179 sec_bat_set_charge(battery, true);
1187 static void sec_bat_event_program_alarm(
1188 struct sec_battery_info *battery, int seconds)
1190 #if defined(ANDROID_ALARM_ACTIVATED)
1191 ktime_t low_interval = ktime_set(seconds - 10, 0);
1192 ktime_t slack = ktime_set(20, 0);
1195 next = ktime_add(battery->last_event_time, low_interval);
1197 alarm_start_range(&battery->event_termination_alarm,
1198 next, ktime_add(next, slack));
1200 alarm_start(&battery->event_termination_alarm,
1201 ktime_add(battery->last_event_time, ktime_set(seconds - 10, 0)));
1205 #if defined(ANDROID_ALARM_ACTIVATED)
1206 static void sec_bat_event_expired_timer_func(struct alarm *alarm)
1208 static enum alarmtimer_restart sec_bat_event_expired_timer_func(
1209 struct alarm *alarm, ktime_t now)
1212 struct sec_battery_info *battery =
1213 container_of(alarm, struct sec_battery_info,
1214 event_termination_alarm);
1216 battery->event &= (~battery->event_wait);
1217 dev_info(battery->dev,
1218 "%s: event expired (0x%x)\n", __func__, battery->event);
1220 #if !defined(ANDROID_ALARM_ACTIVATED)
1221 return ALARMTIMER_NORESTART;
1225 static void sec_bat_event_set(
1226 struct sec_battery_info *battery, int event, int enable)
1228 if (!battery->pdata->event_check)
1231 /* ignore duplicated deactivation of same event
1232 * only if the event is one last event
1234 if (!enable && (battery->event == battery->event_wait)) {
1235 dev_info(battery->dev,
1236 "%s: ignore duplicated deactivation of same event\n",
1241 alarm_cancel(&battery->event_termination_alarm);
1242 battery->event &= (~battery->event_wait);
1245 battery->event_wait = 0;
1246 battery->event |= event;
1248 dev_info(battery->dev,
1249 "%s: event set (0x%x)\n", __func__, battery->event);
1251 if (battery->event == 0) {
1252 dev_dbg(battery->dev,
1253 "%s: nothing to clear\n", __func__);
1254 return; /* nothing to clear */
1256 battery->event_wait = event;
1257 #if defined(ANDROID_ALARM_ACTIVATED)
1258 battery->last_event_time = alarm_get_elapsed_realtime();
1260 battery->last_event_time = ktime_get_boottime();
1262 sec_bat_event_program_alarm(battery,
1263 battery->pdata->event_waiting_time);
1264 dev_info(battery->dev,
1265 "%s: start timer (curr 0x%x, wait 0x%x)\n",
1266 __func__, battery->event, battery->event_wait);
1270 static bool sec_bat_check_fullcharged_condition(
1271 struct sec_battery_info *battery)
1273 int full_check_type;
1275 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
1276 full_check_type = battery->pdata->full_check_type;
1278 full_check_type = battery->pdata->full_check_type_2nd;
1280 switch (full_check_type) {
1281 case SEC_BATTERY_FULLCHARGED_ADC:
1282 case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
1283 case SEC_BATTERY_FULLCHARGED_SOC:
1284 case SEC_BATTERY_FULLCHARGED_CHGGPIO:
1285 case SEC_BATTERY_FULLCHARGED_CHGPSY:
1288 /* If these is NOT full check type or NONE full check type,
1289 * it is full-charged
1291 case SEC_BATTERY_FULLCHARGED_CHGINT:
1292 case SEC_BATTERY_FULLCHARGED_TIME:
1293 case SEC_BATTERY_FULLCHARGED_NONE:
1299 #if defined(CONFIG_BATTERY_SWELLING)
1300 if (battery->swelling_mode != SEC_BATTERY_NORMAL_MODE) {
1301 if (battery->pdata->full_condition_type &
1302 SEC_BATTERY_FULL_CONDITION_VCELL) {
1303 if (battery->voltage_now <
1305 dev_dbg(battery->dev,
1306 "%s: Not enough VCELL (%dmV)\n",
1307 __func__, battery->voltage_now);
1314 if (battery->pdata->full_condition_type &
1315 SEC_BATTERY_FULL_CONDITION_SOC) {
1316 if (battery->capacity <
1317 battery->pdata->full_condition_soc) {
1318 dev_dbg(battery->dev,
1319 "%s: Not enough SOC (%d%%)\n",
1320 __func__, battery->capacity);
1325 if (battery->pdata->full_condition_type &
1326 SEC_BATTERY_FULL_CONDITION_VCELL) {
1327 if (battery->voltage_now <
1328 battery->pdata->full_condition_vcell) {
1329 dev_dbg(battery->dev,
1330 "%s: Not enough VCELL (%dmV)\n",
1331 __func__, battery->voltage_now);
1336 if (battery->pdata->full_condition_type &
1337 SEC_BATTERY_FULL_CONDITION_AVGVCELL) {
1338 if (battery->voltage_avg <
1339 battery->pdata->full_condition_avgvcell) {
1340 dev_dbg(battery->dev,
1341 "%s: Not enough AVGVCELL (%dmV)\n",
1342 __func__, battery->voltage_avg);
1347 if (battery->pdata->full_condition_type &
1348 SEC_BATTERY_FULL_CONDITION_OCV) {
1349 if (battery->voltage_ocv <
1350 battery->pdata->full_condition_ocv) {
1351 dev_dbg(battery->dev,
1352 "%s: Not enough OCV (%dmV)\n",
1353 __func__, battery->voltage_ocv);
1361 static void sec_bat_do_test_function(
1362 struct sec_battery_info *battery)
1364 union power_supply_propval value;
1366 switch (battery->test_mode) {
1368 if (battery->status == POWER_SUPPLY_STATUS_CHARGING) {
1369 sec_bat_set_charge(battery, false);
1371 POWER_SUPPLY_STATUS_DISCHARGING;
1375 if(battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
1376 sec_bat_set_charge(battery, true);
1377 psy_do_property(battery->pdata->charger_name, get,
1378 POWER_SUPPLY_PROP_STATUS, value);
1379 battery->status = value.intval;
1381 battery->test_mode = 0;
1383 case 3: // clear temp block
1384 battery->health = POWER_SUPPLY_HEALTH_GOOD;
1385 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
1388 if(battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
1389 sec_bat_set_charge(battery, true);
1390 psy_do_property(battery->pdata->charger_name, get,
1391 POWER_SUPPLY_PROP_STATUS, value);
1392 battery->status = value.intval;
1396 pr_info("%s: error test: unknown state\n", __func__);
1401 static bool sec_bat_time_management(
1402 struct sec_battery_info *battery)
1404 unsigned long charging_time;
1406 #if defined(ANDROID_ALARM_ACTIVATED)
1407 ktime_t current_time;
1409 current_time = alarm_get_elapsed_realtime();
1410 ts = ktime_to_timespec(current_time);
1412 get_monotonic_boottime(&ts);
1415 if (battery->charging_start_time == 0) {
1416 dev_dbg(battery->dev,
1417 "%s: Charging Disabled\n", __func__);
1421 if (ts.tv_sec >= battery->charging_start_time)
1422 charging_time = ts.tv_sec - battery->charging_start_time;
1424 charging_time = 0xFFFFFFFF - battery->charging_start_time
1427 battery->charging_passed_time = charging_time;
1429 dev_dbg(battery->dev,
1430 "%s: Charging Time : %ld secs\n", __func__,
1431 battery->charging_passed_time);
1433 switch (battery->status) {
1434 case POWER_SUPPLY_STATUS_FULL:
1435 if (battery->is_recharging && (charging_time >
1436 battery->pdata->recharging_total_time)) {
1437 dev_info(battery->dev,
1438 "%s: Recharging Timer Expired\n", __func__);
1439 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1440 battery->is_recharging = false;
1441 if (sec_bat_set_charge(battery, false)) {
1442 dev_err(battery->dev,
1443 "%s: Fail to Set Charger\n", __func__);
1450 case POWER_SUPPLY_STATUS_CHARGING:
1451 if ((battery->pdata->full_condition_type &
1452 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
1453 (battery->is_recharging && (charging_time >
1454 battery->pdata->recharging_total_time))) {
1455 dev_info(battery->dev,
1456 "%s: Recharging Timer Expired\n", __func__);
1457 if (battery->capacity >= 100)
1458 battery->status = POWER_SUPPLY_STATUS_FULL;
1459 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1460 battery->is_recharging = false;
1461 if (sec_bat_set_charge(battery, false)) {
1462 dev_err(battery->dev,
1463 "%s: Fail to Set Charger\n", __func__);
1467 } else if (!battery->is_recharging &&
1468 (charging_time > battery->pdata->charging_total_time)) {
1469 dev_info(battery->dev,
1470 "%s: Charging Timer Expired\n", __func__);
1471 if (battery->pdata->full_condition_type &
1472 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) {
1473 if (battery->capacity >= 100)
1475 POWER_SUPPLY_STATUS_FULL;
1477 battery->status = POWER_SUPPLY_STATUS_FULL;
1478 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1479 if (sec_bat_set_charge(battery, false)) {
1480 dev_err(battery->dev,
1481 "%s: Fail to Set Charger\n", __func__);
1487 if (battery->pdata->charging_reset_time) {
1488 if (charging_time > battery->charging_next_time) {
1489 /*reset current in charging status */
1490 battery->charging_next_time =
1491 battery->charging_passed_time +
1492 (battery->pdata->charging_reset_time);
1494 dev_dbg(battery->dev,
1495 "%s: Reset charging current\n",
1497 if (sec_bat_set_charge(battery, true)) {
1498 dev_err(battery->dev,
1499 "%s: Fail to Set Charger\n",
1507 dev_err(battery->dev,
1508 "%s: Undefine Battery Status\n", __func__);
1515 static bool sec_bat_check_fullcharged(
1516 struct sec_battery_info *battery)
1518 union power_supply_propval value;
1520 int full_check_type;
1526 if (!sec_bat_check_fullcharged_condition(battery))
1527 goto not_full_charged;
1529 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
1530 full_check_type = battery->pdata->full_check_type;
1532 full_check_type = battery->pdata->full_check_type_2nd;
1534 switch (full_check_type) {
1535 case SEC_BATTERY_FULLCHARGED_ADC:
1537 sec_bat_get_adc_value(battery,
1538 SEC_BAT_ADC_CHANNEL_FULL_CHECK);
1540 dev_dbg(battery->dev,
1541 "%s: Current ADC (%d)\n",
1542 __func__, current_adc);
1544 if (current_adc < 0)
1546 battery->current_adc = current_adc;
1548 if (battery->current_adc <
1549 (battery->charging_mode ==
1550 SEC_BATTERY_CHARGING_1ST ?
1551 battery->pdata->charging_current[
1552 battery->cable_type].full_check_current_1st :
1553 battery->pdata->charging_current[
1554 battery->cable_type].full_check_current_2nd)) {
1555 battery->full_check_cnt++;
1556 dev_dbg(battery->dev,
1557 "%s: Full Check ADC (%d)\n",
1559 battery->full_check_cnt);
1561 battery->full_check_cnt = 0;
1564 case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
1565 if ((battery->current_now > 20 && battery->current_now <
1566 battery->pdata->charging_current[
1567 battery->cable_type].full_check_current_1st) &&
1568 (battery->current_avg > 20 && battery->current_avg <
1569 (battery->charging_mode ==
1570 SEC_BATTERY_CHARGING_1ST ?
1571 battery->pdata->charging_current[
1572 battery->cable_type].full_check_current_1st :
1573 battery->pdata->charging_current[
1574 battery->cable_type].full_check_current_2nd))) {
1575 battery->full_check_cnt++;
1576 dev_dbg(battery->dev,
1577 "%s: Full Check Current (%d)\n",
1579 battery->full_check_cnt);
1581 battery->full_check_cnt = 0;
1584 case SEC_BATTERY_FULLCHARGED_TIME:
1585 if ((battery->charging_mode ==
1586 SEC_BATTERY_CHARGING_2ND ?
1587 (battery->charging_passed_time -
1588 battery->charging_fullcharged_time) :
1589 battery->charging_passed_time) >
1590 (battery->charging_mode ==
1591 SEC_BATTERY_CHARGING_1ST ?
1592 battery->pdata->charging_current[
1593 battery->cable_type].full_check_current_1st :
1594 battery->pdata->charging_current[
1595 battery->cable_type].full_check_current_2nd)) {
1596 battery->full_check_cnt++;
1597 dev_dbg(battery->dev,
1598 "%s: Full Check Time (%d)\n",
1600 battery->full_check_cnt);
1602 battery->full_check_cnt = 0;
1605 case SEC_BATTERY_FULLCHARGED_SOC:
1606 if (battery->capacity <=
1607 (battery->charging_mode ==
1608 SEC_BATTERY_CHARGING_1ST ?
1609 battery->pdata->charging_current[
1610 battery->cable_type].full_check_current_1st :
1611 battery->pdata->charging_current[
1612 battery->cable_type].full_check_current_2nd)) {
1613 battery->full_check_cnt++;
1614 dev_dbg(battery->dev,
1615 "%s: Full Check SOC (%d)\n",
1617 battery->full_check_cnt);
1619 battery->full_check_cnt = 0;
1622 case SEC_BATTERY_FULLCHARGED_CHGGPIO:
1624 battery->pdata->chg_gpio_full_check,
1627 dev_err(battery->dev,
1628 "%s: Error in Request of GPIO\n", __func__);
1631 if (!(gpio_get_value_cansleep(
1632 battery->pdata->chg_gpio_full_check) ^
1633 !battery->pdata->chg_polarity_full_check)) {
1634 battery->full_check_cnt++;
1635 dev_dbg(battery->dev,
1636 "%s: Full Check GPIO (%d)\n",
1637 __func__, battery->full_check_cnt);
1639 battery->full_check_cnt = 0;
1640 gpio_free(battery->pdata->chg_gpio_full_check);
1643 case SEC_BATTERY_FULLCHARGED_CHGINT:
1644 case SEC_BATTERY_FULLCHARGED_CHGPSY:
1646 psy_do_property(battery->pdata->charger_name, get,
1647 POWER_SUPPLY_PROP_STATUS, value);
1649 if (value.intval == POWER_SUPPLY_STATUS_FULL) {
1650 battery->full_check_cnt++;
1651 dev_info(battery->dev,
1652 "%s: Full Check Charger (%d)\n",
1653 __func__, battery->full_check_cnt);
1655 battery->full_check_cnt = 0;
1660 /* If these is NOT full check type or NONE full check type,
1661 * it is full-charged
1663 case SEC_BATTERY_FULLCHARGED_NONE:
1664 battery->full_check_cnt = 0;
1668 dev_err(battery->dev,
1669 "%s: Invalid Full Check\n", __func__);
1673 if (battery->full_check_cnt >=
1674 battery->pdata->full_check_count) {
1675 battery->full_check_cnt = 0;
1683 static void sec_bat_do_fullcharged(
1684 struct sec_battery_info *battery)
1686 union power_supply_propval value;
1688 #if defined(CONFIG_BATTERY_SWELLING)
1689 if (battery->swelling_mode != SEC_BATTERY_NORMAL_MODE) {
1690 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1691 battery->is_recharging = false;
1692 sec_bat_set_charge(battery, false);
1693 pr_info("%s: stop charging (full) in swelling mode[%d]",
1694 __func__, battery->swelling_mode);
1698 /* To let charger/fuel gauge know the full status,
1699 * set status before calling sec_bat_set_charge()
1701 battery->status = POWER_SUPPLY_STATUS_FULL;
1703 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST) {
1704 battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
1705 battery->charging_fullcharged_time =
1706 battery->charging_passed_time;
1707 sec_bat_set_charge(battery, true);
1709 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1710 battery->is_recharging = false;
1711 sec_bat_set_charge(battery, false);
1713 value.intval = POWER_SUPPLY_STATUS_FULL;
1714 psy_do_property(battery->pdata->fuelgauge_name, set,
1715 POWER_SUPPLY_PROP_STATUS, value);
1718 /* platform can NOT get information of battery
1719 * because wakeup time is too short to check uevent
1720 * To make sure that target is wakeup if full-charged,
1721 * activated wake lock in a few seconds
1723 if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
1724 wake_lock_timeout(&battery->vbus_wake_lock, HZ * 10);
1727 static bool sec_bat_fullcharged_check(
1728 struct sec_battery_info *battery)
1730 if ((battery->charging_mode == SEC_BATTERY_CHARGING_NONE) ||
1731 (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING)) {
1732 dev_dbg(battery->dev,
1733 "%s: No Need to Check Full-Charged\n", __func__);
1737 if (sec_bat_check_fullcharged(battery))
1738 sec_bat_do_fullcharged(battery);
1740 dev_info(battery->dev,
1741 "%s: Charging Mode : %s\n", __func__,
1742 battery->is_recharging ?
1743 sec_bat_charging_mode_str[SEC_BATTERY_CHARGING_RECHARGING] :
1744 sec_bat_charging_mode_str[battery->charging_mode]);
1749 #if defined(CONFIG_TOUCHSCREEN_IST30XXA)
1753 static void sec_bat_get_battery_info(
1754 struct sec_battery_info *battery)
1756 union power_supply_propval value;
1758 psy_do_property(battery->pdata->fuelgauge_name, get,
1759 POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
1760 battery->voltage_now = value.intval;
1762 value.intval = SEC_BATTEY_VOLTAGE_AVERAGE;
1763 psy_do_property(battery->pdata->fuelgauge_name, get,
1764 POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
1765 battery->voltage_avg = value.intval;
1767 value.intval = SEC_BATTEY_VOLTAGE_OCV;
1768 psy_do_property(battery->pdata->fuelgauge_name, get,
1769 POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
1770 battery->voltage_ocv = value.intval;
1772 value.intval = SEC_BATTEY_CURRENT_MA;
1773 psy_do_property(battery->pdata->fuelgauge_name, get,
1774 POWER_SUPPLY_PROP_CURRENT_NOW, value);
1775 battery->current_now = value.intval;
1777 value.intval = SEC_BATTEY_CURRENT_MA;
1778 psy_do_property(battery->pdata->fuelgauge_name, get,
1779 POWER_SUPPLY_PROP_CURRENT_AVG, value);
1780 battery->current_avg = value.intval;
1782 /* input current limit in charger */
1783 psy_do_property(battery->pdata->charger_name, get,
1784 POWER_SUPPLY_PROP_CURRENT_MAX, value);
1785 battery->current_max = value.intval;
1787 /* To get SOC value (NOT raw SOC), need to reset value */
1789 psy_do_property(battery->pdata->fuelgauge_name, get,
1790 POWER_SUPPLY_PROP_CAPACITY, value);
1791 battery->capacity = value.intval;
1792 #if defined(CONFIG_MACH_CORSICA_VE)
1793 if (get_hw_rev() < 0x2) {
1794 dev_info(battery->dev,
1795 "%s: get_hw_rev (%d)\n",
1796 __func__, get_hw_rev());
1797 battery->capacity = 50;
1798 battery->voltage_ocv = 4000;
1799 battery->voltage_avg = 4000;
1800 battery->voltage_now = 4000;
1804 switch (battery->pdata->thermal_source) {
1805 case SEC_BATTERY_THERMAL_SOURCE_FG:
1806 psy_do_property(battery->pdata->fuelgauge_name, get,
1807 POWER_SUPPLY_PROP_TEMP, value);
1808 battery->temperature = value.intval;
1810 psy_do_property(battery->pdata->fuelgauge_name, get,
1811 POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
1812 battery->temper_amb = value.intval;
1814 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
1815 if (battery->pdata->get_temperature_callback) {
1816 battery->pdata->get_temperature_callback(
1817 POWER_SUPPLY_PROP_TEMP, &value);
1818 battery->temperature = value.intval;
1819 psy_do_property(battery->pdata->fuelgauge_name, set,
1820 POWER_SUPPLY_PROP_TEMP, value);
1822 battery->pdata->get_temperature_callback(
1823 POWER_SUPPLY_PROP_TEMP_AMBIENT, &value);
1824 battery->temper_amb = value.intval;
1825 psy_do_property(battery->pdata->fuelgauge_name, set,
1826 POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
1829 case SEC_BATTERY_THERMAL_SOURCE_ADC:
1830 sec_bat_get_temperature_by_adc(battery,
1831 POWER_SUPPLY_PROP_TEMP, &value);
1832 battery->temperature = value.intval;
1833 psy_do_property(battery->pdata->fuelgauge_name, set,
1834 POWER_SUPPLY_PROP_TEMP, value);
1836 sec_bat_get_temperature_by_adc(battery,
1837 POWER_SUPPLY_PROP_TEMP_AMBIENT, &value);
1838 battery->temper_amb = value.intval;
1839 psy_do_property(battery->pdata->fuelgauge_name, set,
1840 POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
1846 #if defined(CONFIG_TOUCHSCREEN_IST30XXA)
1847 battery_temp = battery->temperature;
1850 dev_info(battery->dev,
1851 "%s:Vnow(%dmV),Inow(%dmA),Imax(%dmA),SOC(%d%%),Tbat(%d)\n",
1853 battery->voltage_now, battery->current_now,
1854 battery->current_max, battery->capacity, battery->temperature);
1855 dev_dbg(battery->dev,
1856 "%s,Vavg(%dmV),Vocv(%dmV),Tamb(%d),"
1857 "Iavg(%dmA),Iadc(%d)\n",
1858 battery->present ? "Connected" : "Disconnected",
1859 battery->voltage_avg, battery->voltage_ocv,
1860 battery->temper_amb,
1861 battery->current_avg, battery->current_adc);
1864 static void sec_bat_polling_work(struct work_struct *work)
1866 struct sec_battery_info *battery = container_of(
1867 work, struct sec_battery_info, polling_work.work);
1869 wake_lock(&battery->monitor_wake_lock);
1870 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
1871 dev_dbg(battery->dev, "%s: Activated\n", __func__);
1874 static void sec_bat_program_alarm(
1875 struct sec_battery_info *battery, int seconds)
1877 #if defined(ANDROID_ALARM_ACTIVATED)
1878 ktime_t low_interval = ktime_set(seconds, 0);
1879 ktime_t slack = ktime_set(10, 0);
1882 next = ktime_add(battery->last_poll_time, low_interval);
1883 alarm_start_range(&battery->polling_alarm,
1884 next, ktime_add(next, slack));
1886 alarm_start(&battery->polling_alarm,
1887 ktime_add(battery->last_poll_time, ktime_set(seconds, 0)));
1892 static unsigned int sec_bat_get_polling_time(
1893 struct sec_battery_info *battery)
1895 if (battery->status ==
1896 POWER_SUPPLY_STATUS_FULL)
1897 battery->polling_time =
1898 battery->pdata->polling_time[
1899 POWER_SUPPLY_STATUS_CHARGING];
1901 battery->polling_time =
1902 battery->pdata->polling_time[
1905 battery->polling_short = true;
1907 switch (battery->status) {
1908 case POWER_SUPPLY_STATUS_CHARGING:
1909 if (battery->polling_in_sleep)
1910 battery->polling_short = false;
1912 case POWER_SUPPLY_STATUS_DISCHARGING:
1913 if (battery->polling_in_sleep)
1914 battery->polling_time =
1915 battery->pdata->polling_time[
1916 SEC_BATTERY_POLLING_TIME_SLEEP];
1918 battery->polling_time =
1919 battery->pdata->polling_time[
1921 battery->polling_short = false;
1923 case POWER_SUPPLY_STATUS_FULL:
1924 if (battery->polling_in_sleep) {
1925 if (!(battery->pdata->full_condition_type &
1926 SEC_BATTERY_FULL_CONDITION_NOSLEEPINFULL) &&
1927 battery->charging_mode ==
1928 SEC_BATTERY_CHARGING_NONE)
1929 battery->polling_time =
1930 battery->pdata->polling_time[
1931 SEC_BATTERY_POLLING_TIME_SLEEP];
1932 battery->polling_short = false;
1934 if (battery->charging_mode ==
1935 SEC_BATTERY_CHARGING_NONE)
1936 battery->polling_short = false;
1941 if (battery->polling_short)
1942 return battery->pdata->polling_time[
1943 SEC_BATTERY_POLLING_TIME_BASIC];
1945 return battery->polling_time;
1948 static bool sec_bat_is_short_polling(
1949 struct sec_battery_info *battery)
1951 /* Change the full and short monitoring sequence
1952 * Originally, full monitoring was the last time of polling_count
1953 * But change full monitoring to first time
1954 * because temperature check is too late
1956 if (!battery->polling_short || battery->polling_count == 1)
1962 static void sec_bat_update_polling_count(
1963 struct sec_battery_info *battery)
1965 /* do NOT change polling count in sleep
1966 * even though it is short polling
1967 * to keep polling count along sleep/wakeup
1969 if (battery->polling_short && battery->polling_in_sleep)
1972 if (battery->polling_short &&
1973 ((battery->polling_time /
1974 battery->pdata->polling_time[
1975 SEC_BATTERY_POLLING_TIME_BASIC])
1976 > battery->polling_count))
1977 battery->polling_count++;
1979 battery->polling_count = 1; /* initial value = 1 */
1982 static void sec_bat_set_polling(
1983 struct sec_battery_info *battery)
1985 unsigned int polling_time_temp;
1987 dev_dbg(battery->dev, "%s: Start\n", __func__);
1989 polling_time_temp = sec_bat_get_polling_time(battery);
1991 dev_dbg(battery->dev,
1992 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
1993 __func__, sec_bat_status_str[battery->status],
1994 battery->polling_in_sleep ? "Yes" : "No",
1995 (battery->charging_mode ==
1996 SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
1997 battery->polling_short ? "Yes" : "No");
1998 dev_dbg(battery->dev,
1999 "%s: Polling time %d/%d sec.\n", __func__,
2000 battery->polling_short ?
2001 (polling_time_temp * battery->polling_count) :
2002 polling_time_temp, battery->polling_time);
2004 /* To sync with log above,
2005 * change polling count after log is displayed
2006 * Do NOT update polling count in initial monitor
2008 if (!battery->pdata->monitor_initial_count)
2009 sec_bat_update_polling_count(battery);
2011 dev_dbg(battery->dev,
2012 "%s: Initial monitor %d times left.\n", __func__,
2013 battery->pdata->monitor_initial_count);
2015 switch (battery->pdata->polling_type) {
2016 case SEC_BATTERY_MONITOR_WORKQUEUE:
2017 if (battery->pdata->monitor_initial_count) {
2018 battery->pdata->monitor_initial_count--;
2019 schedule_delayed_work(&battery->polling_work, HZ);
2021 schedule_delayed_work(&battery->polling_work,
2022 polling_time_temp * HZ);
2024 case SEC_BATTERY_MONITOR_ALARM:
2025 #if defined(ANDROID_ALARM_ACTIVATED)
2026 battery->last_poll_time = alarm_get_elapsed_realtime();
2028 battery->last_poll_time = ktime_get_boottime();
2031 if (battery->pdata->monitor_initial_count) {
2032 battery->pdata->monitor_initial_count--;
2033 sec_bat_program_alarm(battery, 1);
2035 sec_bat_program_alarm(battery, polling_time_temp);
2037 case SEC_BATTERY_MONITOR_TIMER:
2042 dev_dbg(battery->dev, "%s: End\n", __func__);
2045 static void sec_bat_monitor_work(
2046 struct work_struct *work)
2048 struct sec_battery_info *battery =
2049 container_of(work, struct sec_battery_info,
2052 dev_dbg(battery->dev, "%s: Start\n", __func__);
2054 /*#if !defined(ANDROID_ALARM_ACTIVATED)
2055 alarm_cancel(&battery->polling_alarm);
2056 #endif *//* ANDROID_ALARM_ACTIVATED */
2058 /* monitor once after wakeup */
2059 if (battery->polling_in_sleep)
2060 battery->polling_in_sleep = false;
2062 sec_bat_get_battery_info(battery);
2065 if (battery->test_mode) {
2066 dev_dbg(battery->dev, "%s: Test Mode\n", __func__);
2067 sec_bat_do_test_function(battery);
2068 if (battery->test_mode != 0)
2069 goto continue_monitor;
2072 /* 1. battery check */
2073 if (!sec_bat_battery_cable_check(battery))
2074 goto continue_monitor;
2076 /* 2. voltage check */
2077 if (!sec_bat_voltage_check(battery))
2078 goto continue_monitor;
2080 /* monitor short routine in initial monitor */
2081 if (battery->pdata->monitor_initial_count ||
2082 sec_bat_is_short_polling(battery))
2083 goto continue_monitor;
2085 /* 3. time management */
2086 if (!sec_bat_time_management(battery))
2087 goto continue_monitor;
2089 /* 4. temperature check */
2090 if (!sec_bat_temperature_check(battery))
2091 goto continue_monitor;
2093 #if defined(CONFIG_BATTERY_SWELLING)
2094 sec_bat_swelling_check(battery, battery->temperature);
2097 /* 5. full charging check */
2098 sec_bat_fullcharged_check(battery);
2100 /* 6. additional check */
2101 if (battery->pdata->monitor_additional_check)
2102 battery->pdata->monitor_additional_check();
2105 dev_info(battery->dev,
2106 "%s: Status(%s), mode(%s), Health(%s), Cable(%d), siop_level(%d)\n",
2108 sec_bat_status_str[battery->status],
2109 sec_bat_charging_mode_str[battery->charging_mode],
2110 sec_bat_health_str[battery->health],
2111 battery->cable_type, battery->siop_level);
2113 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
2114 dev_info(battery->dev,
2115 "%s: battery->stability_test(%d), battery->eng_not_full_status(%d)\n",
2116 __func__, battery->stability_test, battery->eng_not_full_status);
2118 power_supply_changed(&battery->psy_bat);
2120 sec_bat_set_polling(battery);
2122 if (battery->capacity <= 0)
2123 wake_lock_timeout(&battery->monitor_wake_lock, HZ * 5);
2125 wake_unlock(&battery->monitor_wake_lock);
2127 dev_dbg(battery->dev, "%s: End\n", __func__);
2132 #if defined(ANDROID_ALARM_ACTIVATED)
2133 static void sec_bat_alarm(struct alarm *alarm)
2135 static enum alarmtimer_restart sec_bat_alarm(
2136 struct alarm *alarm, ktime_t now)
2140 struct sec_battery_info *battery = container_of(alarm,
2141 struct sec_battery_info, polling_alarm);
2143 dev_dbg(battery->dev,
2146 /* In wake up, monitor work will be queued in complete function
2147 * To avoid duplicated queuing of monitor work,
2148 * do NOT queue monitor work in wake up by polling alarm
2150 if (!battery->polling_in_sleep) {
2151 wake_lock(&battery->monitor_wake_lock);
2152 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
2153 dev_dbg(battery->dev, "%s: Activated\n", __func__);
2155 #if !defined(ANDROID_ALARM_ACTIVATED)
2156 return ALARMTIMER_NORESTART;
2161 static void sec_bat_cable_work(struct work_struct *work)
2163 struct sec_battery_info *battery = container_of(work,
2164 struct sec_battery_info, cable_work);
2165 union power_supply_propval val;
2166 int wl_cur, wr_cur, current_cable_type;
2168 dev_info(battery->dev, "%s: Start\n", __func__);
2170 wl_cur = battery->pdata->charging_current[
2171 POWER_SUPPLY_TYPE_WIRELESS].input_current_limit;
2172 wr_cur = battery->pdata->charging_current[
2173 battery->wire_status].input_current_limit;
2174 if (battery->wc_status && battery->wc_enable &&
2176 current_cable_type = POWER_SUPPLY_TYPE_WIRELESS;
2178 current_cable_type = battery->wire_status;
2180 if (current_cable_type == battery->cable_type) {
2181 dev_info(battery->dev,
2182 "%s: Cable is NOT Changed(%d)\n",
2183 __func__, battery->cable_type);
2184 /* Do NOT activate cable work for NOT changed */
2185 goto end_of_cable_work;
2188 battery->cable_type = current_cable_type;
2189 if (battery->pdata->check_cable_result_callback)
2190 battery->pdata->check_cable_result_callback(
2191 battery->cable_type);
2192 /* platform can NOT get information of cable connection
2193 * because wakeup time is too short to check uevent
2194 * To make sure that target is wakeup
2195 * if cable is connected and disconnected,
2196 * activated wake lock in a few seconds
2198 wake_lock_timeout(&battery->vbus_wake_lock, HZ * 10);
2200 if (battery->cable_type == POWER_SUPPLY_TYPE_BATTERY ||
2201 ((battery->pdata->cable_check_type &
2202 SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE) &&
2203 battery->cable_type == POWER_SUPPLY_TYPE_UNKNOWN)) {
2204 if (battery->status == POWER_SUPPLY_STATUS_FULL) {
2205 val.intval = POWER_SUPPLY_TYPE_BATTERY;
2206 psy_do_property(battery->pdata->fuelgauge_name, set,
2207 POWER_SUPPLY_PROP_CHARGE_FULL, val);
2208 /* To get SOC value (NOT raw SOC), need to reset value */
2210 psy_do_property(battery->pdata->fuelgauge_name, get,
2211 POWER_SUPPLY_PROP_CAPACITY, val);
2212 battery->capacity = val.intval;
2214 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
2215 battery->is_recharging = false;
2216 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
2217 battery->health = POWER_SUPPLY_HEALTH_GOOD;
2219 if (sec_bat_set_charge(battery, false))
2220 goto end_of_cable_work;
2222 /* Do NOT display the charging icon when OTG is enabled */
2223 if (battery->cable_type == POWER_SUPPLY_TYPE_OTG) {
2224 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
2225 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
2227 if (battery->pdata->full_check_type !=
2228 SEC_BATTERY_FULLCHARGED_NONE)
2229 battery->charging_mode =
2230 SEC_BATTERY_CHARGING_1ST;
2232 battery->charging_mode =
2233 SEC_BATTERY_CHARGING_2ND;
2234 battery->status = POWER_SUPPLY_STATUS_CHARGING;
2237 if (sec_bat_set_charge(battery, true))
2238 goto end_of_cable_work;
2240 #if defined(ANDROID_ALARM_ACTIVATED)
2241 /* No need for wakelock in Alarm */
2242 if (battery->pdata->polling_type != SEC_BATTERY_MONITOR_ALARM)
2243 wake_lock(&battery->vbus_wake_lock);
2247 /* polling time should be reset when cable is changed
2248 * polling_in_sleep should be reset also
2249 * before polling time is re-calculated
2250 * to prevent from counting 1 for events
2251 * right after cable is connected
2253 battery->polling_in_sleep = false;
2254 sec_bat_get_polling_time(battery);
2256 dev_info(battery->dev,
2257 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
2258 __func__, sec_bat_status_str[battery->status],
2259 battery->polling_in_sleep ? "Yes" : "No",
2260 (battery->charging_mode ==
2261 SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
2262 battery->polling_short ? "Yes" : "No");
2263 dev_info(battery->dev,
2264 "%s: Polling time is reset to %d sec.\n", __func__,
2265 battery->polling_time);
2267 battery->polling_count = 1; /* initial value = 1 */
2269 wake_lock(&battery->monitor_wake_lock);
2270 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work,
2271 msecs_to_jiffies(500));
2273 wake_unlock(&battery->cable_wake_lock);
2274 dev_dbg(battery->dev, "%s: End\n", __func__);
2277 ssize_t sec_bat_show_attrs(struct device *dev,
2278 struct device_attribute *attr, char *buf)
2280 struct power_supply *psy = dev_get_drvdata(dev);
2281 struct sec_battery_info *battery =
2282 container_of(psy, struct sec_battery_info, psy_bat);
2283 const ptrdiff_t offset = attr - sec_battery_attrs;
2284 union power_supply_propval value;
2288 case BATT_RESET_SOC:
2290 case BATT_READ_RAW_SOC:
2292 union power_supply_propval value;
2295 SEC_FUELGAUGE_CAPACITY_TYPE_RAW;
2296 psy_do_property(battery->pdata->fuelgauge_name, get,
2297 POWER_SUPPLY_PROP_CAPACITY, value);
2299 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2303 case BATT_READ_ADJ_SOC:
2306 i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
2307 battery->pdata->vendor);
2310 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2311 battery->voltage_ocv);
2315 case BATT_VOL_ADC_CAL:
2319 case BATT_VOL_ADC_AVER:
2322 case BATT_CURRENT_UA_NOW:
2324 union power_supply_propval value;
2326 value.intval = SEC_BATTEY_CURRENT_UA;
2327 psy_do_property(battery->pdata->fuelgauge_name, get,
2328 POWER_SUPPLY_PROP_CURRENT_NOW, value);
2330 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2334 case BATT_CURRENT_UA_AVG:
2336 union power_supply_propval value;
2338 value.intval = SEC_BATTEY_CURRENT_UA;
2339 psy_do_property(battery->pdata->fuelgauge_name, get,
2340 POWER_SUPPLY_PROP_CURRENT_AVG, value);
2342 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2348 switch (battery->pdata->thermal_source) {
2349 case SEC_BATTERY_THERMAL_SOURCE_FG:
2350 psy_do_property(battery->pdata->fuelgauge_name, get,
2351 POWER_SUPPLY_PROP_TEMP, value);
2353 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
2354 if (battery->pdata->get_temperature_callback) {
2355 battery->pdata->get_temperature_callback(
2356 POWER_SUPPLY_PROP_TEMP, &value);
2359 case SEC_BATTERY_THERMAL_SOURCE_ADC:
2360 sec_bat_get_temperature_by_adc(battery,
2361 POWER_SUPPLY_PROP_TEMP, &value);
2366 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2370 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2373 case BATT_TEMP_AVER:
2375 case BATT_TEMP_ADC_AVER:
2379 case BATT_SLATE_MODE:
2380 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2381 battery->slate_mode);
2384 case BATT_LP_CHARGING:
2385 if (battery->pdata->is_lpm) {
2386 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2387 battery->pdata->is_lpm() ? 1 : 0);
2390 case SIOP_ACTIVATED:
2393 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2394 battery->siop_level);
2396 case BATT_CHARGING_SOURCE:
2397 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2398 battery->cable_type);
2406 union power_supply_propval value;
2409 SEC_BATTEY_CAPACITY_DESIGNED;
2410 psy_do_property(battery->pdata->fuelgauge_name, get,
2411 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2413 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
2417 SEC_BATTEY_CAPACITY_ABSOLUTE;
2418 psy_do_property(battery->pdata->fuelgauge_name, get,
2419 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2421 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
2425 SEC_BATTEY_CAPACITY_TEMPERARY;
2426 psy_do_property(battery->pdata->fuelgauge_name, get,
2427 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2429 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
2433 SEC_BATTEY_CAPACITY_CURRENT;
2434 psy_do_property(battery->pdata->fuelgauge_name, get,
2435 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2437 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x\n",
2443 case CHG_CURRENT_ADC:
2444 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2445 battery->current_adc);
2450 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2451 (battery->cable_type == POWER_SUPPLY_TYPE_WIRELESS));
2454 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2455 battery->wc_enable);
2458 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2459 battery->factory_mode);
2464 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2465 battery->test_mode);
2468 case BATT_EVENT_CALL:
2469 case BATT_EVENT_2G_CALL:
2470 case BATT_EVENT_TALK_GSM:
2471 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2472 (battery->event & EVENT_2G_CALL) ? 1 : 0);
2474 case BATT_EVENT_3G_CALL:
2475 case BATT_EVENT_TALK_WCDMA:
2476 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2477 (battery->event & EVENT_3G_CALL) ? 1 : 0);
2479 case BATT_EVENT_MUSIC:
2480 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2481 (battery->event & EVENT_MUSIC) ? 1 : 0);
2483 case BATT_EVENT_VIDEO:
2484 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2485 (battery->event & EVENT_VIDEO) ? 1 : 0);
2487 case BATT_EVENT_BROWSER:
2488 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2489 (battery->event & EVENT_BROWSER) ? 1 : 0);
2491 case BATT_EVENT_HOTSPOT:
2492 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2493 (battery->event & EVENT_HOTSPOT) ? 1 : 0);
2495 case BATT_EVENT_CAMERA:
2496 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2497 (battery->event & EVENT_CAMERA) ? 1 : 0);
2499 case BATT_EVENT_CAMCORDER:
2500 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2501 (battery->event & EVENT_CAMCORDER) ? 1 : 0);
2503 case BATT_EVENT_DATA_CALL:
2504 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2505 (battery->event & EVENT_DATA_CALL) ? 1 : 0);
2507 case BATT_EVENT_WIFI:
2508 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2509 (battery->event & EVENT_WIFI) ? 1 : 0);
2511 case BATT_EVENT_WIBRO:
2512 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2513 (battery->event & EVENT_WIBRO) ? 1 : 0);
2515 case BATT_EVENT_LTE:
2516 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2517 (battery->event & EVENT_LTE) ? 1 : 0);
2519 case BATT_EVENT_LCD:
2520 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2521 (battery->event & EVENT_LCD) ? 1 : 0);
2523 case BATT_EVENT_GPS:
2524 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2525 (battery->event & EVENT_GPS) ? 1 : 0);
2528 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2531 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
2532 case BATT_TEST_CHARGE_CURRENT:
2534 union power_supply_propval value;
2536 psy_do_property(battery->pdata->charger_name, get,
2537 POWER_SUPPLY_PROP_CURRENT_NOW, value);
2538 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2542 case BATT_STABILITY_TEST:
2543 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2544 battery->stability_test);
2554 ssize_t sec_bat_store_attrs(
2556 struct device_attribute *attr,
2557 const char *buf, size_t count)
2559 struct power_supply *psy = dev_get_drvdata(dev);
2560 struct sec_battery_info *battery =
2561 container_of(psy, struct sec_battery_info, psy_bat);
2562 const ptrdiff_t offset = attr - sec_battery_attrs;
2567 case BATT_RESET_SOC:
2568 /* Do NOT reset fuel gauge in charging mode */
2569 if (battery->pdata->check_cable_callback &&
2570 battery->pdata->check_jig_status) {
2571 if ((battery->pdata->check_cable_callback(battery) ==
2572 POWER_SUPPLY_TYPE_BATTERY) ||
2573 battery->pdata->check_jig_status()) {
2574 union power_supply_propval value;
2575 battery->voltage_now = 1234;
2576 battery->voltage_avg = 1234;
2577 power_supply_changed(&battery->psy_bat);
2580 SEC_FUELGAUGE_CAPACITY_TYPE_RESET;
2581 psy_do_property(battery->pdata->fuelgauge_name, set,
2582 POWER_SUPPLY_PROP_CAPACITY, value);
2583 dev_info(battery->dev,"do reset SOC\n");
2584 /* update battery info */
2585 sec_bat_get_battery_info(battery);
2590 case BATT_READ_RAW_SOC:
2592 case BATT_READ_ADJ_SOC:
2600 case BATT_VOL_ADC_CAL:
2604 case BATT_VOL_ADC_AVER:
2606 case BATT_CURRENT_UA_NOW:
2608 case BATT_CURRENT_UA_AVG:
2614 case BATT_TEMP_AVER:
2616 case BATT_TEMP_ADC_AVER:
2620 case BATT_SLATE_MODE:
2621 if (sscanf(buf, "%d\n", &x) == 1) {
2622 union power_supply_propval value;
2624 value.intval = POWER_SUPPLY_TYPE_BATTERY;
2625 battery->slate_mode = true;
2626 } else if (x == 0) {
2627 value.intval = POWER_SUPPLY_TYPE_USB;
2628 battery->slate_mode = false;
2630 dev_info(battery->dev,
2631 "%s: SLATE MODE unknown command\n",
2635 psy_do_property("battery", set,
2636 POWER_SUPPLY_PROP_ONLINE, value);
2637 if (battery->slate_mode) {
2639 psy_do_property(battery->pdata->charger_name, set,
2640 POWER_SUPPLY_PROP_CURRENT_NOW,
2647 case BATT_LP_CHARGING:
2649 case SIOP_ACTIVATED:
2652 if (sscanf(buf, "%d\n", &x) == 1) {
2653 union power_supply_propval value;
2654 dev_info(battery->dev,
2655 "%s: siop level: %d\n", __func__, x);
2656 if (x >= 0 && x <= 100)
2657 battery->siop_level = x;
2659 battery->siop_level = 100;
2660 value.intval = battery->siop_level;
2661 psy_do_property(battery->pdata->charger_name, set,
2662 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, value);
2666 case BATT_CHARGING_SOURCE:
2676 case CHG_CURRENT_ADC:
2683 if (sscanf(buf, "%d\n", &x) == 1) {
2685 battery->wc_enable = false;
2686 } else if (x == 1) {
2687 battery->wc_enable = true;
2689 dev_info(battery->dev,
2690 "%s: WPC ENABLE unknown command\n",
2694 wake_lock(&battery->cable_wake_lock);
2695 queue_work(battery->monitor_wqueue,
2696 &battery->cable_work);
2701 if (sscanf(buf, "%d\n", &x) == 1) {
2702 battery->factory_mode = x ? true : false;
2707 if (sscanf(buf, "%d\n", &x) == 1) {
2708 /* update battery info */
2709 sec_bat_get_battery_info(battery);
2714 if (sscanf(buf, "%d\n", &x) == 1) {
2715 battery->test_mode = x;
2716 wake_lock(&battery->monitor_wake_lock);
2717 queue_delayed_work(battery->monitor_wqueue,
2718 &battery->monitor_work, 0);
2723 case BATT_EVENT_CALL:
2724 case BATT_EVENT_2G_CALL:
2725 case BATT_EVENT_TALK_GSM:
2726 if (sscanf(buf, "%d\n", &x) == 1) {
2727 sec_bat_event_set(battery, EVENT_2G_CALL, x);
2731 case BATT_EVENT_3G_CALL:
2732 case BATT_EVENT_TALK_WCDMA:
2733 if (sscanf(buf, "%d\n", &x) == 1) {
2734 sec_bat_event_set(battery, EVENT_3G_CALL, x);
2738 case BATT_EVENT_MUSIC:
2739 if (sscanf(buf, "%d\n", &x) == 1) {
2740 sec_bat_event_set(battery, EVENT_MUSIC, x);
2744 case BATT_EVENT_VIDEO:
2745 if (sscanf(buf, "%d\n", &x) == 1) {
2746 sec_bat_event_set(battery, EVENT_VIDEO, x);
2750 case BATT_EVENT_BROWSER:
2751 if (sscanf(buf, "%d\n", &x) == 1) {
2752 sec_bat_event_set(battery, EVENT_BROWSER, x);
2756 case BATT_EVENT_HOTSPOT:
2757 if (sscanf(buf, "%d\n", &x) == 1) {
2758 sec_bat_event_set(battery, EVENT_HOTSPOT, x);
2762 case BATT_EVENT_CAMERA:
2763 if (sscanf(buf, "%d\n", &x) == 1) {
2764 sec_bat_event_set(battery, EVENT_CAMERA, x);
2768 case BATT_EVENT_CAMCORDER:
2769 if (sscanf(buf, "%d\n", &x) == 1) {
2770 sec_bat_event_set(battery, EVENT_CAMCORDER, x);
2774 case BATT_EVENT_DATA_CALL:
2775 if (sscanf(buf, "%d\n", &x) == 1) {
2776 sec_bat_event_set(battery, EVENT_DATA_CALL, x);
2780 case BATT_EVENT_WIFI:
2781 if (sscanf(buf, "%d\n", &x) == 1) {
2782 sec_bat_event_set(battery, EVENT_WIFI, x);
2786 case BATT_EVENT_WIBRO:
2787 if (sscanf(buf, "%d\n", &x) == 1) {
2788 sec_bat_event_set(battery, EVENT_WIBRO, x);
2792 case BATT_EVENT_LTE:
2793 if (sscanf(buf, "%d\n", &x) == 1) {
2794 sec_bat_event_set(battery, EVENT_LTE, x);
2798 case BATT_EVENT_LCD:
2799 if (sscanf(buf, "%d\n", &x) == 1) {
2801 sec_bat_event_set(battery, EVENT_LCD, x);
2806 case BATT_EVENT_GPS:
2807 if (sscanf(buf, "%d\n", &x) == 1) {
2808 sec_bat_event_set(battery, EVENT_GPS, x);
2812 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
2813 case BATT_TEST_CHARGE_CURRENT:
2814 if (sscanf(buf, "%d\n", &x) == 1) {
2815 if (x >= 0 && x <= 2000) {
2816 union power_supply_propval value;
2817 dev_err(battery->dev,
2818 "%s: BATT_TEST_CHARGE_CURRENT(%d)\n", __func__, x);
2819 battery->pdata->charging_current[
2820 POWER_SUPPLY_TYPE_USB].input_current_limit = x;
2821 battery->pdata->charging_current[
2822 POWER_SUPPLY_TYPE_USB].fast_charging_current = x;
2824 battery->eng_not_full_status = true;
2825 battery->pdata->temp_check_type =
2826 SEC_BATTERY_TEMP_CHECK_NONE;
2827 battery->pdata->charging_total_time =
2830 if (battery->cable_type == POWER_SUPPLY_TYPE_USB) {
2832 psy_do_property(battery->pdata->charger_name, set,
2833 POWER_SUPPLY_PROP_CURRENT_NOW,
2840 case BATT_STABILITY_TEST:
2841 if (sscanf(buf, "%d\n", &x) == 1) {
2842 union power_supply_propval value;
2843 dev_err(battery->dev,
2844 "%s: BATT_STABILITY_TEST(%d)\n", __func__, x);
2846 battery->stability_test = true;
2847 battery->eng_not_full_status = true;
2848 value.intval = POWER_SUPPLY_TYPE_WIRELESS;
2849 psy_do_property(battery->pdata->charger_name, set,
2850 POWER_SUPPLY_PROP_CHARGE_TYPE, value);
2851 psy_do_property("battery", set,
2852 POWER_SUPPLY_PROP_ONLINE, value);
2855 battery->stability_test = false;
2856 value.intval = POWER_SUPPLY_TYPE_MAINS;
2857 psy_do_property(battery->pdata->charger_name, set,
2858 POWER_SUPPLY_PROP_CHARGE_TYPE, value);
2870 static int sec_bat_create_attrs(struct device *dev)
2874 for (i = 0; i < ARRAY_SIZE(sec_battery_attrs); i++) {
2875 rc = device_create_file(dev, &sec_battery_attrs[i]);
2877 goto create_attrs_failed;
2879 goto create_attrs_succeed;
2881 create_attrs_failed:
2883 device_remove_file(dev, &sec_battery_attrs[i]);
2884 create_attrs_succeed:
2888 static int sec_bat_set_property(struct power_supply *psy,
2889 enum power_supply_property psp,
2890 const union power_supply_propval *val)
2892 struct sec_battery_info *battery =
2893 container_of(psy, struct sec_battery_info, psy_bat);
2894 int current_cable_type;
2895 int full_check_type;
2896 union power_supply_propval value;
2898 dev_dbg(battery->dev,
2899 "%s: (%d,%d)\n", __func__, psp, val->intval);
2902 case POWER_SUPPLY_PROP_STATUS:
2903 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
2904 full_check_type = battery->pdata->full_check_type;
2906 full_check_type = battery->pdata->full_check_type_2nd;
2907 if ((full_check_type == SEC_BATTERY_FULLCHARGED_CHGINT) &&
2908 (val->intval == POWER_SUPPLY_STATUS_FULL))
2909 sec_bat_do_fullcharged(battery);
2910 battery->status = val->intval;
2912 case POWER_SUPPLY_PROP_HEALTH:
2913 sec_bat_ovp_uvlo_result(battery, val->intval);
2915 case POWER_SUPPLY_PROP_ONLINE:
2916 current_cable_type = val->intval;
2918 if (current_cable_type < 0) {
2919 dev_info(battery->dev,
2920 "%s: ignore event(%d)\n",
2921 __func__, current_cable_type);
2922 } else if (current_cable_type == POWER_SUPPLY_TYPE_OTG) {
2923 value.intval = current_cable_type;
2924 psy_do_property(battery->pdata->charger_name, set,
2925 POWER_SUPPLY_PROP_ONLINE, value);
2926 wake_lock(&battery->monitor_wake_lock);
2927 queue_delayed_work(battery->monitor_wqueue,
2928 &battery->monitor_work, 0);
2932 } else if (current_cable_type == POWER_SUPPLY_TYPE_WIRELESS) {
2933 battery->wc_status = true;
2934 } else if (current_cable_type == POWER_SUPPLY_TYPE_WIRELESS_REMOVE) {
2935 battery->wc_status = false;
2936 if (battery->wire_status != POWER_SUPPLY_TYPE_BATTERY)
2937 current_cable_type = battery->wire_status;
2940 battery->wire_status = current_cable_type;
2941 if ((battery->wire_status == POWER_SUPPLY_TYPE_BATTERY)
2942 && battery->wc_status)
2943 current_cable_type = POWER_SUPPLY_TYPE_WIRELESS;
2945 if (current_cable_type == POWER_SUPPLY_TYPE_BATTERY) {
2946 value.intval = current_cable_type;
2947 psy_do_property(battery->pdata->charger_name,
2948 set,POWER_SUPPLY_PROP_ONLINE, value);
2951 dev_info(battery->dev,
2952 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
2953 __func__, current_cable_type, battery->wc_status,
2954 battery->wire_status);
2956 /* cable is attached or detached
2957 * if current_cable_type is minus value,
2958 * check cable by sec_bat_get_cable_type()
2959 * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
2960 * (0 is POWER_SUPPLY_TYPE_UNKNOWN)
2962 if ((current_cable_type >= 0) &&
2963 (current_cable_type <= SEC_SIZEOF_POWER_SUPPLY_TYPE) &&
2964 (battery->pdata->cable_source_type &
2965 SEC_BATTERY_CABLE_SOURCE_EXTERNAL ||
2966 battery->pdata->cable_source_type &
2967 SEC_BATTERY_CABLE_SOURCE_EXTENDED)) {
2969 wake_lock(&battery->cable_wake_lock);
2970 queue_work(battery->monitor_wqueue,
2971 &battery->cable_work);
2973 if (sec_bat_get_cable_type(battery,
2974 battery->pdata->cable_source_type)) {
2975 wake_lock(&battery->cable_wake_lock);
2976 queue_work(battery->monitor_wqueue,
2977 &battery->cable_work);
2981 case POWER_SUPPLY_PROP_CAPACITY:
2982 battery->capacity = val->intval;
2983 power_supply_changed(&battery->psy_bat);
2985 case POWER_SUPPLY_PROP_PRESENT:
2986 cancel_delayed_work(&battery->monitor_work);
2987 wake_lock(&battery->monitor_wake_lock);
2988 queue_delayed_work_on(0, battery->monitor_wqueue,
2989 &battery->monitor_work, 0);
2998 static int sec_bat_get_property(struct power_supply *psy,
2999 enum power_supply_property psp,
3000 union power_supply_propval *val)
3002 struct sec_battery_info *battery =
3003 container_of(psy, struct sec_battery_info, psy_bat);
3004 union power_supply_propval value;
3007 case POWER_SUPPLY_PROP_STATUS:
3008 if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
3009 (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
3010 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
3012 if ((battery->pdata->cable_check_type &
3013 SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE) &&
3014 (battery->pdata->is_lpm &&
3015 !battery->pdata->is_lpm())) {
3016 switch (battery->cable_type) {
3017 case POWER_SUPPLY_TYPE_USB:
3018 case POWER_SUPPLY_TYPE_USB_DCP:
3019 case POWER_SUPPLY_TYPE_USB_CDP:
3020 case POWER_SUPPLY_TYPE_USB_ACA:
3022 POWER_SUPPLY_STATUS_DISCHARGING;
3026 val->intval = battery->status;
3029 case POWER_SUPPLY_PROP_CHARGE_TYPE:
3030 psy_do_property(battery->pdata->charger_name, get,
3031 POWER_SUPPLY_PROP_CHARGE_TYPE, value);
3032 if (value.intval == POWER_SUPPLY_CHARGE_TYPE_UNKNOWN)
3033 /* if error in CHARGE_TYPE of charger
3034 * set CHARGE_TYPE as NONE
3036 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
3038 val->intval = value.intval;
3040 case POWER_SUPPLY_PROP_HEALTH:
3041 val->intval = battery->health;
3043 case POWER_SUPPLY_PROP_PRESENT:
3044 val->intval = battery->present;
3046 case POWER_SUPPLY_PROP_ONLINE:
3047 val->intval = battery->cable_type;
3049 case POWER_SUPPLY_PROP_TECHNOLOGY:
3050 val->intval = battery->pdata->technology;
3052 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
3053 if (battery->pdata->check_jig_status) {
3054 psy_do_property(battery->pdata->fuelgauge_name, get,
3055 POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
3056 battery->voltage_now = value.intval;
3057 dev_err(battery->dev,
3058 "%s: voltage now(%d)\n", __func__, battery->voltage_now);
3060 /* voltage value should be in uV */
3061 val->intval = battery->voltage_now * 1000;
3063 case POWER_SUPPLY_PROP_VOLTAGE_AVG:
3064 #ifdef CONFIG_SEC_FACTORY
3065 value.intval = SEC_BATTEY_VOLTAGE_AVERAGE;
3066 psy_do_property(battery->pdata->fuelgauge_name, get,
3067 POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
3068 battery->voltage_avg = value.intval;
3069 dev_err(battery->dev,
3070 "%s: voltage avg(%d)\n", __func__, battery->voltage_avg);
3072 /* voltage value should be in uV */
3073 val->intval = battery->voltage_avg * 1000;
3075 case POWER_SUPPLY_PROP_CURRENT_NOW:
3076 val->intval = battery->current_now;
3078 case POWER_SUPPLY_PROP_CURRENT_AVG:
3079 val->intval = battery->current_avg;
3081 /* charging mode (differ from power supply) */
3082 case POWER_SUPPLY_PROP_CHARGE_NOW:
3083 val->intval = battery->charging_mode;
3085 case POWER_SUPPLY_PROP_CAPACITY:
3086 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
3087 if (battery->status == POWER_SUPPLY_STATUS_FULL) {
3088 if(battery->eng_not_full_status == true)
3089 val->intval = battery->capacity;
3093 val->intval = battery->capacity;
3096 /* In full-charged status, SOC is always 100% */
3097 if (battery->status == POWER_SUPPLY_STATUS_FULL)
3100 val->intval = battery->capacity;
3103 case POWER_SUPPLY_PROP_TEMP:
3104 val->intval = battery->temperature;
3106 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
3107 val->intval = battery->temper_amb;
3115 static int sec_usb_get_property(struct power_supply *psy,
3116 enum power_supply_property psp,
3117 union power_supply_propval *val)
3119 struct sec_battery_info *battery =
3120 container_of(psy, struct sec_battery_info, psy_usb);
3122 if (psp != POWER_SUPPLY_PROP_ONLINE)
3125 if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
3126 (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
3130 /* Set enable=1 only if the USB charger is connected */
3131 switch (battery->wire_status) {
3132 case POWER_SUPPLY_TYPE_USB:
3133 case POWER_SUPPLY_TYPE_USB_DCP:
3134 case POWER_SUPPLY_TYPE_USB_CDP:
3135 case POWER_SUPPLY_TYPE_USB_ACA:
3136 case POWER_SUPPLY_TYPE_MHL_USB:
3147 static int sec_ac_get_property(struct power_supply *psy,
3148 enum power_supply_property psp,
3149 union power_supply_propval *val)
3151 struct sec_battery_info *battery =
3152 container_of(psy, struct sec_battery_info, psy_ac);
3154 if (psp != POWER_SUPPLY_PROP_ONLINE)
3157 if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
3158 (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
3163 /* Set enable=1 only if the AC charger is connected */
3164 switch (battery->cable_type) {
3165 case POWER_SUPPLY_TYPE_MAINS:
3166 case POWER_SUPPLY_TYPE_HV_MAINS:
3167 case POWER_SUPPLY_TYPE_MISC:
3168 case POWER_SUPPLY_TYPE_CARDOCK:
3169 case POWER_SUPPLY_TYPE_UARTOFF:
3170 case POWER_SUPPLY_TYPE_LAN_HUB:
3171 case POWER_SUPPLY_TYPE_UNKNOWN:
3172 case POWER_SUPPLY_TYPE_MHL_500:
3173 case POWER_SUPPLY_TYPE_MHL_900:
3174 case POWER_SUPPLY_TYPE_MHL_1500:
3175 case POWER_SUPPLY_TYPE_SMART_OTG:
3176 case POWER_SUPPLY_TYPE_SMART_NOTG:
3187 static int sec_wireless_get_property(struct power_supply *psy,
3188 enum power_supply_property psp,
3189 union power_supply_propval *val)
3191 struct sec_battery_info *battery =
3192 container_of(psy, struct sec_battery_info, psy_wireless);
3194 if (psp != POWER_SUPPLY_PROP_ONLINE)
3197 if (battery->wc_status)
3205 static int sec_wireless_set_property(struct power_supply *psy,
3206 enum power_supply_property psp,
3207 const union power_supply_propval *val)
3209 struct sec_battery_info *battery =
3210 container_of(psy, struct sec_battery_info, psy_wireless);
3212 if (psp != POWER_SUPPLY_PROP_ONLINE)
3215 battery->wc_status = val->intval;
3217 wake_lock(&battery->cable_wake_lock);
3218 queue_work(battery->monitor_wqueue, &battery->cable_work);
3223 static int sec_ps_set_property(struct power_supply *psy,
3224 enum power_supply_property psp,
3225 const union power_supply_propval *val)
3227 struct sec_battery_info *battery =
3228 container_of(psy, struct sec_battery_info, psy_ps);
3229 union power_supply_propval value;
3232 case POWER_SUPPLY_PROP_STATUS:
3233 if ((val->intval == 0) || (val->intval ==1)) {
3234 battery->ps_enable = val->intval;
3235 dev_info(battery->dev,
3236 "%s: power sharing cable set (%d)\n", __func__, battery->ps_enable);
3237 value.intval = POWER_SUPPLY_TYPE_POWER_SHARING;
3238 psy_do_property(battery->pdata->charger_name, set,
3239 POWER_SUPPLY_PROP_ONLINE, value);
3241 dev_err(battery->dev,
3242 "%s: invalid setting (%d)\n", __func__, val->intval);
3245 case POWER_SUPPLY_PROP_ONLINE:
3246 if (val->intval == POWER_SUPPLY_TYPE_POWER_SHARING) {
3247 battery->ps_status = true;
3248 dev_info(battery->dev,
3249 "%s: power sharing cable plugin (%d)\n", __func__, battery->ps_status);
3250 wake_lock(&battery->monitor_wake_lock);
3251 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3253 battery->ps_status = false;
3254 dev_info(battery->dev,
3255 "%s: power sharing cable plugout (%d)\n", __func__, battery->ps_status);
3256 wake_lock(&battery->monitor_wake_lock);
3257 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3267 static int sec_ps_get_property(struct power_supply *psy,
3268 enum power_supply_property psp,
3269 union power_supply_propval *val)
3271 struct sec_battery_info *battery =
3272 container_of(psy, struct sec_battery_info, psy_ps);
3275 case POWER_SUPPLY_PROP_STATUS:
3276 if (battery->ps_enable)
3281 case POWER_SUPPLY_PROP_ONLINE:
3282 if (battery->ps_status)
3296 static irqreturn_t sec_bat_irq_thread(int irq, void *irq_data)
3298 struct sec_battery_info *battery = irq_data;
3300 dev_info(battery->dev, "%s:(bat_irq occured_start\n", __func__);
3302 if (battery->pdata->cable_check_type &
3303 SEC_BATTERY_CABLE_CHECK_INT) {
3304 if (battery->pdata->is_interrupt_cable_check_possible &&
3305 !battery->pdata->is_interrupt_cable_check_possible(
3306 battery->extended_cable_type))
3307 goto no_cable_check;
3309 if (sec_bat_get_cable_type(battery,
3310 battery->pdata->cable_source_type)) {
3311 wake_lock(&battery->cable_wake_lock);
3312 queue_work(battery->monitor_wqueue,
3313 &battery->cable_work);
3319 if (battery->pdata->battery_check_type ==
3320 SEC_BATTERY_CHECK_INT) {
3321 if (battery_pdata->check_battery_callback)
3322 battery->present = battery->pdata->check_battery_callback();
3324 wake_lock(&battery->monitor_wake_lock);
3325 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3332 #if defined(CONFIG_MUIC_NOTIFIER)
3333 static int sec_bat_cable_check(struct sec_battery_info *battery,
3334 muic_attached_dev_t attached_dev)
3336 int current_cable_type = POWER_SUPPLY_TYPE_UNKNOWN;
3338 pr_info("[%s]ATTACHED(%d)\n", __func__, attached_dev);
3340 switch (attached_dev)
3342 case ATTACHED_DEV_JIG_UART_OFF_MUIC:
3343 case ATTACHED_DEV_SMARTDOCK_MUIC:
3344 current_cable_type = POWER_SUPPLY_TYPE_BATTERY;
3346 case ATTACHED_DEV_OTG_MUIC:
3347 current_cable_type = POWER_SUPPLY_TYPE_OTG;
3349 case ATTACHED_DEV_USB_MUIC:
3350 case ATTACHED_DEV_JIG_USB_OFF_MUIC:
3351 case ATTACHED_DEV_JIG_USB_ON_MUIC:
3352 case ATTACHED_DEV_SMARTDOCK_USB_MUIC:
3353 current_cable_type = POWER_SUPPLY_TYPE_USB;
3355 case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC:
3356 current_cable_type = POWER_SUPPLY_TYPE_UARTOFF;
3358 case ATTACHED_DEV_TA_MUIC:
3359 case ATTACHED_DEV_CARDOCK_MUIC:
3360 case ATTACHED_DEV_DESKDOCK_MUIC:
3361 case ATTACHED_DEV_SMARTDOCK_TA_MUIC:
3362 current_cable_type = POWER_SUPPLY_TYPE_MAINS;
3364 case ATTACHED_DEV_CDP_MUIC:
3365 current_cable_type = POWER_SUPPLY_TYPE_USB_CDP;
3367 case ATTACHED_DEV_HV_MUIC:
3368 current_cable_type = POWER_SUPPLY_TYPE_HV_MAINS;
3371 pr_err("%s: invalid type for charger:%d\n",
3372 __func__, attached_dev);
3375 return current_cable_type;
3379 static int batt_handle_notification(struct notifier_block *nb,
3380 unsigned long action, void *data)
3382 muic_attached_dev_t attached_dev = *(muic_attached_dev_t *)data;
3385 struct sec_battery_info *battery =
3386 container_of(nb, struct sec_battery_info,
3390 case MUIC_NOTIFY_CMD_DETACH:
3391 case MUIC_NOTIFY_CMD_LOGICALLY_DETACH:
3393 cable_type = POWER_SUPPLY_TYPE_BATTERY;
3395 case MUIC_NOTIFY_CMD_ATTACH:
3396 case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH:
3398 cable_type = sec_bat_cable_check(battery, attached_dev);
3402 cable_type = POWER_SUPPLY_TYPE_UNKNOWN;
3406 if (cable_type < 0) {
3407 dev_info(battery->dev, "%s: ignore event(%d)\n",
3408 __func__, cable_type);
3409 } else if (cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) {
3410 battery->ps_status = true;
3411 dev_info(battery->dev,
3412 "%s: power sharing cable plugin (%d)\n", __func__, battery->ps_status);
3413 } else if (cable_type == POWER_SUPPLY_TYPE_WIRELESS) {
3414 battery->wc_status = true;
3416 } else if (cable_type == POWER_SUPPLY_TYPE_WIRELESS_REMOVE) {
3417 battery->wc_status = false;
3418 if (battery->wire_status != POWER_SUPPLY_TYPE_BATTERY)
3419 cable_type = battery->wire_status;
3422 battery->wire_status = cable_type;
3423 if ((battery->wire_status == POWER_SUPPLY_TYPE_BATTERY)
3424 && battery->wc_status && !battery->ps_status)
3425 cable_type = POWER_SUPPLY_TYPE_WIRELESS;
3427 dev_info(battery->dev,
3428 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
3429 __func__, cable_type, battery->wc_status,
3430 battery->wire_status);
3432 if ((cable_type >= 0) &&
3433 cable_type <= SEC_SIZEOF_POWER_SUPPLY_TYPE) {
3434 if (cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) {
3435 wake_lock(&battery->monitor_wake_lock);
3436 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3437 } else if((cable_type == POWER_SUPPLY_TYPE_BATTERY)
3438 && battery->ps_status) {
3439 battery->ps_status = false;
3440 dev_info(battery->dev,
3441 "%s: power sharing cable plugout (%d)\n", __func__, battery->ps_status);
3442 wake_lock(&battery->monitor_wake_lock);
3443 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3444 } else if(cable_type != battery->cable_type) {
3445 wake_lock(&battery->cable_wake_lock);
3446 queue_work(battery->monitor_wqueue, &battery->cable_work);
3448 dev_info(battery->dev,
3449 "%s: Cable is Not Changed(%d)\n",
3450 __func__, battery->cable_type);
3454 pr_info("%s: CMD=%s, attached_dev=%d\n", __func__, cmd, attached_dev);
3458 #endif /* CONFIG_MUIC_NOTIFIER */
3461 static int sec_bat_parse_dt(struct device *dev,
3462 struct sec_battery_info *battery)
3464 struct device_node *np = dev->of_node;
3465 sec_battery_platform_data_t *pdata = battery->pdata;
3471 pr_info("%s: np NULL\n", __func__);
3475 ret = of_property_read_string(np,
3476 "battery,vendor", (char const **)&pdata->vendor);
3478 pr_info("%s: Vendor is Empty\n", __func__);
3480 ret = of_property_read_string(np,
3481 "battery,charger_name", (char const **)&pdata->charger_name);
3483 pr_info("%s: Vendor is Empty\n", __func__);
3485 ret = of_property_read_string(np,
3486 "battery,fuelgauge_name", (char const **)&pdata->fuelgauge_name);
3488 pr_info("%s: Vendor is Empty\n", __func__);
3490 ret = of_property_read_string(np,
3491 "battery,chip_vendor", (char const **)&pdata->chip_vendor);
3493 pr_info("%s: Vendor is Empty\n", __func__);
3495 ret = of_property_read_u32(np, "battery,technology",
3496 &pdata->technology);
3498 ret = of_property_read_u32(np, "battery,battery_check_type",
3499 &pdata->battery_check_type);
3501 p = of_get_property(np, "battery,polling_time", &len);
3503 len = len / sizeof(u32);
3505 pdata->polling_time = kzalloc(sizeof(*pdata->polling_time) * len, GFP_KERNEL);
3507 ret = of_property_read_u32_array(np, "battery,polling_time",
3508 pdata->polling_time, len);
3510 p = of_get_property(np, "battery,temp_table_adc", &len);
3512 len = len / sizeof(u32);
3514 pdata->temp_adc_table_size = len;
3515 pdata->temp_amb_adc_table_size = len;
3517 pdata->temp_adc_table = kzalloc(sizeof(sec_bat_adc_table_data_t) *
3518 pdata->temp_adc_table_size, GFP_KERNEL);
3519 pdata->temp_amb_adc_table = kzalloc(sizeof(sec_bat_adc_table_data_t) *
3520 pdata->temp_adc_table_size, GFP_KERNEL);
3522 for(i = 0; i < pdata->temp_adc_table_size; i++) {
3523 ret = of_property_read_u32_index(np, "battery,temp_table_adc", i,
3524 &pdata->temp_adc_table[i].adc);
3525 ret = of_property_read_u32_index(np, "battery,temp_table_data", i,
3526 &pdata->temp_adc_table[i].data);
3527 ret = of_property_read_u32_index(np, "battery,temp_table_adc", i,
3528 &pdata->temp_amb_adc_table[i].adc);
3529 ret = of_property_read_u32_index(np, "battery,temp_table_data", i,
3530 &pdata->temp_amb_adc_table[i].data);
3533 p = of_get_property(np, "battery,input_current_limit", &len);
3535 len = len / sizeof(u32);
3537 pdata->charging_current = kzalloc(sizeof(sec_charging_current_t) * len,
3540 for(i = 0; i < len; i++) {
3541 ret = of_property_read_u32_index(np,
3542 "battery,input_current_limit", i,
3543 &pdata->charging_current[i].input_current_limit);
3544 ret = of_property_read_u32_index(np,
3545 "battery,fast_charging_current", i,
3546 &pdata->charging_current[i].fast_charging_current);
3547 ret = of_property_read_u32_index(np,
3548 "battery,full_check_current_1st", i,
3549 &pdata->charging_current[i].full_check_current_1st);
3550 ret = of_property_read_u32_index(np,
3551 "battery,full_check_current_2nd", i,
3552 &pdata->charging_current[i].full_check_current_2nd);
3555 ret = of_property_read_u32(np, "battery,adc_check_count",
3556 &pdata->adc_check_count);
3558 ret = of_property_read_u32(np, "battery,temp_adc_type",
3559 &pdata->temp_adc_type);
3561 ret = of_property_read_u32(np, "battery,cable_check_type",
3562 &pdata->cable_check_type);
3564 ret = of_property_read_u32(np, "battery,cable_source_type",
3565 &pdata->cable_source_type);
3567 ret = of_property_read_u32(np, "battery,event_waiting_time",
3568 &pdata->event_waiting_time);
3570 ret = of_property_read_u32(np, "battery,polling_type",
3571 &pdata->polling_type);
3573 ret = of_property_read_u32(np, "battery,monitor_initial_count",
3574 &pdata->monitor_initial_count);
3576 ret = of_property_read_u32(np, "battery,check_count",
3577 &pdata->check_count);
3579 ret = of_property_read_u32(np, "battery,check_adc_max",
3580 &pdata->check_adc_max);
3582 ret = of_property_read_u32(np, "battery,check_adc_min",
3583 &pdata->check_adc_min);
3585 ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type",
3586 &pdata->ovp_uvlo_check_type);
3588 ret = of_property_read_u32(np, "battery,thermal_source",
3589 &pdata->thermal_source);
3591 ret = of_property_read_u32(np, "battery,temp_check_type",
3592 &pdata->temp_check_type);
3594 ret = of_property_read_u32(np, "battery,temp_check_count",
3595 &pdata->temp_check_count);
3597 ret = of_property_read_u32(np, "battery,temp_high_threshold_event",
3598 &pdata->temp_high_threshold_event);
3600 ret = of_property_read_u32(np, "battery,temp_high_recovery_event",
3601 &pdata->temp_high_recovery_event);
3603 ret = of_property_read_u32(np, "battery,temp_low_threshold_event",
3604 &pdata->temp_low_threshold_event);
3606 ret = of_property_read_u32(np, "battery,temp_low_recovery_event",
3607 &pdata->temp_low_recovery_event);
3609 ret = of_property_read_u32(np, "battery,temp_high_threshold_event",
3610 &pdata->temp_high_threshold_normal);
3612 ret = of_property_read_u32(np, "battery,temp_high_recovery_event",
3613 &pdata->temp_high_recovery_normal);
3615 ret = of_property_read_u32(np, "battery,temp_low_threshold_event",
3616 &pdata->temp_low_threshold_normal);
3618 ret = of_property_read_u32(np, "battery,temp_low_recovery_event",
3619 &pdata->temp_low_recovery_normal);
3621 ret = of_property_read_u32(np, "battery,temp_high_threshold_event",
3622 &pdata->temp_high_threshold_lpm);
3624 ret = of_property_read_u32(np, "battery,temp_high_recovery_event",
3625 &pdata->temp_high_recovery_lpm);
3627 ret = of_property_read_u32(np, "battery,temp_low_threshold_event",
3628 &pdata->temp_low_threshold_lpm);
3630 ret = of_property_read_u32(np, "battery,temp_low_recovery_event",
3631 &pdata->temp_low_recovery_lpm);
3633 ret = of_property_read_u32(np, "battery,full_check_type",
3634 &pdata->full_check_type);
3636 ret = of_property_read_u32(np, "battery,full_check_type_2nd",
3637 &pdata->full_check_type_2nd);
3639 ret = of_property_read_u32(np, "battery,full_check_count",
3640 &pdata->full_check_count);
3642 ret = of_property_read_u32(np, "battery,chg_gpio_full_check",
3643 &pdata->chg_gpio_full_check);
3645 ret = of_property_read_u32(np, "battery,chg_polarity_full_check",
3646 &pdata->chg_polarity_full_check);
3648 ret = of_property_read_u32(np, "battery,full_condition_type",
3649 &pdata->full_condition_type);
3651 ret = of_property_read_u32(np, "battery,full_condition_soc",
3652 &pdata->full_condition_soc);
3654 ret = of_property_read_u32(np, "battery,full_condition_vcell",
3655 &pdata->full_condition_vcell);
3657 ret = of_property_read_u32(np, "battery,recharge_check_count",
3658 &pdata->recharge_check_count);
3660 ret = of_property_read_u32(np, "battery,recharge_condition_type",
3661 &pdata->recharge_condition_type);
3663 ret = of_property_read_u32(np, "battery,recharge_condition_soc",
3664 &pdata->recharge_condition_soc);
3666 ret = of_property_read_u32(np, "battery,recharge_condition_vcell",
3667 &pdata->recharge_condition_vcell);
3669 ret = of_property_read_u32(np, "battery,charging_total_time",
3670 (unsigned int *)&pdata->charging_total_time);
3672 ret = of_property_read_u32(np, "battery,recharging_total_time",
3673 (unsigned int *)&pdata->recharging_total_time);
3675 ret = of_property_read_u32(np, "battery,charging_reset_time",
3676 (unsigned int *)&pdata->charging_reset_time);
3678 ret = of_property_read_u32(np, "battery,charging_reset_time",
3679 (unsigned int *)&pdata->charging_reset_time);
3681 ret = of_property_read_u32(np, "charger,chg_float_voltage",
3682 (unsigned int *)&pdata->chg_float_voltage);
3684 pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
3685 "cable_source_type : %d, event_waiting_time : %d\n"
3686 "polling_type : %d, initial_count : %d, check_count : %d\n"
3687 "check_adc_max : %d, check_adc_min : %d\n"
3688 "ovp_uvlo_check_type : %d, thermal_source : %d\n"
3689 "temp_check_type : %d, temp_check_count : %d\n"
3690 "temp_high_threshold_even : %d, temp_high_recovery_event : %d\n"
3691 "chg_float_voltage : %d\n",
3693 pdata->vendor, pdata->technology,pdata->cable_check_type,
3694 pdata->cable_source_type, pdata->event_waiting_time,
3695 pdata->polling_type, pdata->monitor_initial_count,
3696 pdata->check_count, pdata->check_adc_max, pdata->check_adc_min,
3697 pdata->ovp_uvlo_check_type, pdata->thermal_source,
3698 pdata->temp_check_type, pdata->temp_check_count,
3699 pdata->temp_high_threshold_event, pdata->temp_high_recovery_event,
3700 pdata->chg_float_voltage);
3707 extern sec_battery_platform_data_t sec_battery_pdata;
3710 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
3711 static int sec_battery_pm_notifier(struct notifier_block *nb,
3712 unsigned long pm_event, void *unused)
3714 struct sec_battery_info *battery;
3716 battery = container_of(nb, struct sec_battery_info, pm_nb);
3718 dev_info(battery->dev, "%s: Start\n", __func__);
3721 case PM_SUSPEND_PREPARE:
3722 switch (battery->pdata->polling_type) {
3723 case SEC_BATTERY_MONITOR_WORKQUEUE:
3724 cancel_delayed_work(&battery->polling_work);
3726 case SEC_BATTERY_MONITOR_ALARM:
3727 alarm_cancel(&battery->polling_alarm);
3732 cancel_delayed_work_sync(&battery->monitor_work);
3734 battery->polling_in_sleep = true;
3736 sec_bat_set_polling(battery);
3738 /* cancel work for polling
3739 * that is set in sec_bat_set_polling()
3740 * no need for polling in sleep
3742 if (battery->pdata->polling_type ==
3743 SEC_BATTERY_MONITOR_WORKQUEUE)
3744 cancel_delayed_work(&battery->polling_work);
3746 case PM_POST_SUSPEND:
3752 dev_dbg(battery->dev, "%s: End\n", __func__);
3758 #ifdef CONFIG_SLEEP_MONITOR
3759 int bat_get_sleep_monitor_cb(void *priv, unsigned int *raw_val,
3760 int check_level, int caller_type)
3762 union power_supply_propval val;
3763 unsigned int temp_res= 0;
3766 if (check_level == SLEEP_MONITOR_CHECK_HARD) {
3767 psy_do_property("sec-fuelgauge", get, POWER_SUPPLY_PROP_CAPACITY, val);
3770 sec_bat_get_property(priv, POWER_SUPPLY_PROP_CAPACITY, &val);
3771 temp_res = val.intval;
3773 sec_bat_get_property(priv, POWER_SUPPLY_PROP_STATUS, &val);
3775 temp_res |= val.intval << 8;
3777 sec_bat_get_property(priv, POWER_SUPPLY_PROP_HEALTH, &val);
3778 temp_res |= val.intval << 12;
3780 sec_bat_get_property(priv, POWER_SUPPLY_PROP_ONLINE, &val);
3781 temp_res |= val.intval << 16;
3783 *raw_val = temp_res;
3788 static struct sleep_monitor_ops bat_sleep_monitor_ops = {
3789 .read_cb_func = bat_get_sleep_monitor_cb,
3793 static int sec_battery_probe(struct platform_device *pdev)
3795 sec_battery_platform_data_t *pdata = NULL;
3796 struct sec_battery_info *battery;
3802 union power_supply_propval value;
3805 "%s: SEC Battery Driver Loading\n", __func__);
3807 battery = kzalloc(sizeof(*battery), GFP_KERNEL);
3811 if (pdev->dev.of_node) {
3812 pdata = devm_kzalloc(&pdev->dev,
3813 sizeof(sec_battery_platform_data_t),
3816 dev_err(&pdev->dev, "Failed to allocate memory\n");
3821 battery->pdata = pdata;
3823 if (sec_bat_parse_dt(&pdev->dev, battery))
3825 "%s: Failed to get battery init\n", __func__);
3828 pdata = dev_get_platdata(&pdev->dev);
3829 battery->pdata = pdata;
3832 platform_set_drvdata(pdev, battery);
3834 battery->dev = &pdev->dev;
3836 mutex_init(&battery->adclock);
3838 dev_dbg(battery->dev, "%s: ADC init\n", __func__);
3841 // adc_init(pdev, battery);
3843 for (i = 0; i < SEC_BAT_ADC_CHANNEL_FULL_CHECK; i++)
3844 adc_init(pdev, pdata, i);
3847 wake_lock_init(&battery->monitor_wake_lock, WAKE_LOCK_SUSPEND,
3848 "sec-battery-monitor");
3849 wake_lock_init(&battery->cable_wake_lock, WAKE_LOCK_SUSPEND,
3850 "sec-battery-cable");
3851 wake_lock_init(&battery->vbus_wake_lock, WAKE_LOCK_SUSPEND,
3852 "sec-battery-vbus");
3854 /* initialization of battery info */
3855 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
3856 battery->health = POWER_SUPPLY_HEALTH_GOOD;
3857 battery->present = true;
3859 battery->polling_count = 1; /* initial value = 1 */
3860 battery->polling_time = pdata->polling_time[
3861 SEC_BATTERY_POLLING_TIME_DISCHARGING];
3862 battery->polling_in_sleep = false;
3863 battery->polling_short = false;
3865 battery->check_count = 0;
3866 battery->check_adc_count = 0;
3867 battery->check_adc_value = 0;
3869 battery->charging_start_time = 0;
3870 battery->charging_passed_time = 0;
3871 battery->charging_next_time = 0;
3872 battery->charging_fullcharged_time = 0;
3873 battery->siop_level = 100;
3874 battery->wc_enable = 1;
3875 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
3876 battery->stability_test = 0;
3877 battery->eng_not_full_status = 0;
3879 battery->wc_status = 0;
3880 battery->ps_status= 0;
3881 battery->wire_status = POWER_SUPPLY_TYPE_BATTERY;
3883 #if defined(CONFIG_BATTERY_SWELLING)
3884 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
3885 battery->swelling_max_vbat = 4350;
3886 battery->swelling_temp_dischg_threshold = BATT_SWELLING_DISCHG_TEMP;
3887 battery->swelling_temp_dischg_recovery = BATT_SWELLING_DISCHG_TEMP_RECOV;
3888 battery->swelling_temp_high_threshold = BATT_SWELLING_HIGH_TEMP_BLOCK;
3889 battery->swelling_temp_high_recovery = BATT_SWELLING_HIGH_TEMP_RECOV;
3890 battery->swelling_temp_low_threshold = BATT_SWELLING_LOW_TEMP_BLOCK;
3891 battery->swelling_temp_low_recovery = BATT_SWELLING_LOW_TEMP_RECOV;
3892 battery->swelling_recharge_voltage = BATT_SWELLING_RECHG_VOLTAGE;
3893 battery->swelling_block_time = BATT_SWELLING_BLOCK_TIME;
3895 #if defined(CONFIG_BATTERY_DISCHG_IC)
3896 battery->dischg_test = pdata->dischg_test;
3899 #if defined(ANDROID_ALARM_ACTIVATED)
3900 alarm_init(&battery->event_termination_alarm,
3901 ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
3902 sec_bat_event_expired_timer_func);
3904 alarm_init(&battery->event_termination_alarm,
3906 sec_bat_event_expired_timer_func);
3909 battery->temp_high_threshold =
3910 pdata->temp_high_threshold_normal;
3911 battery->temp_high_recovery =
3912 pdata->temp_high_recovery_normal;
3913 battery->temp_low_recovery =
3914 pdata->temp_low_recovery_normal;
3915 battery->temp_low_threshold =
3916 pdata->temp_low_threshold_normal;
3918 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
3919 battery->is_recharging = false;
3920 battery->cable_type = POWER_SUPPLY_TYPE_BATTERY;
3921 battery->test_mode = 0;
3922 battery->factory_mode = false;
3923 battery->slate_mode = false;
3925 battery->psy_bat.name = "battery",
3926 battery->psy_bat.type = POWER_SUPPLY_TYPE_BATTERY,
3927 battery->psy_bat.properties = sec_battery_props,
3928 battery->psy_bat.num_properties = ARRAY_SIZE(sec_battery_props),
3929 battery->psy_bat.get_property = sec_bat_get_property,
3930 battery->psy_bat.set_property = sec_bat_set_property,
3931 battery->psy_usb.name = "usb",
3932 battery->psy_usb.type = POWER_SUPPLY_TYPE_USB,
3933 battery->psy_usb.supplied_to = supply_list,
3934 battery->psy_usb.num_supplicants = ARRAY_SIZE(supply_list),
3935 battery->psy_usb.properties = sec_power_props,
3936 battery->psy_usb.num_properties = ARRAY_SIZE(sec_power_props),
3937 battery->psy_usb.get_property = sec_usb_get_property,
3938 battery->psy_ac.name = "ac",
3939 battery->psy_ac.type = POWER_SUPPLY_TYPE_MAINS,
3940 battery->psy_ac.supplied_to = supply_list,
3941 battery->psy_ac.num_supplicants = ARRAY_SIZE(supply_list),
3942 battery->psy_ac.properties = sec_power_props,
3943 battery->psy_ac.num_properties = ARRAY_SIZE(sec_power_props),
3944 battery->psy_ac.get_property = sec_ac_get_property;
3945 battery->psy_wireless.name = "wireless",
3946 battery->psy_wireless.type = POWER_SUPPLY_TYPE_WIRELESS,
3947 battery->psy_wireless.supplied_to = supply_list,
3948 battery->psy_wireless.num_supplicants = ARRAY_SIZE(supply_list),
3949 battery->psy_wireless.properties = sec_power_props,
3950 battery->psy_wireless.num_properties = ARRAY_SIZE(sec_power_props),
3951 battery->psy_wireless.get_property = sec_wireless_get_property;
3952 battery->psy_wireless.set_property = sec_wireless_set_property;
3953 battery->psy_ps.name = "ps",
3954 battery->psy_ps.type = POWER_SUPPLY_TYPE_POWER_SHARING,
3955 battery->psy_ps.supplied_to = supply_list,
3956 battery->psy_ps.num_supplicants = ARRAY_SIZE(supply_list),
3957 battery->psy_ps.properties = sec_ps_props,
3958 battery->psy_ps.num_properties = ARRAY_SIZE(sec_ps_props),
3959 battery->psy_ps.get_property = sec_ps_get_property;
3960 battery->psy_ps.set_property = sec_ps_set_property;
3962 /* create work queue */
3963 battery->monitor_wqueue =
3964 create_singlethread_workqueue(dev_name(&pdev->dev));
3965 if (!battery->monitor_wqueue) {
3966 dev_err(battery->dev,
3967 "%s: Fail to Create Workqueue\n", __func__);
3971 INIT_DELAYED_WORK(&battery->monitor_work, sec_bat_monitor_work);
3972 INIT_WORK(&battery->cable_work, sec_bat_cable_work);
3974 switch (pdata->polling_type) {
3975 case SEC_BATTERY_MONITOR_WORKQUEUE:
3976 INIT_DELAYED_WORK(&battery->polling_work,
3977 sec_bat_polling_work);
3979 case SEC_BATTERY_MONITOR_ALARM:
3980 #if defined(ANDROID_ALARM_ACTIVATED)
3981 battery->last_poll_time = alarm_get_elapsed_realtime();
3982 alarm_init(&battery->polling_alarm,
3983 ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
3986 battery->last_poll_time = ktime_get_boottime();
3987 alarm_init(&battery->polling_alarm, ALARM_BOOTTIME,
3996 /* init power supplier framework */
3997 ret = power_supply_register(&pdev->dev, &battery->psy_ps);
3999 dev_err(battery->dev,
4000 "%s: Failed to Register psy_ps\n", __func__);
4004 ret = power_supply_register(&pdev->dev, &battery->psy_wireless);
4006 dev_err(battery->dev,
4007 "%s: Failed to Register psy_wireless\n", __func__);
4008 goto err_supply_unreg_ps;
4011 ret = power_supply_register(&pdev->dev, &battery->psy_usb);
4013 dev_err(battery->dev,
4014 "%s: Failed to Register psy_usb\n", __func__);
4015 goto err_supply_unreg_wireless;
4018 ret = power_supply_register(&pdev->dev, &battery->psy_ac);
4020 dev_err(battery->dev,
4021 "%s: Failed to Register psy_ac\n", __func__);
4022 goto err_supply_unreg_usb;
4025 ret = power_supply_register(&pdev->dev, &battery->psy_bat);
4027 dev_err(battery->dev,
4028 "%s: Failed to Register psy_bat\n", __func__);
4029 goto err_supply_unreg_ac;
4032 if (battery->pdata->bat_gpio_init && !battery->pdata->bat_gpio_init()) {
4033 dev_err(battery->dev,
4034 "%s: Failed to Initialize GPIO\n", __func__);
4035 goto err_supply_unreg_bat;
4038 if (battery->pdata->bat_irq) {
4039 ret = request_threaded_irq(battery->pdata->bat_irq,
4040 NULL, sec_bat_irq_thread,
4041 battery->pdata->bat_irq_attr,
4042 "battery-irq", battery);
4044 dev_err(battery->dev,
4045 "%s: Failed to Request IRQ, %d, %d\n", __func__, battery->pdata->bat_irq, ret);
4046 goto err_supply_unreg_ac;
4049 ret = enable_irq_wake(battery->pdata->bat_irq);
4051 dev_err(battery->dev,
4052 "%s: Failed to Enable Wakeup Source(%d)\n",
4057 ret = sec_bat_create_attrs(battery->psy_bat.dev);
4059 dev_err(battery->dev,
4060 "%s : Failed to create_attrs\n", __func__);
4063 //sprdbat_creat_caliberate_attr(battery->psy_bat.dev);
4065 #if defined(CONFIG_MUIC_NOTIFIER)
4066 muic_notifier_register(&battery->batt_nb,
4067 batt_handle_notification,
4068 MUIC_NOTIFY_DEV_CHARGER);
4071 if (pdata->initial_check)
4072 pdata->initial_check(battery);
4074 sec_bat_initial_check();
4076 psy_do_property("battery", get,
4077 POWER_SUPPLY_PROP_ONLINE, value);
4079 if (value.intval == POWER_SUPPLY_TYPE_BATTERY) {
4080 dev_info(&pdev->dev,
4081 "%s: SEC Battery Driver Monitorwork\n", __func__);
4082 wake_lock(&battery->monitor_wake_lock);
4083 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
4086 if (battery->pdata->check_battery_callback)
4087 battery->present = battery->pdata->check_battery_callback(battery);
4089 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
4090 battery->pm_nb.notifier_call = sec_battery_pm_notifier;
4092 register_pm_notifier(&battery->pm_nb);
4095 #ifdef CONFIG_SLEEP_MONITOR
4096 sleep_monitor_register_ops(&battery->psy_bat,
4097 &bat_sleep_monitor_ops, SLEEP_MONITOR_BATTERY);
4100 dev_info(battery->dev,
4101 "%s: SEC Battery Driver Loaded\n", __func__);
4102 //sec_bat_set_charge(battery, true);
4106 if (battery->pdata->bat_irq)
4107 free_irq(battery->pdata->bat_irq, battery);
4108 err_supply_unreg_ac:
4109 power_supply_unregister(&battery->psy_ac);
4110 err_supply_unreg_usb:
4111 power_supply_unregister(&battery->psy_usb);
4112 err_supply_unreg_bat:
4113 power_supply_unregister(&battery->psy_bat);
4114 err_supply_unreg_wireless:
4115 power_supply_unregister(&battery->psy_wireless);
4116 err_supply_unreg_ps:
4117 power_supply_unregister(&battery->psy_ps);
4119 destroy_workqueue(battery->monitor_wqueue);
4121 wake_lock_destroy(&battery->monitor_wake_lock);
4122 wake_lock_destroy(&battery->cable_wake_lock);
4123 wake_lock_destroy(&battery->vbus_wake_lock);
4124 mutex_destroy(&battery->adclock);
4132 static int sec_battery_remove(struct platform_device *pdev)
4134 struct sec_battery_info *battery = platform_get_drvdata(pdev);
4139 dev_dbg(battery->dev, "%s: Start\n", __func__);
4141 switch (battery->pdata->polling_type) {
4142 case SEC_BATTERY_MONITOR_WORKQUEUE:
4143 cancel_delayed_work(&battery->polling_work);
4145 case SEC_BATTERY_MONITOR_ALARM:
4146 alarm_cancel(&battery->polling_alarm);
4152 alarm_cancel(&battery->event_termination_alarm);
4153 flush_workqueue(battery->monitor_wqueue);
4154 destroy_workqueue(battery->monitor_wqueue);
4155 wake_lock_destroy(&battery->monitor_wake_lock);
4156 wake_lock_destroy(&battery->cable_wake_lock);
4157 wake_lock_destroy(&battery->vbus_wake_lock);
4159 mutex_destroy(&battery->adclock);
4161 // adc_exit(battery);
4163 for (i = 0; i < SEC_BAT_ADC_CHANNEL_FULL_CHECK; i++)
4164 adc_exit(battery->pdata, i);
4167 power_supply_unregister(&battery->psy_ps);
4168 power_supply_unregister(&battery->psy_wireless);
4169 power_supply_unregister(&battery->psy_ac);
4170 power_supply_unregister(&battery->psy_usb);
4171 power_supply_unregister(&battery->psy_bat);
4173 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
4174 unregister_pm_notifier(&battery->pm_nb);
4177 #ifdef CONFIG_SLEEP_MONITOR
4178 sleep_monitor_unregister_ops(SLEEP_MONITOR_BATTERY);
4181 dev_dbg(battery->dev, "%s: End\n", __func__);
4187 static int sec_battery_prepare(struct device *dev)
4189 #ifndef CONFIG_SEC_BATTERY_PM_NOTIFY
4190 struct sec_battery_info *battery
4191 = dev_get_drvdata(dev);
4193 dev_dbg(battery->dev, "%s: Start\n", __func__);
4195 switch (battery->pdata->polling_type) {
4196 case SEC_BATTERY_MONITOR_WORKQUEUE:
4197 cancel_delayed_work(&battery->polling_work);
4199 case SEC_BATTERY_MONITOR_ALARM:
4200 alarm_cancel(&battery->polling_alarm);
4205 cancel_delayed_work_sync(&battery->monitor_work);
4207 battery->polling_in_sleep = true;
4209 sec_bat_set_polling(battery);
4211 /* cancel work for polling
4212 * that is set in sec_bat_set_polling()
4213 * no need for polling in sleep
4215 if (battery->pdata->polling_type ==
4216 SEC_BATTERY_MONITOR_WORKQUEUE)
4217 cancel_delayed_work(&battery->polling_work);
4219 dev_dbg(battery->dev, "%s: End\n", __func__);
4224 static int sec_battery_suspend(struct device *dev)
4229 static int sec_battery_resume(struct device *dev)
4234 static void sec_battery_complete(struct device *dev)
4236 struct sec_battery_info *battery
4237 = dev_get_drvdata(dev);
4239 dev_dbg(battery->dev, "%s: Start\n", __func__);
4241 /* cancel current alarm and reset after monitor work */
4242 if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
4243 alarm_cancel(&battery->polling_alarm);
4245 wake_lock(&battery->monitor_wake_lock);
4246 queue_delayed_work(battery->monitor_wqueue,
4247 &battery->monitor_work, msecs_to_jiffies(500));
4249 dev_dbg(battery->dev, "%s: End\n", __func__);
4254 static void sec_battery_shutdown(struct device *dev)
4259 static struct of_device_id sec_battery_dt_ids[] = {
4260 { .compatible = "samsung,sec-battery" },
4263 MODULE_DEVICE_TABLE(of, sec_battery_dt_ids);
4264 #endif /* CONFIG_OF */
4266 static const struct dev_pm_ops sec_battery_pm_ops = {
4267 .prepare = sec_battery_prepare,
4268 .suspend = sec_battery_suspend,
4269 .resume = sec_battery_resume,
4270 .complete = sec_battery_complete,
4273 static struct platform_driver sec_battery_driver = {
4275 .name = "sec-battery",
4276 .owner = THIS_MODULE,
4277 .pm = &sec_battery_pm_ops,
4278 .shutdown = sec_battery_shutdown,
4280 .of_match_table = sec_battery_dt_ids,
4283 .probe = sec_battery_probe,
4284 .remove = sec_battery_remove,
4287 static int __init sec_battery_init(void)
4289 return platform_driver_register(&sec_battery_driver);
4292 static void __exit sec_battery_exit(void)
4294 platform_driver_unregister(&sec_battery_driver);
4297 late_initcall(sec_battery_init);
4298 module_exit(sec_battery_exit);
4300 MODULE_DESCRIPTION("Samsung Battery Driver");
4301 MODULE_AUTHOR("Samsung Electronics");
4302 MODULE_LICENSE("GPL");