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 (battery->charging_mode == SEC_BATTERY_CHARGING_ABS)) {
675 if ((battery->pdata->recharge_condition_type &
676 SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
677 (battery->voltage_now <=
679 dev_info(battery->dev,
680 "%s: Re-charging by VCELL in high swelling mode(%d)\n",
681 __func__, battery->voltage_now);
682 battery->swelling_block = false;
683 goto check_recharge_check_count;
686 } else if (battery->swelling_mode == SEC_BATTERY_LOW_SWELLING_MODE) {
687 if ((battery->charging_mode == SEC_BATTERY_CHARGING_NONE) ||
688 (battery->charging_mode == SEC_BATTERY_CHARGING_ABS)) {
689 if ((battery->pdata->recharge_condition_type &
690 SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
691 (battery->voltage_now <=
693 dev_info(battery->dev,
694 "%s: Re-charging by VCELL in low swelling mode(%d)\n",
695 __func__, battery->voltage_now);
696 battery->swelling_block = false;
697 goto check_recharge_check_count;
703 if ((battery->status == POWER_SUPPLY_STATUS_CHARGING) &&
704 (battery->pdata->full_condition_type &
705 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
706 (battery->charging_mode == SEC_BATTERY_CHARGING_NONE)) {
707 dev_info(battery->dev,
708 "%s: Re-charging by NOTIMEFULL (%d)\n",
709 __func__, battery->capacity);
710 goto check_recharge_check_count;
713 if (battery->status == POWER_SUPPLY_STATUS_FULL &&
714 battery->charging_mode == SEC_BATTERY_CHARGING_NONE) {
715 if ((battery->pdata->recharge_condition_type &
716 SEC_BATTERY_RECHARGE_CONDITION_SOC) &&
717 (battery->capacity <=
718 battery->pdata->recharge_condition_soc)) {
719 dev_info(battery->dev,
720 "%s: Re-charging by SOC (%d)\n",
721 __func__, battery->capacity);
722 goto check_recharge_check_count;
725 if ((battery->pdata->recharge_condition_type &
726 SEC_BATTERY_RECHARGE_CONDITION_AVGVCELL) &&
727 (battery->voltage_avg <=
728 battery->pdata->recharge_condition_avgvcell)) {
729 dev_info(battery->dev,
730 "%s: Re-charging by average VCELL (%d)\n",
731 __func__, battery->voltage_avg);
732 goto check_recharge_check_count;
734 if ((battery->pdata->recharge_condition_type &
735 SEC_BATTERY_RECHARGE_CONDITION_VCELL) &&
736 (battery->voltage_now <=
737 battery->pdata->recharge_condition_vcell)) {
738 dev_info(battery->dev,
739 "%s: Re-charging by VCELL (%d)\n",
740 __func__, battery->voltage_now);
741 goto check_recharge_check_count;
745 battery->recharge_check_cnt = 0;
748 check_recharge_check_count:
749 if (battery->recharge_check_cnt <
750 battery->pdata->recharge_check_count)
751 battery->recharge_check_cnt++;
752 dev_dbg(battery->dev,
753 "%s: recharge count = %d\n",
754 __func__, battery->recharge_check_cnt);
756 if (battery->recharge_check_cnt >=
757 battery->pdata->recharge_check_count)
763 static bool sec_bat_voltage_check(struct sec_battery_info *battery)
765 if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
766 dev_dbg(battery->dev,
767 "%s: Charging Disabled\n", __func__);
772 if (sec_bat_ovp_uvlo(battery)) {
773 if (battery->pdata->ovp_uvlo_result_callback)
775 ovp_uvlo_result_callback(battery->health);
779 /* Re-Charging check */
780 if (sec_bat_check_recharge(battery)) {
781 if (battery->pdata->full_check_type !=
782 SEC_BATTERY_FULLCHARGED_NONE)
783 battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
785 battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
786 battery->is_recharging = true;
787 sec_bat_set_charge(battery, true);
794 static bool sec_bat_get_temperature_by_adc(
795 struct sec_battery_info *battery,
796 enum power_supply_property psp,
797 union power_supply_propval *value)
805 const sec_bat_adc_table_data_t *temp_adc_table;
806 unsigned int temp_adc_table_size;
809 case POWER_SUPPLY_PROP_TEMP:
810 channel = SEC_BAT_ADC_CHANNEL_TEMP;
811 temp_adc_table = battery->pdata->temp_adc_table;
812 temp_adc_table_size =
813 battery->pdata->temp_adc_table_size;
815 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
816 channel = SEC_BAT_ADC_CHANNEL_TEMP_AMBIENT;
817 temp_adc_table = battery->pdata->temp_amb_adc_table;
818 temp_adc_table_size =
819 battery->pdata->temp_amb_adc_table_size;
822 dev_err(battery->dev,
823 "%s: Invalid Property\n", __func__);
827 temp_adc = sec_bat_get_adc_value(battery, channel);
832 case POWER_SUPPLY_PROP_TEMP:
833 battery->temp_adc = temp_adc;
835 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
836 battery->temp_ambient_adc = temp_adc;
839 dev_err(battery->dev,
840 "%s: Invalid Property\n", __func__);
844 if (temp_adc_table[0].adc >= temp_adc) {
845 temp = temp_adc_table[0].data;
846 goto temp_by_adc_goto;
847 } else if (temp_adc_table[temp_adc_table_size-1].adc <= temp_adc) {
848 temp = temp_adc_table[temp_adc_table_size-1].data;
849 goto temp_by_adc_goto;
852 high = temp_adc_table_size - 1;
854 while (low <= high) {
855 mid = (low + high) / 2;
856 if (temp_adc_table[mid].adc > temp_adc)
858 else if (temp_adc_table[mid].adc < temp_adc)
861 temp = temp_adc_table[mid].data;
862 goto temp_by_adc_goto;
866 temp = temp_adc_table[high].data;
867 temp += (((int)temp_adc_table[low].data - (int)temp_adc_table[high].data) *
868 ((int)temp_adc - (int)temp_adc_table[high].adc)) /
869 ((int)temp_adc_table[low].adc - (int)temp_adc_table[high].adc);
872 value->intval = temp;
874 dev_info(battery->dev,
875 "%s: Temp(%d), Temp-ADC(%d)\n",
876 __func__, temp, temp_adc);
881 static bool sec_bat_temperature(
882 struct sec_battery_info *battery)
887 if (battery->pdata->event_check && battery->event) {
888 battery->temp_high_threshold =
889 battery->pdata->temp_high_threshold_event;
890 battery->temp_high_recovery =
891 battery->pdata->temp_high_recovery_event;
892 battery->temp_low_recovery =
893 battery->pdata->temp_low_recovery_event;
894 battery->temp_low_threshold =
895 battery->pdata->temp_low_threshold_event;
896 } else if (battery->pdata->is_lpm && battery->pdata->is_lpm()) {
897 battery->temp_high_threshold =
898 battery->pdata->temp_high_threshold_lpm;
899 battery->temp_high_recovery =
900 battery->pdata->temp_high_recovery_lpm;
901 battery->temp_low_recovery =
902 battery->pdata->temp_low_recovery_lpm;
903 battery->temp_low_threshold =
904 battery->pdata->temp_low_threshold_lpm;
906 battery->temp_high_threshold =
907 battery->pdata->temp_high_threshold_normal;
908 battery->temp_high_recovery =
909 battery->pdata->temp_high_recovery_normal;
910 battery->temp_low_recovery =
911 battery->pdata->temp_low_recovery_normal;
912 battery->temp_low_threshold =
913 battery->pdata->temp_low_threshold_normal;
916 dev_info(battery->dev,
917 "%s: HT(%d), HR(%d), LT(%d), LR(%d)\n",
918 __func__, battery->temp_high_threshold,
919 battery->temp_high_recovery,
920 battery->temp_low_threshold,
921 battery->temp_low_recovery);
925 #if defined(CONFIG_BATTERY_SWELLING)
926 static void sec_bat_swelling_check(struct sec_battery_info *battery, int temperature)
928 union power_supply_propval val;
930 pr_info("%s: status(%d), swell_mode(%d), temp(%d), vnow(%d), block(%d)\n",
931 __func__, battery->status, battery->swelling_mode,
932 temperature, battery->voltage_now, battery->swelling_block);
935 * under voltage over voltage, battery missing */
936 if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
937 pr_info("%s: DISCHARGING. stop swelling mode\n", __func__);
938 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
939 battery->swelling_block = false;
940 if (battery->swelling_max_vbat == 4200) {
941 /* restore float voltage */
942 val.intval = battery->pdata->chg_float_voltage;
943 psy_do_property(battery->pdata->charger_name, set,
944 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
945 battery->swelling_max_vbat = val.intval;
947 goto skip_swelling_chek;
950 switch (battery->swelling_mode) {
951 case SEC_BATTERY_NORMAL_MODE:
952 if (temperature >= battery->swelling_temp_high_threshold) {
953 if (temperature >= battery->swelling_temp_dischg_threshold &&
954 battery->voltage_now > 4235) {
955 pr_info("%s: self discharge mode start.\n", __func__);
956 if ((battery->voltage_now > 4235) &&
957 (battery->swelling_block == false)) {
958 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
959 sec_bat_set_charge(battery, false);
960 battery->swelling_block = true;
963 battery->swelling_mode = SEC_BATTERY_DISCHG_MODE;
964 #if defined(CONFIG_BATTERY_DISCHG_IC)
965 /*enable discharge */
966 gpio_set_value(battery->pdata->dischg_test, 1);
967 pr_info ("%s: enable discharge\n", __func__);
970 pr_info("%s: high swelling mode start.\n", __func__);
971 if (battery->voltage_now < 4200) {
972 /* change to 4.20V 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;
977 } else if ((battery->voltage_now > 4235) &&
978 (battery->swelling_block == false)) {
979 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
980 sec_bat_set_charge(battery, false);
981 battery->swelling_block = true;
984 battery->swelling_mode = SEC_BATTERY_HIGH_SWELLING_MODE;
985 battery->swelling_full_check_cnt = 0;
987 } else if (temperature <= battery->swelling_temp_low_threshold) {
988 pr_info("%s: low swelling mode start.\n", __func__);
989 if (battery->voltage_now < 4200) {
990 /* change to 4.20V float voltage */
992 psy_do_property(battery->pdata->charger_name, set,
993 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
994 battery->swelling_max_vbat = val.intval;
995 } else if ((battery->voltage_now > 4235) &&
996 (battery->swelling_block == false)) {
997 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
998 sec_bat_set_charge(battery, false);
999 battery->swelling_block = true;
1002 battery->swelling_mode = SEC_BATTERY_LOW_SWELLING_MODE;
1003 battery->swelling_full_check_cnt = 0;
1006 case SEC_BATTERY_HIGH_SWELLING_MODE:
1007 if (temperature < battery->swelling_temp_high_recovery) {
1008 pr_info("%s: high swelling mode end.\n", __func__);
1010 /* restore float voltage */
1011 val.intval = battery->pdata->chg_float_voltage;
1012 psy_do_property(battery->pdata->charger_name, set,
1013 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1014 battery->swelling_max_vbat = val.intval;
1015 battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
1016 sec_bat_set_charge(battery, true);
1017 battery->swelling_block = false;
1019 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
1020 } else if (temperature >= battery->swelling_temp_high_recovery) {
1021 if (temperature >= battery->swelling_temp_dischg_threshold &&
1022 battery->voltage_now > 4235) {
1023 pr_info("%s: self discharge mode start.\n", __func__);
1024 if ((battery->voltage_now > 4235) &&
1025 (battery->swelling_block == false)) {
1026 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1027 sec_bat_set_charge(battery, false);
1028 battery->swelling_block = true;
1031 battery->swelling_mode = SEC_BATTERY_DISCHG_MODE;
1032 #if defined(CONFIG_BATTERY_DISCHG_IC)
1033 /*enable discharge */
1034 gpio_set_value(battery->pdata->dischg_test, 1);
1035 pr_info ("%s: enable discharge\n", __func__);
1038 if ((battery->voltage_now < 4200) &&
1039 (battery->swelling_max_vbat != 4200)) {
1040 /* change to 4.20V float voltage */
1042 psy_do_property(battery->pdata->charger_name, set,
1043 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1044 battery->swelling_max_vbat = val.intval;
1045 } else if ((battery->voltage_now > 4235) &&
1046 (battery->swelling_block == false)) {
1047 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1048 sec_bat_set_charge(battery, false);
1049 battery->swelling_block = true;
1051 pr_info("%s: high swelling mode. Vbatt(%d)\n",
1052 __func__, battery->voltage_now);
1056 case SEC_BATTERY_LOW_SWELLING_MODE:
1057 if (temperature > battery->swelling_temp_low_recovery) {
1058 pr_info("%s: low swelling mode end.\n", __func__);
1060 /* restore float voltage */
1061 val.intval = battery->pdata->chg_float_voltage;
1062 psy_do_property(battery->pdata->charger_name, set,
1063 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1064 battery->swelling_max_vbat = val.intval;
1065 battery->charging_mode = SEC_BATTERY_CHARGING_1ST;
1066 sec_bat_set_charge(battery, true);
1067 battery->swelling_block = false;
1069 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
1070 } else if (temperature <= battery->swelling_temp_low_recovery) {
1071 if ((battery->voltage_now < 4200) &&
1072 (battery->swelling_max_vbat != 4200)) {
1073 /* change to 4.20V float voltage */
1075 psy_do_property(battery->pdata->charger_name, set,
1076 POWER_SUPPLY_PROP_VOLTAGE_MAX, val);
1077 battery->swelling_max_vbat = val.intval;
1078 } else if ((battery->voltage_now > 4235) &&
1079 (battery->swelling_block == false)) {
1080 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1081 sec_bat_set_charge(battery, false);
1082 battery->swelling_block = true;
1084 /* change to 0.5C charging current */
1085 #if 0 /* Orbis charging current is under 0.5C, thus no need to set */
1087 psy_do_property(battery->pdata->charger_name, set,
1088 POWER_SUPPLY_PROP_CURRENT_AVG, val);
1090 pr_info("%s: low swelling mode. Vbatt(%d)\n",
1091 __func__, battery->voltage_now);
1094 case SEC_BATTERY_DISCHG_MODE:
1095 if (temperature >= battery->swelling_temp_dischg_recovery) {
1096 pr_info ("%s: continue discharging... temperature is still high\n", __func__);
1097 if (battery->voltage_now < 4230) {
1098 /* cancel discharge mode, move to swelling mode */
1099 battery->swelling_mode = SEC_BATTERY_HIGH_SWELLING_MODE;
1100 #if defined(CONFIG_BATTERY_DISCHG_IC)
1101 /*disable discharge */
1102 gpio_set_value(battery->pdata->dischg_test, 0);
1103 pr_info ("%s: disable discharge\n", __func__);
1106 } else if (temperature < battery->swelling_temp_dischg_recovery) {
1107 /* cancel discharge mode, move to swelling mode */
1108 battery->swelling_mode = SEC_BATTERY_HIGH_SWELLING_MODE;
1109 #if defined(CONFIG_BATTERY_DISCHG_IC)
1110 /*disable discharge */
1111 gpio_set_value(battery->pdata->dischg_test, 0);
1112 pr_info ("%s: disable discharge\n", __func__);
1115 pr_info("%s: the latest swelling mode[%d]\n", __func__, battery->swelling_mode);
1118 pr_err("%s: unknown swelling mode[%d]\n", __func__, battery->swelling_mode);
1122 dev_dbg(battery->dev, "%s end\n", __func__);
1126 static bool sec_bat_temperature_check(
1127 struct sec_battery_info *battery)
1130 bool health_changed;
1132 /* set health_changed true as default
1133 * this value will be changed after temperature check
1135 health_changed = true;
1137 if (battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
1138 dev_dbg(battery->dev,
1139 "%s: Charging Disabled\n", __func__);
1143 if (battery->health != POWER_SUPPLY_HEALTH_GOOD &&
1144 battery->health != POWER_SUPPLY_HEALTH_OVERHEAT &&
1145 battery->health != POWER_SUPPLY_HEALTH_COLD) {
1146 dev_dbg(battery->dev, "%s: No need to check\n", __func__);
1150 sec_bat_temperature(battery);
1152 switch (battery->pdata->temp_check_type) {
1153 case SEC_BATTERY_TEMP_CHECK_ADC:
1154 temp_value = battery->temp_adc;
1156 case SEC_BATTERY_TEMP_CHECK_TEMP:
1157 temp_value = battery->temperature;
1160 dev_err(battery->dev,
1161 "%s: Invalid Temp Check Type\n", __func__);
1165 if (temp_value >= battery->temp_high_threshold) {
1166 if (battery->health != POWER_SUPPLY_HEALTH_OVERHEAT) {
1167 if (battery->temp_high_cnt <
1168 battery->pdata->temp_check_count)
1169 battery->temp_high_cnt++;
1170 dev_dbg(battery->dev,
1171 "%s: high count = %d\n",
1172 __func__, battery->temp_high_cnt);
1174 } else if ((temp_value <= battery->temp_high_recovery) &&
1175 (temp_value >= battery->temp_low_recovery)) {
1176 if (battery->health == POWER_SUPPLY_HEALTH_OVERHEAT ||
1177 battery->health == POWER_SUPPLY_HEALTH_COLD) {
1178 if (battery->temp_recover_cnt <
1179 battery->pdata->temp_check_count)
1180 battery->temp_recover_cnt++;
1181 dev_dbg(battery->dev,
1182 "%s: recovery count = %d\n",
1183 __func__, battery->temp_recover_cnt);
1185 } else if (temp_value <= battery->temp_low_threshold) {
1186 if (battery->health != POWER_SUPPLY_HEALTH_COLD) {
1187 if (battery->temp_low_cnt <
1188 battery->pdata->temp_check_count)
1189 battery->temp_low_cnt++;
1190 dev_dbg(battery->dev,
1191 "%s: low count = %d\n",
1192 __func__, battery->temp_low_cnt);
1195 battery->temp_high_cnt = 0;
1196 battery->temp_low_cnt = 0;
1197 battery->temp_recover_cnt = 0;
1200 if (battery->temp_high_cnt >=
1201 battery->pdata->temp_check_count)
1202 battery->health = POWER_SUPPLY_HEALTH_OVERHEAT;
1203 else if (battery->temp_low_cnt >=
1204 battery->pdata->temp_check_count)
1205 battery->health = POWER_SUPPLY_HEALTH_COLD;
1206 else if (battery->temp_recover_cnt >=
1207 battery->pdata->temp_check_count)
1208 battery->health = POWER_SUPPLY_HEALTH_GOOD;
1210 health_changed = false;
1212 if (health_changed) {
1213 if ((battery->health == POWER_SUPPLY_HEALTH_OVERHEAT) ||
1214 (battery->health == POWER_SUPPLY_HEALTH_COLD)) {
1215 dev_info(battery->dev,
1216 "%s: Unsafe Temperature\n", __func__);
1217 battery->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1218 /* change charging current to battery (default 0mA) */
1219 sec_bat_set_charge(battery, false);
1221 dev_info(battery->dev,
1222 "%s: Safe Temperature\n", __func__);
1223 /* if recovered from not charging */
1224 if ((battery->health == POWER_SUPPLY_HEALTH_GOOD) &&
1226 POWER_SUPPLY_STATUS_NOT_CHARGING)) {
1227 if (battery->is_recharging)
1229 POWER_SUPPLY_STATUS_FULL;
1230 else /* Normal Charging */
1232 POWER_SUPPLY_STATUS_CHARGING;
1233 /* turn on charger by cable type */
1234 sec_bat_set_charge(battery, true);
1242 static void sec_bat_event_program_alarm(
1243 struct sec_battery_info *battery, int seconds)
1245 #if defined(ANDROID_ALARM_ACTIVATED)
1246 ktime_t low_interval = ktime_set(seconds - 10, 0);
1247 ktime_t slack = ktime_set(20, 0);
1250 next = ktime_add(battery->last_event_time, low_interval);
1252 alarm_start_range(&battery->event_termination_alarm,
1253 next, ktime_add(next, slack));
1255 alarm_start(&battery->event_termination_alarm,
1256 ktime_add(battery->last_event_time, ktime_set(seconds - 10, 0)));
1260 #if defined(ANDROID_ALARM_ACTIVATED)
1261 static void sec_bat_event_expired_timer_func(struct alarm *alarm)
1263 static enum alarmtimer_restart sec_bat_event_expired_timer_func(
1264 struct alarm *alarm, ktime_t now)
1267 struct sec_battery_info *battery =
1268 container_of(alarm, struct sec_battery_info,
1269 event_termination_alarm);
1271 battery->event &= (~battery->event_wait);
1272 dev_info(battery->dev,
1273 "%s: event expired (0x%x)\n", __func__, battery->event);
1275 #if !defined(ANDROID_ALARM_ACTIVATED)
1276 return ALARMTIMER_NORESTART;
1280 static void sec_bat_event_set(
1281 struct sec_battery_info *battery, int event, int enable)
1283 if (!battery->pdata->event_check)
1286 /* ignore duplicated deactivation of same event
1287 * only if the event is one last event
1289 if (!enable && (battery->event == battery->event_wait)) {
1290 dev_info(battery->dev,
1291 "%s: ignore duplicated deactivation of same event\n",
1296 alarm_cancel(&battery->event_termination_alarm);
1297 battery->event &= (~battery->event_wait);
1300 battery->event_wait = 0;
1301 battery->event |= event;
1303 dev_info(battery->dev,
1304 "%s: event set (0x%x)\n", __func__, battery->event);
1306 if (battery->event == 0) {
1307 dev_dbg(battery->dev,
1308 "%s: nothing to clear\n", __func__);
1309 return; /* nothing to clear */
1311 battery->event_wait = event;
1312 #if defined(ANDROID_ALARM_ACTIVATED)
1313 battery->last_event_time = alarm_get_elapsed_realtime();
1315 battery->last_event_time = ktime_get_boottime();
1317 sec_bat_event_program_alarm(battery,
1318 battery->pdata->event_waiting_time);
1319 dev_info(battery->dev,
1320 "%s: start timer (curr 0x%x, wait 0x%x)\n",
1321 __func__, battery->event, battery->event_wait);
1325 static bool sec_bat_check_fullcharged_condition(
1326 struct sec_battery_info *battery)
1328 int full_check_type;
1330 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
1331 full_check_type = battery->pdata->full_check_type;
1333 full_check_type = battery->pdata->full_check_type_2nd;
1335 switch (full_check_type) {
1336 case SEC_BATTERY_FULLCHARGED_ADC:
1337 case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
1338 case SEC_BATTERY_FULLCHARGED_SOC:
1339 case SEC_BATTERY_FULLCHARGED_CHGGPIO:
1340 case SEC_BATTERY_FULLCHARGED_CHGPSY:
1343 /* If these is NOT full check type or NONE full check type,
1344 * it is full-charged
1346 case SEC_BATTERY_FULLCHARGED_CHGINT:
1347 case SEC_BATTERY_FULLCHARGED_TIME:
1348 case SEC_BATTERY_FULLCHARGED_NONE:
1354 #if defined(CONFIG_BATTERY_SWELLING)
1355 if (battery->swelling_mode != SEC_BATTERY_NORMAL_MODE) {
1356 if (battery->pdata->full_condition_type &
1357 SEC_BATTERY_FULL_CONDITION_VCELL) {
1358 if (battery->voltage_now <
1360 dev_dbg(battery->dev,
1361 "%s: Not enough VCELL (%dmV)\n",
1362 __func__, battery->voltage_now);
1369 if (battery->pdata->full_condition_type &
1370 SEC_BATTERY_FULL_CONDITION_SOC) {
1371 if (battery->capacity <
1372 battery->pdata->full_condition_soc) {
1373 dev_dbg(battery->dev,
1374 "%s: Not enough SOC (%d%%)\n",
1375 __func__, battery->capacity);
1380 if (battery->pdata->full_condition_type &
1381 SEC_BATTERY_FULL_CONDITION_VCELL) {
1382 if (battery->voltage_now <
1383 battery->pdata->full_condition_vcell) {
1384 dev_dbg(battery->dev,
1385 "%s: Not enough VCELL (%dmV)\n",
1386 __func__, battery->voltage_now);
1391 if (battery->pdata->full_condition_type &
1392 SEC_BATTERY_FULL_CONDITION_AVGVCELL) {
1393 if (battery->voltage_avg <
1394 battery->pdata->full_condition_avgvcell) {
1395 dev_dbg(battery->dev,
1396 "%s: Not enough AVGVCELL (%dmV)\n",
1397 __func__, battery->voltage_avg);
1402 if (battery->pdata->full_condition_type &
1403 SEC_BATTERY_FULL_CONDITION_OCV) {
1404 if (battery->voltage_ocv <
1405 battery->pdata->full_condition_ocv) {
1406 dev_dbg(battery->dev,
1407 "%s: Not enough OCV (%dmV)\n",
1408 __func__, battery->voltage_ocv);
1416 static void sec_bat_do_test_function(
1417 struct sec_battery_info *battery)
1419 union power_supply_propval value;
1421 switch (battery->test_mode) {
1423 if (battery->status == POWER_SUPPLY_STATUS_CHARGING) {
1424 sec_bat_set_charge(battery, false);
1426 POWER_SUPPLY_STATUS_DISCHARGING;
1430 if(battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
1431 sec_bat_set_charge(battery, true);
1432 psy_do_property(battery->pdata->charger_name, get,
1433 POWER_SUPPLY_PROP_STATUS, value);
1434 battery->status = value.intval;
1436 battery->test_mode = 0;
1438 case 3: // clear temp block
1439 battery->health = POWER_SUPPLY_HEALTH_GOOD;
1440 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
1443 if(battery->status == POWER_SUPPLY_STATUS_DISCHARGING) {
1444 sec_bat_set_charge(battery, true);
1445 psy_do_property(battery->pdata->charger_name, get,
1446 POWER_SUPPLY_PROP_STATUS, value);
1447 battery->status = value.intval;
1451 pr_info("%s: error test: unknown state\n", __func__);
1456 static bool sec_bat_time_management(
1457 struct sec_battery_info *battery)
1459 unsigned long charging_time;
1461 #if defined(ANDROID_ALARM_ACTIVATED)
1462 ktime_t current_time;
1464 current_time = alarm_get_elapsed_realtime();
1465 ts = ktime_to_timespec(current_time);
1467 get_monotonic_boottime(&ts);
1470 if (battery->charging_start_time == 0) {
1471 dev_dbg(battery->dev,
1472 "%s: Charging Disabled\n", __func__);
1476 if (ts.tv_sec >= battery->charging_start_time)
1477 charging_time = ts.tv_sec - battery->charging_start_time;
1479 charging_time = 0xFFFFFFFF - battery->charging_start_time
1482 battery->charging_passed_time = charging_time;
1484 dev_dbg(battery->dev,
1485 "%s: Charging Time : %ld secs\n", __func__,
1486 battery->charging_passed_time);
1488 switch (battery->status) {
1489 case POWER_SUPPLY_STATUS_FULL:
1490 if (battery->is_recharging && (charging_time >
1491 battery->pdata->recharging_total_time)) {
1492 dev_info(battery->dev,
1493 "%s: Recharging Timer Expired\n", __func__);
1494 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1495 battery->is_recharging = false;
1496 if (sec_bat_set_charge(battery, false)) {
1497 dev_err(battery->dev,
1498 "%s: Fail to Set Charger\n", __func__);
1505 case POWER_SUPPLY_STATUS_CHARGING:
1506 if ((battery->pdata->full_condition_type &
1507 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) &&
1508 (battery->is_recharging && (charging_time >
1509 battery->pdata->recharging_total_time))) {
1510 dev_info(battery->dev,
1511 "%s: Recharging Timer Expired\n", __func__);
1512 if (battery->capacity >= 100)
1513 battery->status = POWER_SUPPLY_STATUS_FULL;
1514 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1515 battery->is_recharging = false;
1516 if (sec_bat_set_charge(battery, false)) {
1517 dev_err(battery->dev,
1518 "%s: Fail to Set Charger\n", __func__);
1522 } else if (!battery->is_recharging &&
1523 (charging_time > battery->pdata->charging_total_time)) {
1524 dev_info(battery->dev,
1525 "%s: Charging Timer Expired\n", __func__);
1526 if (battery->pdata->full_condition_type &
1527 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL) {
1528 if (battery->capacity >= 100)
1530 POWER_SUPPLY_STATUS_FULL;
1532 battery->status = POWER_SUPPLY_STATUS_FULL;
1533 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1534 if (sec_bat_set_charge(battery, false)) {
1535 dev_err(battery->dev,
1536 "%s: Fail to Set Charger\n", __func__);
1542 if (battery->pdata->charging_reset_time) {
1543 if (charging_time > battery->charging_next_time) {
1544 /*reset current in charging status */
1545 battery->charging_next_time =
1546 battery->charging_passed_time +
1547 (battery->pdata->charging_reset_time);
1549 dev_dbg(battery->dev,
1550 "%s: Reset charging current\n",
1552 if (sec_bat_set_charge(battery, true)) {
1553 dev_err(battery->dev,
1554 "%s: Fail to Set Charger\n",
1562 dev_err(battery->dev,
1563 "%s: Undefine Battery Status\n", __func__);
1570 static bool sec_bat_check_fullcharged(
1571 struct sec_battery_info *battery)
1573 union power_supply_propval value;
1575 int full_check_type;
1581 if (!sec_bat_check_fullcharged_condition(battery))
1582 goto not_full_charged;
1584 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
1585 full_check_type = battery->pdata->full_check_type;
1587 full_check_type = battery->pdata->full_check_type_2nd;
1589 pr_info("%s:full check type[%d], current_avg[%d]", __func__,
1590 full_check_type, battery->current_avg);
1591 switch (full_check_type) {
1592 case SEC_BATTERY_FULLCHARGED_ADC:
1594 sec_bat_get_adc_value(battery,
1595 SEC_BAT_ADC_CHANNEL_FULL_CHECK);
1597 dev_dbg(battery->dev,
1598 "%s: Current ADC (%d)\n",
1599 __func__, current_adc);
1601 if (current_adc < 0)
1603 battery->current_adc = current_adc;
1605 if (battery->current_adc <
1606 (battery->charging_mode ==
1607 SEC_BATTERY_CHARGING_1ST ?
1608 battery->pdata->charging_current[
1609 battery->cable_type].full_check_current_1st :
1610 battery->pdata->charging_current[
1611 battery->cable_type].full_check_current_2nd)) {
1612 battery->full_check_cnt++;
1613 dev_dbg(battery->dev,
1614 "%s: Full Check ADC (%d)\n",
1616 battery->full_check_cnt);
1618 battery->full_check_cnt = 0;
1621 case SEC_BATTERY_FULLCHARGED_FG_CURRENT:
1622 if ((battery->current_now > 20 && battery->current_now <
1623 battery->pdata->charging_current[
1624 battery->cable_type].full_check_current_1st) &&
1625 (battery->current_avg > 20 && battery->current_avg <
1626 (battery->charging_mode ==
1627 SEC_BATTERY_CHARGING_1ST ?
1628 battery->pdata->charging_current[
1629 battery->cable_type].full_check_current_1st :
1630 battery->pdata->charging_current[
1631 battery->cable_type].full_check_current_2nd))) {
1632 battery->full_check_cnt++;
1633 dev_info(battery->dev,
1634 "%s: Full Check Current (%d)\n",
1636 battery->full_check_cnt);
1638 battery->full_check_cnt = 0;
1641 case SEC_BATTERY_FULLCHARGED_TIME:
1642 if ((battery->charging_mode ==
1643 SEC_BATTERY_CHARGING_2ND ?
1644 (battery->charging_passed_time -
1645 battery->charging_fullcharged_time) :
1646 battery->charging_passed_time) >
1647 (battery->charging_mode ==
1648 SEC_BATTERY_CHARGING_1ST ?
1649 battery->pdata->charging_current[
1650 battery->cable_type].full_check_current_1st :
1651 battery->pdata->charging_current[
1652 battery->cable_type].full_check_current_2nd)) {
1653 battery->full_check_cnt++;
1654 dev_dbg(battery->dev,
1655 "%s: Full Check Time (%d)\n",
1657 battery->full_check_cnt);
1659 battery->full_check_cnt = 0;
1662 case SEC_BATTERY_FULLCHARGED_SOC:
1663 if (battery->capacity <=
1664 (battery->charging_mode ==
1665 SEC_BATTERY_CHARGING_1ST ?
1666 battery->pdata->charging_current[
1667 battery->cable_type].full_check_current_1st :
1668 battery->pdata->charging_current[
1669 battery->cable_type].full_check_current_2nd)) {
1670 battery->full_check_cnt++;
1671 dev_dbg(battery->dev,
1672 "%s: Full Check SOC (%d)\n",
1674 battery->full_check_cnt);
1676 battery->full_check_cnt = 0;
1679 case SEC_BATTERY_FULLCHARGED_CHGGPIO:
1681 battery->pdata->chg_gpio_full_check,
1684 dev_err(battery->dev,
1685 "%s: Error in Request of GPIO\n", __func__);
1688 if (!(gpio_get_value_cansleep(
1689 battery->pdata->chg_gpio_full_check) ^
1690 !battery->pdata->chg_polarity_full_check)) {
1691 battery->full_check_cnt++;
1692 dev_dbg(battery->dev,
1693 "%s: Full Check GPIO (%d)\n",
1694 __func__, battery->full_check_cnt);
1696 battery->full_check_cnt = 0;
1697 gpio_free(battery->pdata->chg_gpio_full_check);
1700 case SEC_BATTERY_FULLCHARGED_CHGINT:
1701 case SEC_BATTERY_FULLCHARGED_CHGPSY:
1703 psy_do_property(battery->pdata->charger_name, get,
1704 POWER_SUPPLY_PROP_STATUS, value);
1706 if (value.intval == POWER_SUPPLY_STATUS_FULL) {
1707 battery->full_check_cnt++;
1708 dev_info(battery->dev,
1709 "%s: Full Check Charger (%d)\n",
1710 __func__, battery->full_check_cnt);
1712 battery->full_check_cnt = 0;
1717 /* If these is NOT full check type or NONE full check type,
1718 * it is full-charged
1720 case SEC_BATTERY_FULLCHARGED_NONE:
1721 battery->full_check_cnt = 0;
1725 dev_err(battery->dev,
1726 "%s: Invalid Full Check\n", __func__);
1730 if (battery->full_check_cnt >=
1731 battery->pdata->full_check_count) {
1732 battery->full_check_cnt = 0;
1740 static void sec_bat_do_fullcharged(
1741 struct sec_battery_info *battery)
1743 union power_supply_propval value;
1745 #if defined(CONFIG_BATTERY_SWELLING)
1746 if (battery->swelling_mode != SEC_BATTERY_NORMAL_MODE) {
1747 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1748 battery->is_recharging = false;
1749 sec_bat_set_charge(battery, false);
1750 battery->swelling_block = true;
1751 pr_info("%s: stop charging (full) in swelling mode[%d]",
1752 __func__, battery->swelling_mode);
1756 /* To let charger/fuel gauge know the full status,
1757 * set status before calling sec_bat_set_charge()
1759 battery->status = POWER_SUPPLY_STATUS_FULL;
1761 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST) {
1762 battery->charging_mode = SEC_BATTERY_CHARGING_2ND;
1763 battery->charging_fullcharged_time =
1764 battery->charging_passed_time;
1765 sec_bat_set_charge(battery, true);
1767 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
1768 battery->is_recharging = false;
1769 sec_bat_set_charge(battery, false);
1771 value.intval = POWER_SUPPLY_STATUS_FULL;
1772 psy_do_property(battery->pdata->fuelgauge_name, set,
1773 POWER_SUPPLY_PROP_STATUS, value);
1776 /* platform can NOT get information of battery
1777 * because wakeup time is too short to check uevent
1778 * To make sure that target is wakeup if full-charged,
1779 * activated wake lock in a few seconds
1781 if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
1782 wake_lock_timeout(&battery->vbus_wake_lock, HZ * 10);
1785 static bool sec_bat_fullcharged_check(
1786 struct sec_battery_info *battery)
1788 if ((battery->charging_mode == SEC_BATTERY_CHARGING_NONE) ||
1789 (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING)) {
1790 dev_dbg(battery->dev,
1791 "%s: No Need to Check Full-Charged\n", __func__);
1795 if (sec_bat_check_fullcharged(battery))
1796 sec_bat_do_fullcharged(battery);
1798 dev_info(battery->dev,
1799 "%s: Charging Mode : %s\n", __func__,
1800 battery->is_recharging ?
1801 sec_bat_charging_mode_str[SEC_BATTERY_CHARGING_RECHARGING] :
1802 sec_bat_charging_mode_str[battery->charging_mode]);
1807 #if defined(CONFIG_TOUCHSCREEN_IST30XXA)
1811 static void sec_bat_get_battery_info(
1812 struct sec_battery_info *battery)
1814 union power_supply_propval value;
1816 psy_do_property(battery->pdata->fuelgauge_name, get,
1817 POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
1818 battery->voltage_now = value.intval;
1820 value.intval = SEC_BATTEY_VOLTAGE_AVERAGE;
1821 psy_do_property(battery->pdata->fuelgauge_name, get,
1822 POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
1823 battery->voltage_avg = value.intval;
1825 value.intval = SEC_BATTEY_VOLTAGE_OCV;
1826 psy_do_property(battery->pdata->fuelgauge_name, get,
1827 POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
1828 battery->voltage_ocv = value.intval;
1830 value.intval = SEC_BATTEY_CURRENT_MA;
1831 psy_do_property(battery->pdata->fuelgauge_name, get,
1832 POWER_SUPPLY_PROP_CURRENT_NOW, value);
1833 battery->current_now = value.intval;
1835 value.intval = SEC_BATTEY_CURRENT_MA;
1836 psy_do_property(battery->pdata->fuelgauge_name, get,
1837 POWER_SUPPLY_PROP_CURRENT_AVG, value);
1838 battery->current_avg = value.intval;
1840 /* input current limit in charger */
1841 psy_do_property(battery->pdata->charger_name, get,
1842 POWER_SUPPLY_PROP_CURRENT_MAX, value);
1843 battery->current_max = value.intval;
1845 /* To get SOC value (NOT raw SOC), need to reset value */
1847 psy_do_property(battery->pdata->fuelgauge_name, get,
1848 POWER_SUPPLY_PROP_CAPACITY, value);
1849 battery->capacity = value.intval;
1850 #if defined(CONFIG_MACH_CORSICA_VE)
1851 if (get_hw_rev() < 0x2) {
1852 dev_info(battery->dev,
1853 "%s: get_hw_rev (%d)\n",
1854 __func__, get_hw_rev());
1855 battery->capacity = 50;
1856 battery->voltage_ocv = 4000;
1857 battery->voltage_avg = 4000;
1858 battery->voltage_now = 4000;
1862 switch (battery->pdata->thermal_source) {
1863 case SEC_BATTERY_THERMAL_SOURCE_FG:
1864 psy_do_property(battery->pdata->fuelgauge_name, get,
1865 POWER_SUPPLY_PROP_TEMP, value);
1866 battery->temperature = value.intval;
1868 psy_do_property(battery->pdata->fuelgauge_name, get,
1869 POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
1870 battery->temper_amb = value.intval;
1872 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
1873 if (battery->pdata->get_temperature_callback) {
1874 battery->pdata->get_temperature_callback(
1875 POWER_SUPPLY_PROP_TEMP, &value);
1876 battery->temperature = value.intval;
1877 psy_do_property(battery->pdata->fuelgauge_name, set,
1878 POWER_SUPPLY_PROP_TEMP, value);
1880 battery->pdata->get_temperature_callback(
1881 POWER_SUPPLY_PROP_TEMP_AMBIENT, &value);
1882 battery->temper_amb = value.intval;
1883 psy_do_property(battery->pdata->fuelgauge_name, set,
1884 POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
1887 case SEC_BATTERY_THERMAL_SOURCE_ADC:
1888 sec_bat_get_temperature_by_adc(battery,
1889 POWER_SUPPLY_PROP_TEMP, &value);
1890 battery->temperature = value.intval;
1891 psy_do_property(battery->pdata->fuelgauge_name, set,
1892 POWER_SUPPLY_PROP_TEMP, value);
1894 sec_bat_get_temperature_by_adc(battery,
1895 POWER_SUPPLY_PROP_TEMP_AMBIENT, &value);
1896 battery->temper_amb = value.intval;
1897 psy_do_property(battery->pdata->fuelgauge_name, set,
1898 POWER_SUPPLY_PROP_TEMP_AMBIENT, value);
1904 #if defined(CONFIG_TOUCHSCREEN_IST30XXA)
1905 battery_temp = battery->temperature;
1908 dev_info(battery->dev,
1909 "%s:Vnow(%dmV),Inow(%dmA),Imax(%dmA),SOC(%d%%),Tbat(%d)\n",
1911 battery->voltage_now, battery->current_now,
1912 battery->current_max, battery->capacity, battery->temperature);
1913 dev_dbg(battery->dev,
1914 "%s,Vavg(%dmV),Vocv(%dmV),Tamb(%d),"
1915 "Iavg(%dmA),Iadc(%d)\n",
1916 battery->present ? "Connected" : "Disconnected",
1917 battery->voltage_avg, battery->voltage_ocv,
1918 battery->temper_amb,
1919 battery->current_avg, battery->current_adc);
1922 static void sec_bat_polling_work(struct work_struct *work)
1924 struct sec_battery_info *battery = container_of(
1925 work, struct sec_battery_info, polling_work.work);
1927 wake_lock(&battery->monitor_wake_lock);
1928 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
1929 dev_dbg(battery->dev, "%s: Activated\n", __func__);
1932 static void sec_bat_program_alarm(
1933 struct sec_battery_info *battery, int seconds)
1935 #if defined(ANDROID_ALARM_ACTIVATED)
1936 ktime_t low_interval = ktime_set(seconds, 0);
1937 ktime_t slack = ktime_set(10, 0);
1940 next = ktime_add(battery->last_poll_time, low_interval);
1941 alarm_start_range(&battery->polling_alarm,
1942 next, ktime_add(next, slack));
1944 alarm_start(&battery->polling_alarm,
1945 ktime_add(battery->last_poll_time, ktime_set(seconds, 0)));
1950 static unsigned int sec_bat_get_polling_time(
1951 struct sec_battery_info *battery)
1953 if (battery->status ==
1954 POWER_SUPPLY_STATUS_FULL)
1955 battery->polling_time =
1956 battery->pdata->polling_time[
1957 POWER_SUPPLY_STATUS_CHARGING];
1959 battery->polling_time =
1960 battery->pdata->polling_time[
1963 battery->polling_short = true;
1965 switch (battery->status) {
1966 case POWER_SUPPLY_STATUS_CHARGING:
1967 if (battery->polling_in_sleep)
1968 battery->polling_short = false;
1970 case POWER_SUPPLY_STATUS_DISCHARGING:
1971 if (battery->polling_in_sleep)
1972 battery->polling_time =
1973 battery->pdata->polling_time[
1974 SEC_BATTERY_POLLING_TIME_SLEEP];
1976 battery->polling_time =
1977 battery->pdata->polling_time[
1979 battery->polling_short = false;
1981 case POWER_SUPPLY_STATUS_FULL:
1982 if (battery->polling_in_sleep) {
1983 if (!(battery->pdata->full_condition_type &
1984 SEC_BATTERY_FULL_CONDITION_NOSLEEPINFULL) &&
1985 battery->charging_mode ==
1986 SEC_BATTERY_CHARGING_NONE)
1987 battery->polling_time =
1988 battery->pdata->polling_time[
1989 SEC_BATTERY_POLLING_TIME_SLEEP];
1990 battery->polling_short = false;
1992 if (battery->charging_mode ==
1993 SEC_BATTERY_CHARGING_NONE)
1994 battery->polling_short = false;
1999 if (battery->polling_short)
2000 return battery->pdata->polling_time[
2001 SEC_BATTERY_POLLING_TIME_BASIC];
2003 return battery->polling_time;
2006 static bool sec_bat_is_short_polling(
2007 struct sec_battery_info *battery)
2009 /* Change the full and short monitoring sequence
2010 * Originally, full monitoring was the last time of polling_count
2011 * But change full monitoring to first time
2012 * because temperature check is too late
2014 if (!battery->polling_short || battery->polling_count == 1)
2020 static void sec_bat_update_polling_count(
2021 struct sec_battery_info *battery)
2023 /* do NOT change polling count in sleep
2024 * even though it is short polling
2025 * to keep polling count along sleep/wakeup
2027 if (battery->polling_short && battery->polling_in_sleep)
2030 if (battery->polling_short &&
2031 ((battery->polling_time /
2032 battery->pdata->polling_time[
2033 SEC_BATTERY_POLLING_TIME_BASIC])
2034 > battery->polling_count))
2035 battery->polling_count++;
2037 battery->polling_count = 1; /* initial value = 1 */
2040 static void sec_bat_set_polling(
2041 struct sec_battery_info *battery)
2043 unsigned int polling_time_temp;
2045 dev_dbg(battery->dev, "%s: Start\n", __func__);
2047 polling_time_temp = sec_bat_get_polling_time(battery);
2049 dev_dbg(battery->dev,
2050 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
2051 __func__, sec_bat_status_str[battery->status],
2052 battery->polling_in_sleep ? "Yes" : "No",
2053 (battery->charging_mode ==
2054 SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
2055 battery->polling_short ? "Yes" : "No");
2056 dev_dbg(battery->dev,
2057 "%s: Polling time %d/%d sec.\n", __func__,
2058 battery->polling_short ?
2059 (polling_time_temp * battery->polling_count) :
2060 polling_time_temp, battery->polling_time);
2062 /* To sync with log above,
2063 * change polling count after log is displayed
2064 * Do NOT update polling count in initial monitor
2066 if (!battery->pdata->monitor_initial_count)
2067 sec_bat_update_polling_count(battery);
2069 dev_dbg(battery->dev,
2070 "%s: Initial monitor %d times left.\n", __func__,
2071 battery->pdata->monitor_initial_count);
2073 switch (battery->pdata->polling_type) {
2074 case SEC_BATTERY_MONITOR_WORKQUEUE:
2075 if (battery->pdata->monitor_initial_count) {
2076 battery->pdata->monitor_initial_count--;
2077 schedule_delayed_work(&battery->polling_work, HZ);
2079 schedule_delayed_work(&battery->polling_work,
2080 polling_time_temp * HZ);
2082 case SEC_BATTERY_MONITOR_ALARM:
2083 #if defined(ANDROID_ALARM_ACTIVATED)
2084 battery->last_poll_time = alarm_get_elapsed_realtime();
2086 battery->last_poll_time = ktime_get_boottime();
2089 if (battery->pdata->monitor_initial_count) {
2090 battery->pdata->monitor_initial_count--;
2091 sec_bat_program_alarm(battery, 1);
2093 sec_bat_program_alarm(battery, polling_time_temp);
2095 case SEC_BATTERY_MONITOR_TIMER:
2100 dev_dbg(battery->dev, "%s: End\n", __func__);
2103 static void sec_bat_monitor_work(
2104 struct work_struct *work)
2106 struct sec_battery_info *battery =
2107 container_of(work, struct sec_battery_info,
2110 dev_dbg(battery->dev, "%s: Start\n", __func__);
2112 /*#if !defined(ANDROID_ALARM_ACTIVATED)
2113 alarm_cancel(&battery->polling_alarm);
2114 #endif *//* ANDROID_ALARM_ACTIVATED */
2116 /* monitor once after wakeup */
2117 if (battery->polling_in_sleep)
2118 battery->polling_in_sleep = false;
2120 sec_bat_get_battery_info(battery);
2123 if (battery->test_mode) {
2124 dev_dbg(battery->dev, "%s: Test Mode\n", __func__);
2125 sec_bat_do_test_function(battery);
2126 if (battery->test_mode != 0)
2127 goto continue_monitor;
2130 /* 1. battery check */
2131 if (!sec_bat_battery_cable_check(battery))
2132 goto continue_monitor;
2134 /* 2. voltage check */
2135 if (!sec_bat_voltage_check(battery))
2136 goto continue_monitor;
2138 /* monitor short routine in initial monitor */
2139 if (battery->pdata->monitor_initial_count ||
2140 sec_bat_is_short_polling(battery))
2141 goto continue_monitor;
2143 /* 3. time management */
2144 if (!sec_bat_time_management(battery))
2145 goto continue_monitor;
2147 /* 4. temperature check */
2148 if (!sec_bat_temperature_check(battery))
2149 goto continue_monitor;
2151 #if defined(CONFIG_BATTERY_SWELLING)
2152 sec_bat_swelling_check(battery, battery->temperature);
2155 /* 5. full charging check */
2156 sec_bat_fullcharged_check(battery);
2158 /* 6. additional check */
2159 if (battery->pdata->monitor_additional_check)
2160 battery->pdata->monitor_additional_check();
2163 dev_info(battery->dev,
2164 "%s: Status(%s), mode(%s), Health(%s), Cable(%d), siop_level(%d)\n",
2166 sec_bat_status_str[battery->status],
2167 sec_bat_charging_mode_str[battery->charging_mode],
2168 sec_bat_health_str[battery->health],
2169 battery->cable_type, battery->siop_level);
2171 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
2172 dev_info(battery->dev,
2173 "%s: battery->stability_test(%d), battery->eng_not_full_status(%d)\n",
2174 __func__, battery->stability_test, battery->eng_not_full_status);
2176 power_supply_changed(&battery->psy_bat);
2178 sec_bat_set_polling(battery);
2180 if (battery->capacity <= 0)
2181 wake_lock_timeout(&battery->monitor_wake_lock, HZ * 5);
2183 wake_unlock(&battery->monitor_wake_lock);
2185 dev_dbg(battery->dev, "%s: End\n", __func__);
2190 #if defined(ANDROID_ALARM_ACTIVATED)
2191 static void sec_bat_alarm(struct alarm *alarm)
2193 static enum alarmtimer_restart sec_bat_alarm(
2194 struct alarm *alarm, ktime_t now)
2198 struct sec_battery_info *battery = container_of(alarm,
2199 struct sec_battery_info, polling_alarm);
2201 dev_dbg(battery->dev,
2204 /* In wake up, monitor work will be queued in complete function
2205 * To avoid duplicated queuing of monitor work,
2206 * do NOT queue monitor work in wake up by polling alarm
2208 if (!battery->polling_in_sleep) {
2209 wake_lock(&battery->monitor_wake_lock);
2210 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
2211 dev_dbg(battery->dev, "%s: Activated\n", __func__);
2213 #if !defined(ANDROID_ALARM_ACTIVATED)
2214 return ALARMTIMER_NORESTART;
2219 static void sec_bat_cable_work(struct work_struct *work)
2221 struct sec_battery_info *battery = container_of(work,
2222 struct sec_battery_info, cable_work);
2223 union power_supply_propval val;
2224 int wl_cur, wr_cur, current_cable_type;
2226 dev_info(battery->dev, "%s: Start\n", __func__);
2228 wl_cur = battery->pdata->charging_current[
2229 POWER_SUPPLY_TYPE_WIRELESS].input_current_limit;
2230 wr_cur = battery->pdata->charging_current[
2231 battery->wire_status].input_current_limit;
2232 if (battery->wc_status && battery->wc_enable &&
2234 current_cable_type = POWER_SUPPLY_TYPE_WIRELESS;
2236 current_cable_type = battery->wire_status;
2238 if (current_cable_type == battery->cable_type) {
2239 dev_info(battery->dev,
2240 "%s: Cable is NOT Changed(%d)\n",
2241 __func__, battery->cable_type);
2242 /* Do NOT activate cable work for NOT changed */
2243 goto end_of_cable_work;
2246 battery->cable_type = current_cable_type;
2247 if (battery->pdata->check_cable_result_callback)
2248 battery->pdata->check_cable_result_callback(
2249 battery->cable_type);
2250 /* platform can NOT get information of cable connection
2251 * because wakeup time is too short to check uevent
2252 * To make sure that target is wakeup
2253 * if cable is connected and disconnected,
2254 * activated wake lock in a few seconds
2256 wake_lock_timeout(&battery->vbus_wake_lock, HZ * 10);
2258 if (battery->cable_type == POWER_SUPPLY_TYPE_BATTERY ||
2259 ((battery->pdata->cable_check_type &
2260 SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE) &&
2261 battery->cable_type == POWER_SUPPLY_TYPE_UNKNOWN)) {
2262 if (battery->status == POWER_SUPPLY_STATUS_FULL) {
2263 val.intval = POWER_SUPPLY_TYPE_BATTERY;
2264 psy_do_property(battery->pdata->fuelgauge_name, set,
2265 POWER_SUPPLY_PROP_CHARGE_FULL, val);
2266 /* To get SOC value (NOT raw SOC), need to reset value */
2268 psy_do_property(battery->pdata->fuelgauge_name, get,
2269 POWER_SUPPLY_PROP_CAPACITY, val);
2270 battery->capacity = val.intval;
2272 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
2273 battery->is_recharging = false;
2274 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
2275 battery->health = POWER_SUPPLY_HEALTH_GOOD;
2277 if (sec_bat_set_charge(battery, false))
2278 goto end_of_cable_work;
2280 /* Do NOT display the charging icon when OTG is enabled */
2281 if (battery->cable_type == POWER_SUPPLY_TYPE_OTG) {
2282 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
2283 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
2285 if (battery->pdata->full_check_type !=
2286 SEC_BATTERY_FULLCHARGED_NONE)
2287 battery->charging_mode =
2288 SEC_BATTERY_CHARGING_1ST;
2290 battery->charging_mode =
2291 SEC_BATTERY_CHARGING_2ND;
2292 battery->status = POWER_SUPPLY_STATUS_CHARGING;
2295 if (sec_bat_set_charge(battery, true))
2296 goto end_of_cable_work;
2298 #if defined(ANDROID_ALARM_ACTIVATED)
2299 /* No need for wakelock in Alarm */
2300 if (battery->pdata->polling_type != SEC_BATTERY_MONITOR_ALARM)
2301 wake_lock(&battery->vbus_wake_lock);
2305 /* polling time should be reset when cable is changed
2306 * polling_in_sleep should be reset also
2307 * before polling time is re-calculated
2308 * to prevent from counting 1 for events
2309 * right after cable is connected
2311 battery->polling_in_sleep = false;
2312 sec_bat_get_polling_time(battery);
2314 dev_info(battery->dev,
2315 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
2316 __func__, sec_bat_status_str[battery->status],
2317 battery->polling_in_sleep ? "Yes" : "No",
2318 (battery->charging_mode ==
2319 SEC_BATTERY_CHARGING_NONE) ? "No" : "Yes",
2320 battery->polling_short ? "Yes" : "No");
2321 dev_info(battery->dev,
2322 "%s: Polling time is reset to %d sec.\n", __func__,
2323 battery->polling_time);
2325 battery->polling_count = 1; /* initial value = 1 */
2327 wake_lock(&battery->monitor_wake_lock);
2328 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work,
2329 msecs_to_jiffies(500));
2330 power_supply_changed(&battery->psy_bat);
2332 wake_unlock(&battery->cable_wake_lock);
2333 dev_dbg(battery->dev, "%s: End\n", __func__);
2336 ssize_t sec_bat_show_attrs(struct device *dev,
2337 struct device_attribute *attr, char *buf)
2339 struct power_supply *psy = dev_get_drvdata(dev);
2340 struct sec_battery_info *battery =
2341 container_of(psy, struct sec_battery_info, psy_bat);
2342 const ptrdiff_t offset = attr - sec_battery_attrs;
2343 union power_supply_propval value;
2347 case BATT_RESET_SOC:
2349 case BATT_READ_RAW_SOC:
2351 union power_supply_propval value;
2354 SEC_FUELGAUGE_CAPACITY_TYPE_RAW;
2355 psy_do_property(battery->pdata->fuelgauge_name, get,
2356 POWER_SUPPLY_PROP_CAPACITY, value);
2358 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2362 case BATT_READ_ADJ_SOC:
2365 i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
2366 battery->pdata->vendor);
2369 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2370 battery->voltage_ocv);
2374 case BATT_VOL_ADC_CAL:
2378 case BATT_VOL_ADC_AVER:
2381 case BATT_CURRENT_UA_NOW:
2383 union power_supply_propval value;
2385 value.intval = SEC_BATTEY_CURRENT_UA;
2386 psy_do_property(battery->pdata->fuelgauge_name, get,
2387 POWER_SUPPLY_PROP_CURRENT_NOW, value);
2389 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2393 case BATT_CURRENT_UA_AVG:
2395 union power_supply_propval value;
2397 value.intval = SEC_BATTEY_CURRENT_UA;
2398 psy_do_property(battery->pdata->fuelgauge_name, get,
2399 POWER_SUPPLY_PROP_CURRENT_AVG, value);
2401 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2407 switch (battery->pdata->thermal_source) {
2408 case SEC_BATTERY_THERMAL_SOURCE_FG:
2409 psy_do_property(battery->pdata->fuelgauge_name, get,
2410 POWER_SUPPLY_PROP_TEMP, value);
2412 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK:
2413 if (battery->pdata->get_temperature_callback) {
2414 battery->pdata->get_temperature_callback(
2415 POWER_SUPPLY_PROP_TEMP, &value);
2418 case SEC_BATTERY_THERMAL_SOURCE_ADC:
2419 sec_bat_get_temperature_by_adc(battery,
2420 POWER_SUPPLY_PROP_TEMP, &value);
2425 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2429 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2432 case BATT_TEMP_AVER:
2434 case BATT_TEMP_ADC_AVER:
2438 case BATT_SLATE_MODE:
2439 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2440 battery->slate_mode);
2443 case BATT_LP_CHARGING:
2444 if (battery->pdata->is_lpm) {
2445 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2446 battery->pdata->is_lpm() ? 1 : 0);
2449 case SIOP_ACTIVATED:
2452 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2453 battery->siop_level);
2455 case BATT_CHARGING_SOURCE:
2456 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2457 battery->cable_type);
2465 union power_supply_propval value;
2468 SEC_BATTEY_CAPACITY_DESIGNED;
2469 psy_do_property(battery->pdata->fuelgauge_name, get,
2470 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2472 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
2476 SEC_BATTEY_CAPACITY_ABSOLUTE;
2477 psy_do_property(battery->pdata->fuelgauge_name, get,
2478 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2480 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
2484 SEC_BATTEY_CAPACITY_TEMPERARY;
2485 psy_do_property(battery->pdata->fuelgauge_name, get,
2486 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2488 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x ",
2492 SEC_BATTEY_CAPACITY_CURRENT;
2493 psy_do_property(battery->pdata->fuelgauge_name, get,
2494 POWER_SUPPLY_PROP_ENERGY_NOW, value);
2496 i += scnprintf(buf + i, PAGE_SIZE - i, "0x%04x\n",
2502 case CHG_CURRENT_ADC:
2503 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2504 battery->current_adc);
2509 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2510 (battery->cable_type == POWER_SUPPLY_TYPE_WIRELESS));
2513 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2514 battery->wc_enable);
2517 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2518 battery->factory_mode);
2523 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2524 battery->test_mode);
2527 case BATT_EVENT_CALL:
2528 case BATT_EVENT_2G_CALL:
2529 case BATT_EVENT_TALK_GSM:
2530 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2531 (battery->event & EVENT_2G_CALL) ? 1 : 0);
2533 case BATT_EVENT_3G_CALL:
2534 case BATT_EVENT_TALK_WCDMA:
2535 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2536 (battery->event & EVENT_3G_CALL) ? 1 : 0);
2538 case BATT_EVENT_MUSIC:
2539 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2540 (battery->event & EVENT_MUSIC) ? 1 : 0);
2542 case BATT_EVENT_VIDEO:
2543 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2544 (battery->event & EVENT_VIDEO) ? 1 : 0);
2546 case BATT_EVENT_BROWSER:
2547 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2548 (battery->event & EVENT_BROWSER) ? 1 : 0);
2550 case BATT_EVENT_HOTSPOT:
2551 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2552 (battery->event & EVENT_HOTSPOT) ? 1 : 0);
2554 case BATT_EVENT_CAMERA:
2555 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2556 (battery->event & EVENT_CAMERA) ? 1 : 0);
2558 case BATT_EVENT_CAMCORDER:
2559 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2560 (battery->event & EVENT_CAMCORDER) ? 1 : 0);
2562 case BATT_EVENT_DATA_CALL:
2563 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2564 (battery->event & EVENT_DATA_CALL) ? 1 : 0);
2566 case BATT_EVENT_WIFI:
2567 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2568 (battery->event & EVENT_WIFI) ? 1 : 0);
2570 case BATT_EVENT_WIBRO:
2571 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2572 (battery->event & EVENT_WIBRO) ? 1 : 0);
2574 case BATT_EVENT_LTE:
2575 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2576 (battery->event & EVENT_LTE) ? 1 : 0);
2578 case BATT_EVENT_LCD:
2579 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2580 (battery->event & EVENT_LCD) ? 1 : 0);
2582 case BATT_EVENT_GPS:
2583 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2584 (battery->event & EVENT_GPS) ? 1 : 0);
2587 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2590 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
2591 case BATT_TEST_CHARGE_CURRENT:
2593 union power_supply_propval value;
2595 psy_do_property(battery->pdata->charger_name, get,
2596 POWER_SUPPLY_PROP_CURRENT_NOW, value);
2597 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2601 case BATT_STABILITY_TEST:
2602 i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
2603 battery->stability_test);
2613 ssize_t sec_bat_store_attrs(
2615 struct device_attribute *attr,
2616 const char *buf, size_t count)
2618 struct power_supply *psy = dev_get_drvdata(dev);
2619 struct sec_battery_info *battery =
2620 container_of(psy, struct sec_battery_info, psy_bat);
2621 const ptrdiff_t offset = attr - sec_battery_attrs;
2626 case BATT_RESET_SOC:
2627 /* Do NOT reset fuel gauge in charging mode */
2628 if (battery->pdata->check_cable_callback &&
2629 battery->pdata->check_jig_status) {
2630 if ((battery->pdata->check_cable_callback(battery) ==
2631 POWER_SUPPLY_TYPE_BATTERY) ||
2632 battery->pdata->check_jig_status()) {
2633 union power_supply_propval value;
2634 battery->voltage_now = 1234;
2635 battery->voltage_avg = 1234;
2636 power_supply_changed(&battery->psy_bat);
2639 SEC_FUELGAUGE_CAPACITY_TYPE_RESET;
2640 psy_do_property(battery->pdata->fuelgauge_name, set,
2641 POWER_SUPPLY_PROP_CAPACITY, value);
2642 dev_info(battery->dev,"do reset SOC\n");
2643 /* update battery info */
2644 sec_bat_get_battery_info(battery);
2649 case BATT_READ_RAW_SOC:
2651 case BATT_READ_ADJ_SOC:
2659 case BATT_VOL_ADC_CAL:
2663 case BATT_VOL_ADC_AVER:
2665 case BATT_CURRENT_UA_NOW:
2667 case BATT_CURRENT_UA_AVG:
2673 case BATT_TEMP_AVER:
2675 case BATT_TEMP_ADC_AVER:
2679 case BATT_SLATE_MODE:
2680 if (sscanf(buf, "%d\n", &x) == 1) {
2681 union power_supply_propval value;
2683 value.intval = POWER_SUPPLY_TYPE_BATTERY;
2684 battery->slate_mode = true;
2685 } else if (x == 0) {
2686 value.intval = POWER_SUPPLY_TYPE_USB;
2687 battery->slate_mode = false;
2689 dev_info(battery->dev,
2690 "%s: SLATE MODE unknown command\n",
2694 psy_do_property("battery", set,
2695 POWER_SUPPLY_PROP_ONLINE, value);
2696 if (battery->slate_mode) {
2698 psy_do_property(battery->pdata->charger_name, set,
2699 POWER_SUPPLY_PROP_CURRENT_NOW,
2706 case BATT_LP_CHARGING:
2708 case SIOP_ACTIVATED:
2711 if (sscanf(buf, "%d\n", &x) == 1) {
2712 union power_supply_propval value;
2713 dev_info(battery->dev,
2714 "%s: siop level: %d\n", __func__, x);
2715 if (x >= 0 && x <= 100)
2716 battery->siop_level = x;
2718 battery->siop_level = 100;
2719 value.intval = battery->siop_level;
2720 psy_do_property(battery->pdata->charger_name, set,
2721 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, value);
2725 case BATT_CHARGING_SOURCE:
2735 case CHG_CURRENT_ADC:
2742 if (sscanf(buf, "%d\n", &x) == 1) {
2744 battery->wc_enable = false;
2745 } else if (x == 1) {
2746 battery->wc_enable = true;
2748 dev_info(battery->dev,
2749 "%s: WPC ENABLE unknown command\n",
2753 wake_lock(&battery->cable_wake_lock);
2754 queue_work(battery->monitor_wqueue,
2755 &battery->cable_work);
2760 if (sscanf(buf, "%d\n", &x) == 1) {
2761 battery->factory_mode = x ? true : false;
2766 if (sscanf(buf, "%d\n", &x) == 1) {
2767 /* update battery info */
2768 sec_bat_get_battery_info(battery);
2773 if (sscanf(buf, "%d\n", &x) == 1) {
2774 battery->test_mode = x;
2775 wake_lock(&battery->monitor_wake_lock);
2776 queue_delayed_work(battery->monitor_wqueue,
2777 &battery->monitor_work, 0);
2782 case BATT_EVENT_CALL:
2783 case BATT_EVENT_2G_CALL:
2784 case BATT_EVENT_TALK_GSM:
2785 if (sscanf(buf, "%d\n", &x) == 1) {
2786 sec_bat_event_set(battery, EVENT_2G_CALL, x);
2790 case BATT_EVENT_3G_CALL:
2791 case BATT_EVENT_TALK_WCDMA:
2792 if (sscanf(buf, "%d\n", &x) == 1) {
2793 sec_bat_event_set(battery, EVENT_3G_CALL, x);
2797 case BATT_EVENT_MUSIC:
2798 if (sscanf(buf, "%d\n", &x) == 1) {
2799 sec_bat_event_set(battery, EVENT_MUSIC, x);
2803 case BATT_EVENT_VIDEO:
2804 if (sscanf(buf, "%d\n", &x) == 1) {
2805 sec_bat_event_set(battery, EVENT_VIDEO, x);
2809 case BATT_EVENT_BROWSER:
2810 if (sscanf(buf, "%d\n", &x) == 1) {
2811 sec_bat_event_set(battery, EVENT_BROWSER, x);
2815 case BATT_EVENT_HOTSPOT:
2816 if (sscanf(buf, "%d\n", &x) == 1) {
2817 sec_bat_event_set(battery, EVENT_HOTSPOT, x);
2821 case BATT_EVENT_CAMERA:
2822 if (sscanf(buf, "%d\n", &x) == 1) {
2823 sec_bat_event_set(battery, EVENT_CAMERA, x);
2827 case BATT_EVENT_CAMCORDER:
2828 if (sscanf(buf, "%d\n", &x) == 1) {
2829 sec_bat_event_set(battery, EVENT_CAMCORDER, x);
2833 case BATT_EVENT_DATA_CALL:
2834 if (sscanf(buf, "%d\n", &x) == 1) {
2835 sec_bat_event_set(battery, EVENT_DATA_CALL, x);
2839 case BATT_EVENT_WIFI:
2840 if (sscanf(buf, "%d\n", &x) == 1) {
2841 sec_bat_event_set(battery, EVENT_WIFI, x);
2845 case BATT_EVENT_WIBRO:
2846 if (sscanf(buf, "%d\n", &x) == 1) {
2847 sec_bat_event_set(battery, EVENT_WIBRO, x);
2851 case BATT_EVENT_LTE:
2852 if (sscanf(buf, "%d\n", &x) == 1) {
2853 sec_bat_event_set(battery, EVENT_LTE, x);
2857 case BATT_EVENT_LCD:
2858 if (sscanf(buf, "%d\n", &x) == 1) {
2860 sec_bat_event_set(battery, EVENT_LCD, x);
2865 case BATT_EVENT_GPS:
2866 if (sscanf(buf, "%d\n", &x) == 1) {
2867 sec_bat_event_set(battery, EVENT_GPS, x);
2871 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
2872 case BATT_TEST_CHARGE_CURRENT:
2873 if (sscanf(buf, "%d\n", &x) == 1) {
2874 if (x >= 0 && x <= 2000) {
2875 union power_supply_propval value;
2876 dev_err(battery->dev,
2877 "%s: BATT_TEST_CHARGE_CURRENT(%d)\n", __func__, x);
2878 battery->pdata->charging_current[
2879 POWER_SUPPLY_TYPE_USB].input_current_limit = x;
2880 battery->pdata->charging_current[
2881 POWER_SUPPLY_TYPE_USB].fast_charging_current = x;
2883 battery->eng_not_full_status = true;
2884 battery->pdata->temp_check_type =
2885 SEC_BATTERY_TEMP_CHECK_NONE;
2886 battery->pdata->charging_total_time =
2889 if (battery->cable_type == POWER_SUPPLY_TYPE_USB) {
2891 psy_do_property(battery->pdata->charger_name, set,
2892 POWER_SUPPLY_PROP_CURRENT_NOW,
2899 case BATT_STABILITY_TEST:
2900 if (sscanf(buf, "%d\n", &x) == 1) {
2901 union power_supply_propval value;
2902 dev_err(battery->dev,
2903 "%s: BATT_STABILITY_TEST(%d)\n", __func__, x);
2905 battery->stability_test = true;
2906 battery->eng_not_full_status = true;
2907 value.intval = POWER_SUPPLY_TYPE_WIRELESS;
2908 psy_do_property(battery->pdata->charger_name, set,
2909 POWER_SUPPLY_PROP_CHARGE_TYPE, value);
2910 psy_do_property("battery", set,
2911 POWER_SUPPLY_PROP_ONLINE, value);
2914 battery->stability_test = false;
2915 value.intval = POWER_SUPPLY_TYPE_MAINS;
2916 psy_do_property(battery->pdata->charger_name, set,
2917 POWER_SUPPLY_PROP_CHARGE_TYPE, value);
2929 static int sec_bat_create_attrs(struct device *dev)
2933 for (i = 0; i < ARRAY_SIZE(sec_battery_attrs); i++) {
2934 rc = device_create_file(dev, &sec_battery_attrs[i]);
2936 goto create_attrs_failed;
2938 goto create_attrs_succeed;
2940 create_attrs_failed:
2942 device_remove_file(dev, &sec_battery_attrs[i]);
2943 create_attrs_succeed:
2947 static int sec_bat_set_property(struct power_supply *psy,
2948 enum power_supply_property psp,
2949 const union power_supply_propval *val)
2951 struct sec_battery_info *battery =
2952 container_of(psy, struct sec_battery_info, psy_bat);
2953 int current_cable_type;
2954 int full_check_type;
2955 union power_supply_propval value;
2957 dev_dbg(battery->dev,
2958 "%s: (%d,%d)\n", __func__, psp, val->intval);
2961 case POWER_SUPPLY_PROP_STATUS:
2962 if (battery->charging_mode == SEC_BATTERY_CHARGING_1ST)
2963 full_check_type = battery->pdata->full_check_type;
2965 full_check_type = battery->pdata->full_check_type_2nd;
2966 if ((full_check_type == SEC_BATTERY_FULLCHARGED_CHGINT) &&
2967 (val->intval == POWER_SUPPLY_STATUS_FULL))
2968 sec_bat_do_fullcharged(battery);
2969 battery->status = val->intval;
2971 case POWER_SUPPLY_PROP_HEALTH:
2972 sec_bat_ovp_uvlo_result(battery, val->intval);
2974 case POWER_SUPPLY_PROP_ONLINE:
2975 current_cable_type = val->intval;
2977 if (current_cable_type < 0) {
2978 dev_info(battery->dev,
2979 "%s: ignore event(%d)\n",
2980 __func__, current_cable_type);
2981 } else if (current_cable_type == POWER_SUPPLY_TYPE_OTG) {
2982 value.intval = current_cable_type;
2983 psy_do_property(battery->pdata->charger_name, set,
2984 POWER_SUPPLY_PROP_ONLINE, value);
2985 wake_lock(&battery->monitor_wake_lock);
2986 queue_delayed_work(battery->monitor_wqueue,
2987 &battery->monitor_work, 0);
2991 } else if (current_cable_type == POWER_SUPPLY_TYPE_WIRELESS) {
2992 battery->wc_status = true;
2993 } else if (current_cable_type == POWER_SUPPLY_TYPE_WIRELESS_REMOVE) {
2994 battery->wc_status = false;
2995 if (battery->wire_status != POWER_SUPPLY_TYPE_BATTERY)
2996 current_cable_type = battery->wire_status;
2999 battery->wire_status = current_cable_type;
3000 if ((battery->wire_status == POWER_SUPPLY_TYPE_BATTERY)
3001 && battery->wc_status)
3002 current_cable_type = POWER_SUPPLY_TYPE_WIRELESS;
3004 if (current_cable_type == POWER_SUPPLY_TYPE_BATTERY) {
3005 wake_lock(&battery->cable_wake_lock);
3006 value.intval = current_cable_type;
3007 psy_do_property(battery->pdata->charger_name,
3008 set,POWER_SUPPLY_PROP_ONLINE, value);
3009 queue_work(battery->monitor_wqueue,
3010 &battery->cable_work);
3013 dev_info(battery->dev,
3014 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
3015 __func__, current_cable_type, battery->wc_status,
3016 battery->wire_status);
3018 /* cable is attached or detached
3019 * if current_cable_type is minus value,
3020 * check cable by sec_bat_get_cable_type()
3021 * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
3022 * (0 is POWER_SUPPLY_TYPE_UNKNOWN)
3024 if ((current_cable_type >= 0) &&
3025 (current_cable_type <= SEC_SIZEOF_POWER_SUPPLY_TYPE) &&
3026 (battery->pdata->cable_source_type &
3027 SEC_BATTERY_CABLE_SOURCE_EXTERNAL ||
3028 battery->pdata->cable_source_type &
3029 SEC_BATTERY_CABLE_SOURCE_EXTENDED)) {
3031 wake_lock(&battery->cable_wake_lock);
3032 queue_work(battery->monitor_wqueue,
3033 &battery->cable_work);
3035 if (sec_bat_get_cable_type(battery,
3036 battery->pdata->cable_source_type)) {
3037 wake_lock(&battery->cable_wake_lock);
3038 queue_work(battery->monitor_wqueue,
3039 &battery->cable_work);
3043 case POWER_SUPPLY_PROP_CAPACITY:
3044 battery->capacity = val->intval;
3045 power_supply_changed(&battery->psy_bat);
3047 case POWER_SUPPLY_PROP_PRESENT:
3048 cancel_delayed_work(&battery->monitor_work);
3049 wake_lock(&battery->monitor_wake_lock);
3050 queue_delayed_work_on(0, battery->monitor_wqueue,
3051 &battery->monitor_work, 0);
3060 static int sec_bat_get_property(struct power_supply *psy,
3061 enum power_supply_property psp,
3062 union power_supply_propval *val)
3064 struct sec_battery_info *battery =
3065 container_of(psy, struct sec_battery_info, psy_bat);
3066 union power_supply_propval value;
3069 case POWER_SUPPLY_PROP_STATUS:
3070 if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
3071 (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
3072 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
3074 if ((battery->pdata->cable_check_type &
3075 SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE) &&
3076 (battery->pdata->is_lpm &&
3077 !battery->pdata->is_lpm())) {
3078 switch (battery->cable_type) {
3079 case POWER_SUPPLY_TYPE_USB:
3080 case POWER_SUPPLY_TYPE_USB_DCP:
3081 case POWER_SUPPLY_TYPE_USB_CDP:
3082 case POWER_SUPPLY_TYPE_USB_ACA:
3084 POWER_SUPPLY_STATUS_DISCHARGING;
3088 val->intval = battery->status;
3091 case POWER_SUPPLY_PROP_CHARGE_TYPE:
3092 psy_do_property(battery->pdata->charger_name, get,
3093 POWER_SUPPLY_PROP_CHARGE_TYPE, value);
3094 if (value.intval == POWER_SUPPLY_CHARGE_TYPE_UNKNOWN)
3095 /* if error in CHARGE_TYPE of charger
3096 * set CHARGE_TYPE as NONE
3098 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
3100 val->intval = value.intval;
3102 case POWER_SUPPLY_PROP_HEALTH:
3103 val->intval = battery->health;
3105 case POWER_SUPPLY_PROP_PRESENT:
3106 val->intval = battery->present;
3108 case POWER_SUPPLY_PROP_ONLINE:
3109 val->intval = battery->cable_type;
3111 case POWER_SUPPLY_PROP_TECHNOLOGY:
3112 val->intval = battery->pdata->technology;
3114 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
3115 if (battery->pdata->check_jig_status) {
3116 psy_do_property(battery->pdata->fuelgauge_name, get,
3117 POWER_SUPPLY_PROP_VOLTAGE_NOW, value);
3118 battery->voltage_now = value.intval;
3119 dev_err(battery->dev,
3120 "%s: voltage now(%d)\n", __func__, battery->voltage_now);
3122 /* voltage value should be in uV */
3123 val->intval = battery->voltage_now * 1000;
3125 case POWER_SUPPLY_PROP_VOLTAGE_AVG:
3126 #ifdef CONFIG_SEC_FACTORY
3127 value.intval = SEC_BATTEY_VOLTAGE_AVERAGE;
3128 psy_do_property(battery->pdata->fuelgauge_name, get,
3129 POWER_SUPPLY_PROP_VOLTAGE_AVG, value);
3130 battery->voltage_avg = value.intval;
3131 dev_err(battery->dev,
3132 "%s: voltage avg(%d)\n", __func__, battery->voltage_avg);
3134 /* voltage value should be in uV */
3135 val->intval = battery->voltage_avg * 1000;
3137 case POWER_SUPPLY_PROP_CURRENT_NOW:
3138 val->intval = battery->current_now;
3140 case POWER_SUPPLY_PROP_CURRENT_AVG:
3141 val->intval = battery->current_avg;
3143 /* charging mode (differ from power supply) */
3144 case POWER_SUPPLY_PROP_CHARGE_NOW:
3145 val->intval = battery->charging_mode;
3147 case POWER_SUPPLY_PROP_CAPACITY:
3148 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
3149 if (battery->status == POWER_SUPPLY_STATUS_FULL) {
3150 if(battery->eng_not_full_status == true)
3151 val->intval = battery->capacity;
3155 val->intval = battery->capacity;
3158 /* In full-charged status, SOC is always 100% */
3159 if (battery->status == POWER_SUPPLY_STATUS_FULL)
3162 val->intval = battery->capacity;
3165 case POWER_SUPPLY_PROP_TEMP:
3166 val->intval = battery->temperature;
3168 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
3169 val->intval = battery->temper_amb;
3177 static int sec_usb_get_property(struct power_supply *psy,
3178 enum power_supply_property psp,
3179 union power_supply_propval *val)
3181 struct sec_battery_info *battery =
3182 container_of(psy, struct sec_battery_info, psy_usb);
3184 if (psp != POWER_SUPPLY_PROP_ONLINE)
3187 if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
3188 (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
3192 /* Set enable=1 only if the USB charger is connected */
3193 switch (battery->wire_status) {
3194 case POWER_SUPPLY_TYPE_USB:
3195 case POWER_SUPPLY_TYPE_USB_DCP:
3196 case POWER_SUPPLY_TYPE_USB_CDP:
3197 case POWER_SUPPLY_TYPE_USB_ACA:
3198 case POWER_SUPPLY_TYPE_MHL_USB:
3209 static int sec_ac_get_property(struct power_supply *psy,
3210 enum power_supply_property psp,
3211 union power_supply_propval *val)
3213 struct sec_battery_info *battery =
3214 container_of(psy, struct sec_battery_info, psy_ac);
3216 if (psp != POWER_SUPPLY_PROP_ONLINE)
3219 if ((battery->health == POWER_SUPPLY_HEALTH_OVERVOLTAGE) ||
3220 (battery->health == POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
3225 /* Set enable=1 only if the AC charger is connected */
3226 switch (battery->cable_type) {
3227 case POWER_SUPPLY_TYPE_MAINS:
3228 case POWER_SUPPLY_TYPE_HV_MAINS:
3229 case POWER_SUPPLY_TYPE_MISC:
3230 case POWER_SUPPLY_TYPE_CARDOCK:
3231 case POWER_SUPPLY_TYPE_UARTOFF:
3232 case POWER_SUPPLY_TYPE_LAN_HUB:
3233 case POWER_SUPPLY_TYPE_UNKNOWN:
3234 case POWER_SUPPLY_TYPE_MHL_500:
3235 case POWER_SUPPLY_TYPE_MHL_900:
3236 case POWER_SUPPLY_TYPE_MHL_1500:
3237 case POWER_SUPPLY_TYPE_SMART_OTG:
3238 case POWER_SUPPLY_TYPE_SMART_NOTG:
3249 static int sec_wireless_get_property(struct power_supply *psy,
3250 enum power_supply_property psp,
3251 union power_supply_propval *val)
3253 struct sec_battery_info *battery =
3254 container_of(psy, struct sec_battery_info, psy_wireless);
3256 if (psp != POWER_SUPPLY_PROP_ONLINE)
3259 if (battery->wc_status)
3267 static int sec_wireless_set_property(struct power_supply *psy,
3268 enum power_supply_property psp,
3269 const union power_supply_propval *val)
3271 struct sec_battery_info *battery =
3272 container_of(psy, struct sec_battery_info, psy_wireless);
3274 if (psp != POWER_SUPPLY_PROP_ONLINE)
3277 battery->wc_status = val->intval;
3279 wake_lock(&battery->cable_wake_lock);
3280 queue_work(battery->monitor_wqueue, &battery->cable_work);
3285 static int sec_ps_set_property(struct power_supply *psy,
3286 enum power_supply_property psp,
3287 const union power_supply_propval *val)
3289 struct sec_battery_info *battery =
3290 container_of(psy, struct sec_battery_info, psy_ps);
3291 union power_supply_propval value;
3294 case POWER_SUPPLY_PROP_STATUS:
3295 if ((val->intval == 0) || (val->intval ==1)) {
3296 battery->ps_enable = val->intval;
3297 dev_info(battery->dev,
3298 "%s: power sharing cable set (%d)\n", __func__, battery->ps_enable);
3299 value.intval = POWER_SUPPLY_TYPE_POWER_SHARING;
3300 psy_do_property(battery->pdata->charger_name, set,
3301 POWER_SUPPLY_PROP_ONLINE, value);
3303 dev_err(battery->dev,
3304 "%s: invalid setting (%d)\n", __func__, val->intval);
3307 case POWER_SUPPLY_PROP_ONLINE:
3308 if (val->intval == POWER_SUPPLY_TYPE_POWER_SHARING) {
3309 battery->ps_status = true;
3310 dev_info(battery->dev,
3311 "%s: power sharing cable plugin (%d)\n", __func__, battery->ps_status);
3312 wake_lock(&battery->monitor_wake_lock);
3313 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3315 battery->ps_status = false;
3316 dev_info(battery->dev,
3317 "%s: power sharing cable plugout (%d)\n", __func__, battery->ps_status);
3318 wake_lock(&battery->monitor_wake_lock);
3319 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3329 static int sec_ps_get_property(struct power_supply *psy,
3330 enum power_supply_property psp,
3331 union power_supply_propval *val)
3333 struct sec_battery_info *battery =
3334 container_of(psy, struct sec_battery_info, psy_ps);
3337 case POWER_SUPPLY_PROP_STATUS:
3338 if (battery->ps_enable)
3343 case POWER_SUPPLY_PROP_ONLINE:
3344 if (battery->ps_status)
3358 static irqreturn_t sec_bat_irq_thread(int irq, void *irq_data)
3360 struct sec_battery_info *battery = irq_data;
3362 dev_info(battery->dev, "%s:(bat_irq occured_start\n", __func__);
3364 if (battery->pdata->cable_check_type &
3365 SEC_BATTERY_CABLE_CHECK_INT) {
3366 if (battery->pdata->is_interrupt_cable_check_possible &&
3367 !battery->pdata->is_interrupt_cable_check_possible(
3368 battery->extended_cable_type))
3369 goto no_cable_check;
3371 if (sec_bat_get_cable_type(battery,
3372 battery->pdata->cable_source_type)) {
3373 wake_lock(&battery->cable_wake_lock);
3374 queue_work(battery->monitor_wqueue,
3375 &battery->cable_work);
3381 if (battery->pdata->battery_check_type ==
3382 SEC_BATTERY_CHECK_INT) {
3383 if (battery_pdata->check_battery_callback)
3384 battery->present = battery->pdata->check_battery_callback();
3386 wake_lock(&battery->monitor_wake_lock);
3387 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3394 #if defined(CONFIG_MUIC_NOTIFIER)
3395 static int sec_bat_cable_check(struct sec_battery_info *battery,
3396 muic_attached_dev_t attached_dev)
3398 int current_cable_type = POWER_SUPPLY_TYPE_UNKNOWN;
3400 pr_info("[%s]ATTACHED(%d)\n", __func__, attached_dev);
3402 switch (attached_dev)
3404 case ATTACHED_DEV_JIG_UART_OFF_MUIC:
3405 case ATTACHED_DEV_SMARTDOCK_MUIC:
3406 current_cable_type = POWER_SUPPLY_TYPE_BATTERY;
3408 case ATTACHED_DEV_OTG_MUIC:
3409 current_cable_type = POWER_SUPPLY_TYPE_OTG;
3411 case ATTACHED_DEV_USB_MUIC:
3412 case ATTACHED_DEV_JIG_USB_OFF_MUIC:
3413 case ATTACHED_DEV_JIG_USB_ON_MUIC:
3414 case ATTACHED_DEV_SMARTDOCK_USB_MUIC:
3415 current_cable_type = POWER_SUPPLY_TYPE_USB;
3417 case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC:
3418 current_cable_type = POWER_SUPPLY_TYPE_UARTOFF;
3420 case ATTACHED_DEV_TA_MUIC:
3421 case ATTACHED_DEV_CARDOCK_MUIC:
3422 case ATTACHED_DEV_DESKDOCK_MUIC:
3423 case ATTACHED_DEV_SMARTDOCK_TA_MUIC:
3424 current_cable_type = POWER_SUPPLY_TYPE_MAINS;
3426 case ATTACHED_DEV_CDP_MUIC:
3427 current_cable_type = POWER_SUPPLY_TYPE_USB_CDP;
3429 case ATTACHED_DEV_HV_MUIC:
3430 current_cable_type = POWER_SUPPLY_TYPE_HV_MAINS;
3433 pr_err("%s: invalid type for charger:%d\n",
3434 __func__, attached_dev);
3437 return current_cable_type;
3441 static int batt_handle_notification(struct notifier_block *nb,
3442 unsigned long action, void *data)
3444 muic_attached_dev_t attached_dev = *(muic_attached_dev_t *)data;
3447 struct sec_battery_info *battery =
3448 container_of(nb, struct sec_battery_info,
3452 case MUIC_NOTIFY_CMD_DETACH:
3453 case MUIC_NOTIFY_CMD_LOGICALLY_DETACH:
3455 cable_type = POWER_SUPPLY_TYPE_BATTERY;
3457 case MUIC_NOTIFY_CMD_ATTACH:
3458 case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH:
3460 cable_type = sec_bat_cable_check(battery, attached_dev);
3464 cable_type = POWER_SUPPLY_TYPE_UNKNOWN;
3468 if (cable_type < 0) {
3469 dev_info(battery->dev, "%s: ignore event(%d)\n",
3470 __func__, cable_type);
3471 } else if (cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) {
3472 battery->ps_status = true;
3473 dev_info(battery->dev,
3474 "%s: power sharing cable plugin (%d)\n", __func__, battery->ps_status);
3475 } else if (cable_type == POWER_SUPPLY_TYPE_WIRELESS) {
3476 battery->wc_status = true;
3478 } else if (cable_type == POWER_SUPPLY_TYPE_WIRELESS_REMOVE) {
3479 battery->wc_status = false;
3480 if (battery->wire_status != POWER_SUPPLY_TYPE_BATTERY)
3481 cable_type = battery->wire_status;
3484 battery->wire_status = cable_type;
3485 if ((battery->wire_status == POWER_SUPPLY_TYPE_BATTERY)
3486 && battery->wc_status && !battery->ps_status)
3487 cable_type = POWER_SUPPLY_TYPE_WIRELESS;
3489 dev_info(battery->dev,
3490 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
3491 __func__, cable_type, battery->wc_status,
3492 battery->wire_status);
3494 if ((cable_type >= 0) &&
3495 cable_type <= SEC_SIZEOF_POWER_SUPPLY_TYPE) {
3496 if (cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) {
3497 wake_lock(&battery->monitor_wake_lock);
3498 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3499 } else if((cable_type == POWER_SUPPLY_TYPE_BATTERY)
3500 && battery->ps_status) {
3501 battery->ps_status = false;
3502 dev_info(battery->dev,
3503 "%s: power sharing cable plugout (%d)\n", __func__, battery->ps_status);
3504 wake_lock(&battery->monitor_wake_lock);
3505 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
3506 } else if(cable_type != battery->cable_type) {
3507 wake_lock(&battery->cable_wake_lock);
3508 queue_work(battery->monitor_wqueue, &battery->cable_work);
3510 dev_info(battery->dev,
3511 "%s: Cable is Not Changed(%d)\n",
3512 __func__, battery->cable_type);
3516 pr_info("%s: CMD=%s, attached_dev=%d\n", __func__, cmd, attached_dev);
3520 #endif /* CONFIG_MUIC_NOTIFIER */
3523 static int sec_bat_parse_dt(struct device *dev,
3524 struct sec_battery_info *battery)
3526 struct device_node *np = dev->of_node;
3527 sec_battery_platform_data_t *pdata = battery->pdata;
3533 pr_info("%s: np NULL\n", __func__);
3537 ret = of_property_read_string(np,
3538 "battery,vendor", (char const **)&pdata->vendor);
3540 pr_info("%s: Vendor is Empty\n", __func__);
3542 ret = of_property_read_string(np,
3543 "battery,charger_name", (char const **)&pdata->charger_name);
3545 pr_info("%s: Vendor is Empty\n", __func__);
3547 ret = of_property_read_string(np,
3548 "battery,fuelgauge_name", (char const **)&pdata->fuelgauge_name);
3550 pr_info("%s: Vendor is Empty\n", __func__);
3552 ret = of_property_read_string(np,
3553 "battery,chip_vendor", (char const **)&pdata->chip_vendor);
3555 pr_info("%s: Vendor is Empty\n", __func__);
3557 ret = of_property_read_u32(np, "battery,technology",
3558 &pdata->technology);
3560 ret = of_property_read_u32(np, "battery,battery_check_type",
3561 &pdata->battery_check_type);
3563 p = of_get_property(np, "battery,polling_time", &len);
3565 len = len / sizeof(u32);
3567 pdata->polling_time = kzalloc(sizeof(*pdata->polling_time) * len, GFP_KERNEL);
3569 ret = of_property_read_u32_array(np, "battery,polling_time",
3570 pdata->polling_time, len);
3572 p = of_get_property(np, "battery,temp_table_adc", &len);
3574 len = len / sizeof(u32);
3576 pdata->temp_adc_table_size = len;
3577 pdata->temp_amb_adc_table_size = len;
3579 pdata->temp_adc_table = kzalloc(sizeof(sec_bat_adc_table_data_t) *
3580 pdata->temp_adc_table_size, GFP_KERNEL);
3581 pdata->temp_amb_adc_table = kzalloc(sizeof(sec_bat_adc_table_data_t) *
3582 pdata->temp_adc_table_size, GFP_KERNEL);
3584 for(i = 0; i < pdata->temp_adc_table_size; i++) {
3585 ret = of_property_read_u32_index(np, "battery,temp_table_adc", i,
3586 &pdata->temp_adc_table[i].adc);
3587 ret = of_property_read_u32_index(np, "battery,temp_table_data", i,
3588 &pdata->temp_adc_table[i].data);
3589 ret = of_property_read_u32_index(np, "battery,temp_table_adc", i,
3590 &pdata->temp_amb_adc_table[i].adc);
3591 ret = of_property_read_u32_index(np, "battery,temp_table_data", i,
3592 &pdata->temp_amb_adc_table[i].data);
3595 p = of_get_property(np, "battery,input_current_limit", &len);
3597 len = len / sizeof(u32);
3599 pdata->charging_current = kzalloc(sizeof(sec_charging_current_t) * len,
3602 for(i = 0; i < len; i++) {
3603 ret = of_property_read_u32_index(np,
3604 "battery,input_current_limit", i,
3605 &pdata->charging_current[i].input_current_limit);
3606 ret = of_property_read_u32_index(np,
3607 "battery,fast_charging_current", i,
3608 &pdata->charging_current[i].fast_charging_current);
3609 ret = of_property_read_u32_index(np,
3610 "battery,full_check_current_1st", i,
3611 &pdata->charging_current[i].full_check_current_1st);
3612 ret = of_property_read_u32_index(np,
3613 "battery,full_check_current_2nd", i,
3614 &pdata->charging_current[i].full_check_current_2nd);
3617 ret = of_property_read_u32(np, "battery,adc_check_count",
3618 &pdata->adc_check_count);
3620 ret = of_property_read_u32(np, "battery,temp_adc_type",
3621 &pdata->temp_adc_type);
3623 ret = of_property_read_u32(np, "battery,cable_check_type",
3624 &pdata->cable_check_type);
3626 ret = of_property_read_u32(np, "battery,cable_source_type",
3627 &pdata->cable_source_type);
3629 ret = of_property_read_u32(np, "battery,event_waiting_time",
3630 &pdata->event_waiting_time);
3632 ret = of_property_read_u32(np, "battery,polling_type",
3633 &pdata->polling_type);
3635 ret = of_property_read_u32(np, "battery,monitor_initial_count",
3636 &pdata->monitor_initial_count);
3638 ret = of_property_read_u32(np, "battery,check_count",
3639 &pdata->check_count);
3641 ret = of_property_read_u32(np, "battery,check_adc_max",
3642 &pdata->check_adc_max);
3644 ret = of_property_read_u32(np, "battery,check_adc_min",
3645 &pdata->check_adc_min);
3647 ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type",
3648 &pdata->ovp_uvlo_check_type);
3650 ret = of_property_read_u32(np, "battery,thermal_source",
3651 &pdata->thermal_source);
3653 ret = of_property_read_u32(np, "battery,temp_check_type",
3654 &pdata->temp_check_type);
3656 ret = of_property_read_u32(np, "battery,temp_check_count",
3657 &pdata->temp_check_count);
3659 ret = of_property_read_u32(np, "battery,temp_high_threshold_event",
3660 &pdata->temp_high_threshold_event);
3662 ret = of_property_read_u32(np, "battery,temp_high_recovery_event",
3663 &pdata->temp_high_recovery_event);
3665 ret = of_property_read_u32(np, "battery,temp_low_threshold_event",
3666 &pdata->temp_low_threshold_event);
3668 ret = of_property_read_u32(np, "battery,temp_low_recovery_event",
3669 &pdata->temp_low_recovery_event);
3671 ret = of_property_read_u32(np, "battery,temp_high_threshold_event",
3672 &pdata->temp_high_threshold_normal);
3674 ret = of_property_read_u32(np, "battery,temp_high_recovery_event",
3675 &pdata->temp_high_recovery_normal);
3677 ret = of_property_read_u32(np, "battery,temp_low_threshold_event",
3678 &pdata->temp_low_threshold_normal);
3680 ret = of_property_read_u32(np, "battery,temp_low_recovery_event",
3681 &pdata->temp_low_recovery_normal);
3683 ret = of_property_read_u32(np, "battery,temp_high_threshold_event",
3684 &pdata->temp_high_threshold_lpm);
3686 ret = of_property_read_u32(np, "battery,temp_high_recovery_event",
3687 &pdata->temp_high_recovery_lpm);
3689 ret = of_property_read_u32(np, "battery,temp_low_threshold_event",
3690 &pdata->temp_low_threshold_lpm);
3692 ret = of_property_read_u32(np, "battery,temp_low_recovery_event",
3693 &pdata->temp_low_recovery_lpm);
3695 ret = of_property_read_u32(np, "battery,full_check_type",
3696 &pdata->full_check_type);
3698 ret = of_property_read_u32(np, "battery,full_check_type_2nd",
3699 &pdata->full_check_type_2nd);
3701 ret = of_property_read_u32(np, "battery,full_check_count",
3702 &pdata->full_check_count);
3704 ret = of_property_read_u32(np, "battery,chg_gpio_full_check",
3705 &pdata->chg_gpio_full_check);
3707 ret = of_property_read_u32(np, "battery,chg_polarity_full_check",
3708 &pdata->chg_polarity_full_check);
3710 ret = of_property_read_u32(np, "battery,full_condition_type",
3711 &pdata->full_condition_type);
3713 ret = of_property_read_u32(np, "battery,full_condition_soc",
3714 &pdata->full_condition_soc);
3716 ret = of_property_read_u32(np, "battery,full_condition_vcell",
3717 &pdata->full_condition_vcell);
3719 ret = of_property_read_u32(np, "battery,recharge_check_count",
3720 &pdata->recharge_check_count);
3722 ret = of_property_read_u32(np, "battery,recharge_condition_type",
3723 &pdata->recharge_condition_type);
3725 ret = of_property_read_u32(np, "battery,recharge_condition_soc",
3726 &pdata->recharge_condition_soc);
3728 ret = of_property_read_u32(np, "battery,recharge_condition_vcell",
3729 &pdata->recharge_condition_vcell);
3731 ret = of_property_read_u32(np, "battery,charging_total_time",
3732 (unsigned int *)&pdata->charging_total_time);
3734 ret = of_property_read_u32(np, "battery,recharging_total_time",
3735 (unsigned int *)&pdata->recharging_total_time);
3737 ret = of_property_read_u32(np, "battery,charging_reset_time",
3738 (unsigned int *)&pdata->charging_reset_time);
3740 ret = of_property_read_u32(np, "battery,charging_reset_time",
3741 (unsigned int *)&pdata->charging_reset_time);
3743 ret = of_property_read_u32(np, "charger,chg_float_voltage",
3744 (unsigned int *)&pdata->chg_float_voltage);
3746 pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
3747 "cable_source_type : %d, event_waiting_time : %d\n"
3748 "polling_type : %d, initial_count : %d, check_count : %d\n"
3749 "check_adc_max : %d, check_adc_min : %d\n"
3750 "ovp_uvlo_check_type : %d, thermal_source : %d\n"
3751 "temp_check_type : %d, temp_check_count : %d\n"
3752 "temp_high_threshold_even : %d, temp_high_recovery_event : %d\n"
3753 "chg_float_voltage : %d\n",
3755 pdata->vendor, pdata->technology,pdata->cable_check_type,
3756 pdata->cable_source_type, pdata->event_waiting_time,
3757 pdata->polling_type, pdata->monitor_initial_count,
3758 pdata->check_count, pdata->check_adc_max, pdata->check_adc_min,
3759 pdata->ovp_uvlo_check_type, pdata->thermal_source,
3760 pdata->temp_check_type, pdata->temp_check_count,
3761 pdata->temp_high_threshold_event, pdata->temp_high_recovery_event,
3762 pdata->chg_float_voltage);
3769 extern sec_battery_platform_data_t sec_battery_pdata;
3772 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
3773 static int sec_battery_pm_notifier(struct notifier_block *nb,
3774 unsigned long pm_event, void *unused)
3776 struct sec_battery_info *battery;
3778 battery = container_of(nb, struct sec_battery_info, pm_nb);
3780 dev_info(battery->dev, "%s: Start\n", __func__);
3783 case PM_SUSPEND_PREPARE:
3784 switch (battery->pdata->polling_type) {
3785 case SEC_BATTERY_MONITOR_WORKQUEUE:
3786 cancel_delayed_work(&battery->polling_work);
3788 case SEC_BATTERY_MONITOR_ALARM:
3789 alarm_cancel(&battery->polling_alarm);
3794 cancel_delayed_work_sync(&battery->monitor_work);
3796 battery->polling_in_sleep = true;
3798 sec_bat_set_polling(battery);
3800 /* cancel work for polling
3801 * that is set in sec_bat_set_polling()
3802 * no need for polling in sleep
3804 if (battery->pdata->polling_type ==
3805 SEC_BATTERY_MONITOR_WORKQUEUE)
3806 cancel_delayed_work(&battery->polling_work);
3808 case PM_POST_SUSPEND:
3814 dev_dbg(battery->dev, "%s: End\n", __func__);
3820 #ifdef CONFIG_SLEEP_MONITOR
3821 int bat_get_sleep_monitor_cb(void *priv, unsigned int *raw_val,
3822 int check_level, int caller_type)
3824 union power_supply_propval val;
3825 unsigned int temp_res= 0;
3828 if (check_level == SLEEP_MONITOR_CHECK_HARD) {
3829 psy_do_property("sec-fuelgauge", get, POWER_SUPPLY_PROP_CAPACITY, val);
3832 sec_bat_get_property(priv, POWER_SUPPLY_PROP_CAPACITY, &val);
3833 temp_res = val.intval;
3835 sec_bat_get_property(priv, POWER_SUPPLY_PROP_STATUS, &val);
3837 temp_res |= val.intval << 8;
3839 sec_bat_get_property(priv, POWER_SUPPLY_PROP_HEALTH, &val);
3840 temp_res |= val.intval << 12;
3842 sec_bat_get_property(priv, POWER_SUPPLY_PROP_ONLINE, &val);
3843 temp_res |= val.intval << 16;
3845 *raw_val = temp_res;
3850 static struct sleep_monitor_ops bat_sleep_monitor_ops = {
3851 .read_cb_func = bat_get_sleep_monitor_cb,
3855 static int sec_battery_probe(struct platform_device *pdev)
3857 sec_battery_platform_data_t *pdata = NULL;
3858 struct sec_battery_info *battery;
3864 union power_supply_propval value;
3867 "%s: SEC Battery Driver Loading\n", __func__);
3869 battery = kzalloc(sizeof(*battery), GFP_KERNEL);
3873 if (pdev->dev.of_node) {
3874 pdata = devm_kzalloc(&pdev->dev,
3875 sizeof(sec_battery_platform_data_t),
3878 dev_err(&pdev->dev, "Failed to allocate memory\n");
3883 battery->pdata = pdata;
3885 if (sec_bat_parse_dt(&pdev->dev, battery))
3887 "%s: Failed to get battery init\n", __func__);
3890 pdata = dev_get_platdata(&pdev->dev);
3891 battery->pdata = pdata;
3894 platform_set_drvdata(pdev, battery);
3896 battery->dev = &pdev->dev;
3898 mutex_init(&battery->adclock);
3900 dev_dbg(battery->dev, "%s: ADC init\n", __func__);
3903 // adc_init(pdev, battery);
3905 for (i = 0; i < SEC_BAT_ADC_CHANNEL_FULL_CHECK; i++)
3906 adc_init(pdev, pdata, i);
3909 wake_lock_init(&battery->monitor_wake_lock, WAKE_LOCK_SUSPEND,
3910 "sec-battery-monitor");
3911 wake_lock_init(&battery->cable_wake_lock, WAKE_LOCK_SUSPEND,
3912 "sec-battery-cable");
3913 wake_lock_init(&battery->vbus_wake_lock, WAKE_LOCK_SUSPEND,
3914 "sec-battery-vbus");
3916 /* initialization of battery info */
3917 battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
3918 battery->health = POWER_SUPPLY_HEALTH_GOOD;
3919 battery->present = true;
3921 battery->polling_count = 1; /* initial value = 1 */
3922 battery->polling_time = pdata->polling_time[
3923 SEC_BATTERY_POLLING_TIME_DISCHARGING];
3924 battery->polling_in_sleep = false;
3925 battery->polling_short = false;
3927 battery->check_count = 0;
3928 battery->check_adc_count = 0;
3929 battery->check_adc_value = 0;
3931 battery->charging_start_time = 0;
3932 battery->charging_passed_time = 0;
3933 battery->charging_next_time = 0;
3934 battery->charging_fullcharged_time = 0;
3935 battery->siop_level = 100;
3936 battery->wc_enable = 1;
3937 #if defined(CONFIG_SAMSUNG_BATTERY_ENG_TEST)
3938 battery->stability_test = 0;
3939 battery->eng_not_full_status = 0;
3941 battery->wc_status = 0;
3942 battery->ps_status= 0;
3943 battery->wire_status = POWER_SUPPLY_TYPE_BATTERY;
3945 #if defined(CONFIG_BATTERY_SWELLING)
3946 battery->swelling_mode = SEC_BATTERY_NORMAL_MODE;
3947 battery->swelling_max_vbat = 4340;
3948 battery->swelling_temp_dischg_threshold = BATT_SWELLING_DISCHG_TEMP;
3949 battery->swelling_temp_dischg_recovery = BATT_SWELLING_DISCHG_TEMP_RECOV;
3950 battery->swelling_temp_high_threshold = BATT_SWELLING_HIGH_TEMP_BLOCK;
3951 battery->swelling_temp_high_recovery = BATT_SWELLING_HIGH_TEMP_RECOV;
3952 battery->swelling_temp_low_threshold = BATT_SWELLING_LOW_TEMP_BLOCK;
3953 battery->swelling_temp_low_recovery = BATT_SWELLING_LOW_TEMP_RECOV;
3954 battery->swelling_recharge_voltage = BATT_SWELLING_RECHG_VOLTAGE;
3955 battery->swelling_block_time = BATT_SWELLING_BLOCK_TIME;
3957 #if defined(CONFIG_BATTERY_DISCHG_IC)
3958 battery->dischg_test = pdata->dischg_test;
3961 #if defined(ANDROID_ALARM_ACTIVATED)
3962 alarm_init(&battery->event_termination_alarm,
3963 ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
3964 sec_bat_event_expired_timer_func);
3966 alarm_init(&battery->event_termination_alarm,
3968 sec_bat_event_expired_timer_func);
3971 battery->temp_high_threshold =
3972 pdata->temp_high_threshold_normal;
3973 battery->temp_high_recovery =
3974 pdata->temp_high_recovery_normal;
3975 battery->temp_low_recovery =
3976 pdata->temp_low_recovery_normal;
3977 battery->temp_low_threshold =
3978 pdata->temp_low_threshold_normal;
3979 battery->temperature = 255;
3981 battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
3982 battery->is_recharging = false;
3983 battery->cable_type = POWER_SUPPLY_TYPE_BATTERY;
3984 battery->test_mode = 0;
3985 battery->factory_mode = false;
3986 battery->slate_mode = false;
3988 battery->psy_bat.name = "battery",
3989 battery->psy_bat.type = POWER_SUPPLY_TYPE_BATTERY,
3990 battery->psy_bat.properties = sec_battery_props,
3991 battery->psy_bat.num_properties = ARRAY_SIZE(sec_battery_props),
3992 battery->psy_bat.get_property = sec_bat_get_property,
3993 battery->psy_bat.set_property = sec_bat_set_property,
3994 battery->psy_usb.name = "usb",
3995 battery->psy_usb.type = POWER_SUPPLY_TYPE_USB,
3996 battery->psy_usb.supplied_to = supply_list,
3997 battery->psy_usb.num_supplicants = ARRAY_SIZE(supply_list),
3998 battery->psy_usb.properties = sec_power_props,
3999 battery->psy_usb.num_properties = ARRAY_SIZE(sec_power_props),
4000 battery->psy_usb.get_property = sec_usb_get_property,
4001 battery->psy_ac.name = "ac",
4002 battery->psy_ac.type = POWER_SUPPLY_TYPE_MAINS,
4003 battery->psy_ac.supplied_to = supply_list,
4004 battery->psy_ac.num_supplicants = ARRAY_SIZE(supply_list),
4005 battery->psy_ac.properties = sec_power_props,
4006 battery->psy_ac.num_properties = ARRAY_SIZE(sec_power_props),
4007 battery->psy_ac.get_property = sec_ac_get_property;
4008 battery->psy_wireless.name = "wireless",
4009 battery->psy_wireless.type = POWER_SUPPLY_TYPE_WIRELESS,
4010 battery->psy_wireless.supplied_to = supply_list,
4011 battery->psy_wireless.num_supplicants = ARRAY_SIZE(supply_list),
4012 battery->psy_wireless.properties = sec_power_props,
4013 battery->psy_wireless.num_properties = ARRAY_SIZE(sec_power_props),
4014 battery->psy_wireless.get_property = sec_wireless_get_property;
4015 battery->psy_wireless.set_property = sec_wireless_set_property;
4016 battery->psy_ps.name = "ps",
4017 battery->psy_ps.type = POWER_SUPPLY_TYPE_POWER_SHARING,
4018 battery->psy_ps.supplied_to = supply_list,
4019 battery->psy_ps.num_supplicants = ARRAY_SIZE(supply_list),
4020 battery->psy_ps.properties = sec_ps_props,
4021 battery->psy_ps.num_properties = ARRAY_SIZE(sec_ps_props),
4022 battery->psy_ps.get_property = sec_ps_get_property;
4023 battery->psy_ps.set_property = sec_ps_set_property;
4025 /* create work queue */
4026 battery->monitor_wqueue =
4027 create_singlethread_workqueue(dev_name(&pdev->dev));
4028 if (!battery->monitor_wqueue) {
4029 dev_err(battery->dev,
4030 "%s: Fail to Create Workqueue\n", __func__);
4034 INIT_DELAYED_WORK(&battery->monitor_work, sec_bat_monitor_work);
4035 INIT_WORK(&battery->cable_work, sec_bat_cable_work);
4037 switch (pdata->polling_type) {
4038 case SEC_BATTERY_MONITOR_WORKQUEUE:
4039 INIT_DELAYED_WORK(&battery->polling_work,
4040 sec_bat_polling_work);
4042 case SEC_BATTERY_MONITOR_ALARM:
4043 #if defined(ANDROID_ALARM_ACTIVATED)
4044 battery->last_poll_time = alarm_get_elapsed_realtime();
4045 alarm_init(&battery->polling_alarm,
4046 ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
4049 battery->last_poll_time = ktime_get_boottime();
4050 alarm_init(&battery->polling_alarm, ALARM_BOOTTIME,
4059 /* init power supplier framework */
4060 ret = power_supply_register(&pdev->dev, &battery->psy_ps);
4062 dev_err(battery->dev,
4063 "%s: Failed to Register psy_ps\n", __func__);
4067 ret = power_supply_register(&pdev->dev, &battery->psy_wireless);
4069 dev_err(battery->dev,
4070 "%s: Failed to Register psy_wireless\n", __func__);
4071 goto err_supply_unreg_ps;
4074 ret = power_supply_register(&pdev->dev, &battery->psy_usb);
4076 dev_err(battery->dev,
4077 "%s: Failed to Register psy_usb\n", __func__);
4078 goto err_supply_unreg_wireless;
4081 ret = power_supply_register(&pdev->dev, &battery->psy_ac);
4083 dev_err(battery->dev,
4084 "%s: Failed to Register psy_ac\n", __func__);
4085 goto err_supply_unreg_usb;
4088 ret = power_supply_register(&pdev->dev, &battery->psy_bat);
4090 dev_err(battery->dev,
4091 "%s: Failed to Register psy_bat\n", __func__);
4092 goto err_supply_unreg_ac;
4095 if (battery->pdata->bat_gpio_init && !battery->pdata->bat_gpio_init()) {
4096 dev_err(battery->dev,
4097 "%s: Failed to Initialize GPIO\n", __func__);
4098 goto err_supply_unreg_bat;
4101 if (battery->pdata->bat_irq) {
4102 ret = request_threaded_irq(battery->pdata->bat_irq,
4103 NULL, sec_bat_irq_thread,
4104 battery->pdata->bat_irq_attr,
4105 "battery-irq", battery);
4107 dev_err(battery->dev,
4108 "%s: Failed to Request IRQ, %d, %d\n", __func__, battery->pdata->bat_irq, ret);
4109 goto err_supply_unreg_ac;
4112 ret = enable_irq_wake(battery->pdata->bat_irq);
4114 dev_err(battery->dev,
4115 "%s: Failed to Enable Wakeup Source(%d)\n",
4120 ret = sec_bat_create_attrs(battery->psy_bat.dev);
4122 dev_err(battery->dev,
4123 "%s : Failed to create_attrs\n", __func__);
4126 //sprdbat_creat_caliberate_attr(battery->psy_bat.dev);
4128 #if defined(CONFIG_MUIC_NOTIFIER)
4129 muic_notifier_register(&battery->batt_nb,
4130 batt_handle_notification,
4131 MUIC_NOTIFY_DEV_CHARGER);
4134 if (pdata->initial_check)
4135 pdata->initial_check(battery);
4137 sec_bat_initial_check();
4139 psy_do_property("battery", get,
4140 POWER_SUPPLY_PROP_ONLINE, value);
4142 if (value.intval == POWER_SUPPLY_TYPE_BATTERY) {
4143 dev_info(&pdev->dev,
4144 "%s: SEC Battery Driver Monitorwork\n", __func__);
4145 wake_lock(&battery->monitor_wake_lock);
4146 queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0);
4149 if (battery->pdata->check_battery_callback)
4150 battery->present = battery->pdata->check_battery_callback(battery);
4152 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
4153 battery->pm_nb.notifier_call = sec_battery_pm_notifier;
4155 register_pm_notifier(&battery->pm_nb);
4158 #ifdef CONFIG_SLEEP_MONITOR
4159 sleep_monitor_register_ops(&battery->psy_bat,
4160 &bat_sleep_monitor_ops, SLEEP_MONITOR_BATTERY);
4163 dev_info(battery->dev,
4164 "%s: SEC Battery Driver Loaded\n", __func__);
4165 //sec_bat_set_charge(battery, true);
4169 if (battery->pdata->bat_irq)
4170 free_irq(battery->pdata->bat_irq, battery);
4171 err_supply_unreg_ac:
4172 power_supply_unregister(&battery->psy_ac);
4173 err_supply_unreg_usb:
4174 power_supply_unregister(&battery->psy_usb);
4175 err_supply_unreg_bat:
4176 power_supply_unregister(&battery->psy_bat);
4177 err_supply_unreg_wireless:
4178 power_supply_unregister(&battery->psy_wireless);
4179 err_supply_unreg_ps:
4180 power_supply_unregister(&battery->psy_ps);
4182 destroy_workqueue(battery->monitor_wqueue);
4184 wake_lock_destroy(&battery->monitor_wake_lock);
4185 wake_lock_destroy(&battery->cable_wake_lock);
4186 wake_lock_destroy(&battery->vbus_wake_lock);
4187 mutex_destroy(&battery->adclock);
4195 static int sec_battery_remove(struct platform_device *pdev)
4197 struct sec_battery_info *battery = platform_get_drvdata(pdev);
4202 dev_dbg(battery->dev, "%s: Start\n", __func__);
4204 switch (battery->pdata->polling_type) {
4205 case SEC_BATTERY_MONITOR_WORKQUEUE:
4206 cancel_delayed_work(&battery->polling_work);
4208 case SEC_BATTERY_MONITOR_ALARM:
4209 alarm_cancel(&battery->polling_alarm);
4215 alarm_cancel(&battery->event_termination_alarm);
4216 flush_workqueue(battery->monitor_wqueue);
4217 destroy_workqueue(battery->monitor_wqueue);
4218 wake_lock_destroy(&battery->monitor_wake_lock);
4219 wake_lock_destroy(&battery->cable_wake_lock);
4220 wake_lock_destroy(&battery->vbus_wake_lock);
4222 mutex_destroy(&battery->adclock);
4224 // adc_exit(battery);
4226 for (i = 0; i < SEC_BAT_ADC_CHANNEL_FULL_CHECK; i++)
4227 adc_exit(battery->pdata, i);
4230 power_supply_unregister(&battery->psy_ps);
4231 power_supply_unregister(&battery->psy_wireless);
4232 power_supply_unregister(&battery->psy_ac);
4233 power_supply_unregister(&battery->psy_usb);
4234 power_supply_unregister(&battery->psy_bat);
4236 #ifdef CONFIG_SEC_BATTERY_PM_NOTIFY
4237 unregister_pm_notifier(&battery->pm_nb);
4240 #ifdef CONFIG_SLEEP_MONITOR
4241 sleep_monitor_unregister_ops(SLEEP_MONITOR_BATTERY);
4244 dev_dbg(battery->dev, "%s: End\n", __func__);
4250 static int sec_battery_prepare(struct device *dev)
4252 #ifndef CONFIG_SEC_BATTERY_PM_NOTIFY
4253 struct sec_battery_info *battery
4254 = dev_get_drvdata(dev);
4256 dev_dbg(battery->dev, "%s: Start\n", __func__);
4258 switch (battery->pdata->polling_type) {
4259 case SEC_BATTERY_MONITOR_WORKQUEUE:
4260 cancel_delayed_work(&battery->polling_work);
4262 case SEC_BATTERY_MONITOR_ALARM:
4263 alarm_cancel(&battery->polling_alarm);
4268 cancel_delayed_work_sync(&battery->monitor_work);
4270 battery->polling_in_sleep = true;
4272 sec_bat_set_polling(battery);
4274 /* cancel work for polling
4275 * that is set in sec_bat_set_polling()
4276 * no need for polling in sleep
4278 if (battery->pdata->polling_type ==
4279 SEC_BATTERY_MONITOR_WORKQUEUE)
4280 cancel_delayed_work(&battery->polling_work);
4282 dev_dbg(battery->dev, "%s: End\n", __func__);
4287 static int sec_battery_suspend(struct device *dev)
4292 static int sec_battery_resume(struct device *dev)
4297 static void sec_battery_complete(struct device *dev)
4299 struct sec_battery_info *battery
4300 = dev_get_drvdata(dev);
4302 dev_dbg(battery->dev, "%s: Start\n", __func__);
4304 /* cancel current alarm and reset after monitor work */
4305 if (battery->pdata->polling_type == SEC_BATTERY_MONITOR_ALARM)
4306 alarm_cancel(&battery->polling_alarm);
4308 wake_lock(&battery->monitor_wake_lock);
4309 queue_delayed_work(battery->monitor_wqueue,
4310 &battery->monitor_work, msecs_to_jiffies(500));
4312 dev_dbg(battery->dev, "%s: End\n", __func__);
4317 static void sec_battery_shutdown(struct device *dev)
4322 static struct of_device_id sec_battery_dt_ids[] = {
4323 { .compatible = "samsung,sec-battery" },
4326 MODULE_DEVICE_TABLE(of, sec_battery_dt_ids);
4327 #endif /* CONFIG_OF */
4329 static const struct dev_pm_ops sec_battery_pm_ops = {
4330 .prepare = sec_battery_prepare,
4331 .suspend = sec_battery_suspend,
4332 .resume = sec_battery_resume,
4333 .complete = sec_battery_complete,
4336 static struct platform_driver sec_battery_driver = {
4338 .name = "sec-battery",
4339 .owner = THIS_MODULE,
4340 .pm = &sec_battery_pm_ops,
4341 .shutdown = sec_battery_shutdown,
4343 .of_match_table = sec_battery_dt_ids,
4346 .probe = sec_battery_probe,
4347 .remove = sec_battery_remove,
4350 static int __init sec_battery_init(void)
4352 return platform_driver_register(&sec_battery_driver);
4355 static void __exit sec_battery_exit(void)
4357 platform_driver_unregister(&sec_battery_driver);
4360 late_initcall(sec_battery_init);
4361 module_exit(sec_battery_exit);
4363 MODULE_DESCRIPTION("Samsung Battery Driver");
4364 MODULE_AUTHOR("Samsung Electronics");
4365 MODULE_LICENSE("GPL");