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.
12 #include "include/sec_battery.h"
13 #include <linux/sec_ext.h>
14 #include <linux/sec_debug.h>
16 #if defined(CONFIG_SEC_ABC)
17 #include <linux/sti/abc_common.h>
20 bool sleep_mode
= false;
22 static struct device_attribute sec_battery_attrs
[] = {
23 SEC_BATTERY_ATTR(batt_reset_soc
),
24 SEC_BATTERY_ATTR(batt_read_raw_soc
),
25 SEC_BATTERY_ATTR(batt_read_adj_soc
),
26 SEC_BATTERY_ATTR(batt_type
),
27 SEC_BATTERY_ATTR(batt_vfocv
),
28 SEC_BATTERY_ATTR(batt_vol_adc
),
29 SEC_BATTERY_ATTR(batt_vol_adc_cal
),
30 SEC_BATTERY_ATTR(batt_vol_aver
),
31 SEC_BATTERY_ATTR(batt_vol_adc_aver
),
32 SEC_BATTERY_ATTR(batt_current_ua_now
),
33 SEC_BATTERY_ATTR(batt_current_ua_avg
),
34 SEC_BATTERY_ATTR(batt_filter_cfg
),
35 SEC_BATTERY_ATTR(batt_temp
),
36 SEC_BATTERY_ATTR(batt_temp_adc
),
37 SEC_BATTERY_ATTR(batt_temp_aver
),
38 SEC_BATTERY_ATTR(batt_temp_adc_aver
),
39 SEC_BATTERY_ATTR(usb_temp
),
40 SEC_BATTERY_ATTR(usb_temp_adc
),
41 SEC_BATTERY_ATTR(chg_temp
),
42 SEC_BATTERY_ATTR(chg_temp_adc
),
43 SEC_BATTERY_ATTR(slave_chg_temp
),
44 SEC_BATTERY_ATTR(slave_chg_temp_adc
),
46 SEC_BATTERY_ATTR(batt_vf_adc
),
47 SEC_BATTERY_ATTR(batt_slate_mode
),
49 SEC_BATTERY_ATTR(batt_lp_charging
),
50 SEC_BATTERY_ATTR(siop_activated
),
51 SEC_BATTERY_ATTR(siop_level
),
52 SEC_BATTERY_ATTR(siop_event
),
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(fg_asoc
),
58 SEC_BATTERY_ATTR(auth
),
59 SEC_BATTERY_ATTR(chg_current_adc
),
60 SEC_BATTERY_ATTR(wc_adc
),
61 SEC_BATTERY_ATTR(wc_status
),
62 SEC_BATTERY_ATTR(wc_enable
),
63 SEC_BATTERY_ATTR(wc_control
),
64 SEC_BATTERY_ATTR(wc_control_cnt
),
65 SEC_BATTERY_ATTR(led_cover
),
66 SEC_BATTERY_ATTR(hv_charger_status
),
67 SEC_BATTERY_ATTR(hv_wc_charger_status
),
68 SEC_BATTERY_ATTR(hv_charger_set
),
69 SEC_BATTERY_ATTR(factory_mode
),
70 SEC_BATTERY_ATTR(store_mode
),
71 SEC_BATTERY_ATTR(update
),
72 SEC_BATTERY_ATTR(test_mode
),
74 SEC_BATTERY_ATTR(call
),
75 SEC_BATTERY_ATTR(2g_call
),
76 SEC_BATTERY_ATTR(talk_gsm
),
77 SEC_BATTERY_ATTR(3g_call
),
78 SEC_BATTERY_ATTR(talk_wcdma
),
79 SEC_BATTERY_ATTR(music
),
80 SEC_BATTERY_ATTR(video
),
81 SEC_BATTERY_ATTR(browser
),
82 SEC_BATTERY_ATTR(hotspot
),
83 SEC_BATTERY_ATTR(camera
),
84 SEC_BATTERY_ATTR(camcorder
),
85 SEC_BATTERY_ATTR(data_call
),
86 SEC_BATTERY_ATTR(wifi
),
87 SEC_BATTERY_ATTR(wibro
),
88 SEC_BATTERY_ATTR(lte
),
89 SEC_BATTERY_ATTR(lcd
),
90 SEC_BATTERY_ATTR(gps
),
91 SEC_BATTERY_ATTR(event
),
92 SEC_BATTERY_ATTR(batt_temp_table
),
93 SEC_BATTERY_ATTR(batt_high_current_usb
),
94 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
95 SEC_BATTERY_ATTR(test_charge_current
),
97 SEC_BATTERY_ATTR(set_stability_test
),
98 SEC_BATTERY_ATTR(batt_capacity_max
),
99 SEC_BATTERY_ATTR(batt_inbat_voltage
),
100 SEC_BATTERY_ATTR(batt_inbat_voltage_ocv
),
101 SEC_BATTERY_ATTR(check_slave_chg
),
102 SEC_BATTERY_ATTR(batt_inbat_wireless_cs100
),
103 SEC_BATTERY_ATTR(hmt_ta_connected
),
104 SEC_BATTERY_ATTR(hmt_ta_charge
),
105 #if defined(CONFIG_BATTERY_AGE_FORECAST)
106 SEC_BATTERY_ATTR(fg_cycle
),
107 SEC_BATTERY_ATTR(fg_full_voltage
),
108 SEC_BATTERY_ATTR(fg_fullcapnom
),
109 SEC_BATTERY_ATTR(battery_cycle
),
111 SEC_BATTERY_ATTR(batt_wpc_temp
),
112 SEC_BATTERY_ATTR(batt_wpc_temp_adc
),
113 SEC_BATTERY_ATTR(batt_coil_temp
), /* Wireless Coil therm */
114 SEC_BATTERY_ATTR(batt_coil_temp_adc
), /* Wireless Coil therm */
115 SEC_BATTERY_ATTR(mst_switch_test
), /* MFC MST switch test */
116 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
117 SEC_BATTERY_ATTR(batt_wireless_firmware_update
),
118 SEC_BATTERY_ATTR(otp_firmware_result
),
119 SEC_BATTERY_ATTR(wc_ic_grade
),
120 SEC_BATTERY_ATTR(otp_firmware_ver_bin
),
121 SEC_BATTERY_ATTR(otp_firmware_ver
),
122 SEC_BATTERY_ATTR(tx_firmware_result
),
123 SEC_BATTERY_ATTR(tx_firmware_ver
),
124 SEC_BATTERY_ATTR(batt_tx_status
),
126 SEC_BATTERY_ATTR(wc_vout
),
127 SEC_BATTERY_ATTR(wc_vrect
),
128 SEC_BATTERY_ATTR(batt_hv_wireless_status
),
129 SEC_BATTERY_ATTR(batt_hv_wireless_pad_ctrl
),
130 SEC_BATTERY_ATTR(wc_op_freq
),
131 SEC_BATTERY_ATTR(wc_cmd_info
),
132 SEC_BATTERY_ATTR(batt_tune_float_voltage
),
133 SEC_BATTERY_ATTR(batt_tune_input_charge_current
),
134 SEC_BATTERY_ATTR(batt_tune_fast_charge_current
),
135 SEC_BATTERY_ATTR(batt_tune_ui_term_cur_1st
),
136 SEC_BATTERY_ATTR(batt_tune_ui_term_cur_2nd
),
137 SEC_BATTERY_ATTR(batt_tune_temp_high_normal
),
138 SEC_BATTERY_ATTR(batt_tune_temp_high_rec_normal
),
139 SEC_BATTERY_ATTR(batt_tune_temp_low_normal
),
140 SEC_BATTERY_ATTR(batt_tune_temp_low_rec_normal
),
141 SEC_BATTERY_ATTR(batt_tune_chg_temp_high
),
142 SEC_BATTERY_ATTR(batt_tune_chg_temp_rec
),
143 SEC_BATTERY_ATTR(batt_tune_chg_limit_cur
),
144 SEC_BATTERY_ATTR(batt_tune_coil_temp_high
),
145 SEC_BATTERY_ATTR(batt_tune_coil_temp_rec
),
146 SEC_BATTERY_ATTR(batt_tune_coil_limit_cur
),
147 #if defined(CONFIG_UPDATE_BATTERY_DATA)
148 SEC_BATTERY_ATTR(batt_update_data
),
150 SEC_BATTERY_ATTR(batt_misc_event
),
151 SEC_BATTERY_ATTR(batt_ext_dev_chg
),
152 SEC_BATTERY_ATTR(batt_wdt_control
),
153 SEC_BATTERY_ATTR(mode
),
154 SEC_BATTERY_ATTR(check_ps_ready
),
155 SEC_BATTERY_ATTR(batt_chip_id
),
156 SEC_BATTERY_ATTR(cisd_fullcaprep_max
),
157 #if defined(CONFIG_BATTERY_CISD)
158 SEC_BATTERY_ATTR(cisd_data
),
159 SEC_BATTERY_ATTR(cisd_data_json
),
160 SEC_BATTERY_ATTR(cisd_data_d_json
),
161 SEC_BATTERY_ATTR(cisd_wire_count
),
162 SEC_BATTERY_ATTR(cisd_wc_data
),
163 SEC_BATTERY_ATTR(cisd_wc_data_json
),
164 SEC_BATTERY_ATTR(prev_battery_data
),
165 SEC_BATTERY_ATTR(prev_battery_info
),
167 #if defined(CONFIG_BATTERY_SBM_DATA)
168 SEC_BATTERY_ATTR(sbm_data
),
170 SEC_BATTERY_ATTR(safety_timer_set
),
171 SEC_BATTERY_ATTR(batt_swelling_control
),
172 SEC_BATTERY_ATTR(safety_timer_info
),
173 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
174 SEC_BATTERY_ATTR(batt_temp_test
),
176 SEC_BATTERY_ATTR(batt_current_event
),
177 SEC_BATTERY_ATTR(cc_info
),
178 SEC_BATTERY_ATTR(ext_event
),
181 static enum power_supply_property sec_battery_props
[] = {
182 POWER_SUPPLY_PROP_STATUS
,
183 POWER_SUPPLY_PROP_CHARGE_TYPE
,
184 POWER_SUPPLY_PROP_HEALTH
,
185 POWER_SUPPLY_PROP_PRESENT
,
186 POWER_SUPPLY_PROP_ONLINE
,
187 POWER_SUPPLY_PROP_TECHNOLOGY
,
188 POWER_SUPPLY_PROP_VOLTAGE_NOW
,
189 POWER_SUPPLY_PROP_VOLTAGE_AVG
,
190 POWER_SUPPLY_PROP_CURRENT_NOW
,
191 POWER_SUPPLY_PROP_CURRENT_AVG
,
192 POWER_SUPPLY_PROP_CHARGE_FULL
,
193 POWER_SUPPLY_PROP_CHARGE_NOW
,
194 POWER_SUPPLY_PROP_CAPACITY
,
195 POWER_SUPPLY_PROP_TEMP
,
196 POWER_SUPPLY_PROP_TEMP_AMBIENT
,
197 #if defined(CONFIG_CALC_TIME_TO_FULL)
198 POWER_SUPPLY_PROP_TIME_TO_FULL_NOW
,
200 POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW
,
201 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
202 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
,
203 POWER_SUPPLY_PROP_CHARGE_COUNTER
,
206 static enum power_supply_property sec_power_props
[] = {
207 POWER_SUPPLY_PROP_ONLINE
,
208 POWER_SUPPLY_PROP_VOLTAGE_MAX
,
209 POWER_SUPPLY_PROP_CURRENT_MAX
,
212 static enum power_supply_property sec_wireless_props
[] = {
213 POWER_SUPPLY_PROP_ONLINE
,
214 POWER_SUPPLY_PROP_PRESENT
,
215 POWER_SUPPLY_PROP_VOLTAGE_MAX
,
216 POWER_SUPPLY_PROP_CURRENT_MAX
,
219 static enum power_supply_property sec_ac_props
[] = {
220 POWER_SUPPLY_PROP_ONLINE
,
221 POWER_SUPPLY_PROP_TEMP
,
222 POWER_SUPPLY_PROP_VOLTAGE_MAX
,
223 POWER_SUPPLY_PROP_CURRENT_MAX
,
226 static enum power_supply_property sec_ps_props
[] = {
227 POWER_SUPPLY_PROP_STATUS
,
228 POWER_SUPPLY_PROP_ONLINE
,
231 static char *supply_list
[] = {
235 char *sec_cable_type
[SEC_BATTERY_CABLE_MAX
] = {
238 "PREAPARE_TA", /* 2 */
244 "9V_UNKNOWN", /* 8 */
247 "HV_WIRELESS", /* 11 */
248 "PMA_WIRELESS", /* 12 */
249 "WIRELESS_PACK", /* 13 */
250 "WIRELESS_HV_PACK", /* 14 */
251 "WIRELESS_STAND", /* 15 */
252 "WIRELESS_HV_STAND", /* 16 */
259 "POWER_SHARGING", /* 23 */
260 "HMT_CONNECTED", /* 24 */
261 "HMT_CHARGE", /* 25 */
262 "HV_TA_CHG_LIMIT", /* 26 */
263 "WIRELESS_VEHICLE", /* 27 */
264 "WIRELESS_HV_VEHICLE", /* 28 */
265 "WIRELESS_HV_PREPARE", /* 29 */
267 "SMART_OTG", /* 31 */
268 "SMART_NOTG", /* 32 */
269 "WIRELESS_TX", /* 33 */
272 char *sec_bat_charging_mode_str
[] = {
280 char *sec_bat_status_str
[] = {
288 char *sec_bat_health_str
[] = {
298 "WatchdogTimerExpire",
306 char *sec_bat_charge_mode_str
[] = {
314 static void sec_bat_set_misc_event(struct sec_battery_info
*battery
,
315 const int misc_event_type
, bool do_clear
) {
317 mutex_lock(&battery
->misclock
);
318 pr_info("%s: %s misc event(now=0x%x, value=0x%x)\n",
319 __func__
, ((do_clear
) ? "clear" : "set"), battery
->misc_event
, misc_event_type
);
321 battery
->misc_event
&= ~misc_event_type
;
323 battery
->misc_event
|= misc_event_type
;
325 mutex_unlock(&battery
->misclock
);
327 if (battery
->prev_misc_event
!= battery
->misc_event
) {
328 cancel_delayed_work(&battery
->misc_event_work
);
329 wake_lock(&battery
->misc_event_wake_lock
);
330 queue_delayed_work(battery
->monitor_wqueue
,
331 &battery
->misc_event_work
, 0);
335 static void sec_bat_set_current_event(struct sec_battery_info
*battery
,
336 unsigned int current_event_val
, unsigned int current_event_mask
)
338 unsigned int temp
= battery
->current_event
;
340 mutex_lock(&battery
->current_eventlock
);
342 battery
->current_event
&= ~current_event_mask
;
343 battery
->current_event
|= current_event_val
;
345 pr_info("%s: current event before(0x%x), after(0x%x)\n",
346 __func__
, temp
, battery
->current_event
);
348 mutex_unlock(&battery
->current_eventlock
);
351 static void sec_bat_change_default_current(struct sec_battery_info
*battery
,
352 int cable_type
, int input
, int output
)
354 battery
->pdata
->charging_current
[cable_type
].input_current_limit
= input
;
355 battery
->pdata
->charging_current
[cable_type
].fast_charging_current
= output
;
356 pr_info("%s: cable_type: %d input: %d output: %d\n",__func__
, cable_type
, input
, output
);
359 static int sec_bat_get_wireless_current(struct sec_battery_info
*battery
, int incurr
)
361 /* 2. WPC_SLEEP_MODE */
362 if (is_hv_wireless_type(battery
->cable_type
) && sleep_mode
) {
363 if(incurr
> battery
->pdata
->sleep_mode_limit_current
)
364 incurr
= battery
->pdata
->sleep_mode_limit_current
;
365 pr_info("%s sleep_mode =%d, chg_limit =%d, in_curr = %d \n", __func__
,
366 sleep_mode
, battery
->chg_limit
, incurr
);
369 /* 3. WPC_TEMP_MODE */
370 if (is_wireless_type(battery
->cable_type
) && battery
->chg_limit
) {
371 if ((battery
->siop_level
>= 100) &&
372 (incurr
> battery
->pdata
->wpc_charging_limit_current
))
373 incurr
= battery
->pdata
->wpc_charging_limit_current
;
374 else if ((battery
->siop_level
< 100) &&
375 (incurr
> battery
->pdata
->wpc_lcd_on_charging_limit_current
))
376 incurr
= battery
->pdata
->wpc_lcd_on_charging_limit_current
;
380 if (is_nv_wireless_type(battery
->cable_type
)) {
381 if (battery
->pdata
->set_cv_vout_in_low_capacity
) {
382 union power_supply_propval value
= {0,};
384 if (battery
->capacity
<= battery
->pdata
->set_cv_vout_in_low_capacity
&&
385 !battery
->wc_cv_mode
) {
386 battery
->wc_cv_mode
= true;
387 value
.intval
= WIRELESS_VOUT_CC_CV_VOUT
; // 5.5V
388 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
389 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
390 } else if (battery
->capacity
> battery
->pdata
->set_cv_vout_in_low_capacity
&&
391 battery
->capacity
< battery
->pdata
->wireless_cc_cv
&&
392 battery
->wc_cv_mode
) {
393 battery
->wc_cv_mode
= false;
394 value
.intval
= WIRELESS_VOUT_5V
; // 5V
395 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
396 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
400 if (battery
->wc_cv_mode
) {
401 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
) {
402 if (incurr
> battery
->pdata
->wc_cv_pack_current
)
403 incurr
= battery
->pdata
->wc_cv_pack_current
;
404 } else if (incurr
> battery
->pdata
->wc_cv_current
) {
405 incurr
= battery
->pdata
->wc_cv_current
;
410 /* 5. Full-Additional state */
411 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
) {
412 if (incurr
> battery
->pdata
->siop_hv_wireless_input_limit_current
)
413 incurr
= battery
->pdata
->siop_hv_wireless_input_limit_current
;
416 /* 6. Hero Stand Pad CV */
417 if (battery
->capacity
>= battery
->pdata
->wc_hero_stand_cc_cv
) {
418 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
) {
419 if (incurr
> battery
->pdata
->wc_hero_stand_cv_current
)
420 incurr
= battery
->pdata
->wc_hero_stand_cv_current
;
421 } else if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_STAND
) {
422 if (battery
->chg_limit
&&
423 incurr
> battery
->pdata
->wc_hero_stand_cv_current
) {
424 incurr
= battery
->pdata
->wc_hero_stand_cv_current
;
425 } else if (!battery
->chg_limit
&&
426 incurr
> battery
->pdata
->wc_hero_stand_hv_cv_current
) {
427 incurr
= battery
->pdata
->wc_hero_stand_hv_cv_current
;
432 /* 7. Full-None state && SIOP_LEVEL 100 */
433 if (battery
->siop_level
== 100 &&
434 battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
) {
435 incurr
= battery
->pdata
->wc_full_input_limit_current
;
441 static void sec_bat_get_charging_current_by_siop(struct sec_battery_info
*battery
,
442 int *input_current
, int *charging_current
) {
443 int usb_charging_current
= 500;
445 if (battery
->siop_level
< 100) {
446 int max_charging_current
;
448 if (is_wireless_type(battery
->cable_type
)) {
449 /* decrease the charging current according to siop level */
450 *charging_current
= *charging_current
* battery
->siop_level
/ 100;
452 /* do forced set charging current */
453 if (*charging_current
> 0 && *charging_current
< usb_charging_current
)
454 *charging_current
= usb_charging_current
;
456 max_charging_current
= 1800; /* 1 step(70) */
458 /* do forced set charging current */
459 if (*charging_current
> max_charging_current
)
460 *charging_current
= max_charging_current
;
463 if (is_nv_wireless_type(battery
->cable_type
)) {
464 if (*input_current
> battery
->pdata
->siop_wireless_input_limit_current
)
465 *input_current
= battery
->pdata
->siop_wireless_input_limit_current
;
466 if (*charging_current
> battery
->pdata
->siop_wireless_charging_limit_current
)
467 *charging_current
= battery
->pdata
->siop_wireless_charging_limit_current
;
468 } else if (is_hv_wireless_type(battery
->cable_type
)) {
469 if (*input_current
> battery
->pdata
->siop_hv_wireless_input_limit_current
)
470 *input_current
= battery
->pdata
->siop_hv_wireless_input_limit_current
;
471 if (*charging_current
> battery
->pdata
->siop_hv_wireless_charging_limit_current
)
472 *charging_current
= battery
->pdata
->siop_hv_wireless_charging_limit_current
;
473 } else if (is_hv_wire_type(battery
->cable_type
) && is_hv_wire_type(battery
->wire_status
)) {
474 if (is_hv_wire_12v_type(battery
->cable_type
)) {
475 if (*input_current
> battery
->pdata
->siop_hv_12v_input_limit_current
)
476 *input_current
= battery
->pdata
->siop_hv_12v_input_limit_current
;
478 if (*input_current
> battery
->pdata
->siop_hv_input_limit_current
)
479 *input_current
= battery
->pdata
->siop_hv_input_limit_current
;
481 #if defined(CONFIG_CCIC_NOTIFIER)
482 } else if (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
) {
483 if (*input_current
> (6000 / battery
->input_voltage
))
484 *input_current
= 6000 / battery
->input_voltage
;
487 if (*input_current
> battery
->pdata
->siop_input_limit_current
)
488 *input_current
= battery
->pdata
->siop_input_limit_current
;
492 pr_info("%s: incurr(%d), chgcurr(%d)\n", __func__
, *input_current
, *charging_current
);
495 #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_QC30)
496 extern int muic_afc_set_voltage(int vol
);
498 #if !defined(CONFIG_SEC_FACTORY)
499 static int sec_bat_get_temp_by_temp_control_source(struct sec_battery_info
*battery
,
500 enum sec_battery_temp_control_source tcs
)
503 case TEMP_CONTROL_SOURCE_CHG_THM
:
504 return battery
->chg_temp
;
505 case TEMP_CONTROL_SOURCE_USB_THM
:
506 return battery
->usb_temp
;
507 case TEMP_CONTROL_SOURCE_WPC_THM
:
508 return battery
->wpc_temp
;
509 case TEMP_CONTROL_SOURCE_NONE
:
510 case TEMP_CONTROL_SOURCE_BAT_THM
:
512 return battery
->temperature
;
516 static int sec_bat_check_mix_temp(struct sec_battery_info
*battery
, int input_current
)
518 if (battery
->pdata
->chg_temp_check
&& battery
->siop_level
>= 100 && is_not_wireless_type(battery
->cable_type
)) {
519 if ((!battery
->mix_limit
&&
520 (battery
->temperature
>= battery
->pdata
->mix_high_temp
) &&
521 (battery
->chg_temp
>= battery
->pdata
->mix_high_chg_temp
)) ||
522 (battery
->mix_limit
&&
523 (battery
->temperature
> battery
->pdata
->mix_high_temp_recovery
))) {
524 int max_input_current
=
525 battery
->pdata
->full_check_current_1st
+ 50;
527 /* inpu current = float voltage * (topoff_current_1st + 50mA(margin)) / (vbus_level * 0.9) */
528 input_current
= ((battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
) * max_input_current
) /
529 (battery
->input_voltage
* 90) / 10;
530 if (input_current
> max_input_current
)
531 input_current
= max_input_current
;
533 battery
->mix_limit
= true;
534 /* skip other heating control */
535 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
,
536 SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
);
537 } else if (battery
->mix_limit
) {
538 battery
->mix_limit
= false;
541 pr_info("%s: mix_limit(%d), temp(%d), chg_temp(%d), input_current(%d)\n",
542 __func__
, battery
->mix_limit
, battery
->temperature
, battery
->chg_temp
, input_current
);
544 battery
->mix_limit
= false;
546 return input_current
;
549 static int sec_bat_check_wpc_temp(struct sec_battery_info
*battery
, int input_current
)
551 if (is_wireless_type(battery
->cable_type
)) {
552 int wpc_vout_level
= WIRELESS_VOUT_10V
;
554 if (battery
->siop_level
>= 100) {
555 int temp_val
= sec_bat_get_temp_by_temp_control_source(battery
,
556 battery
->pdata
->wpc_temp_control_source
);
558 if ((!battery
->chg_limit
&& temp_val
>= battery
->pdata
->wpc_high_temp
) ||
559 (battery
->chg_limit
&& temp_val
> battery
->pdata
->wpc_high_temp_recovery
)) {
560 battery
->chg_limit
= true;
561 input_current
= battery
->pdata
->wpc_charging_limit_current
;
562 wpc_vout_level
= WIRELESS_VOUT_5V_STEP
;
563 } else if (battery
->chg_limit
) {
564 battery
->chg_limit
= false;
567 if ((is_hv_wireless_type(battery
->cable_type
) &&
568 battery
->cable_type
!= SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE
) ||
569 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
) {
570 int temp_val
= sec_bat_get_temp_by_temp_control_source(battery
,
571 battery
->pdata
->wpc_temp_lcd_on_control_source
);
573 if ((!battery
->chg_limit
&&
574 temp_val
>= battery
->pdata
->wpc_lcd_on_high_temp
) ||
575 (battery
->chg_limit
&&
576 temp_val
> battery
->pdata
->wpc_lcd_on_high_temp_rec
)) {
577 input_current
= battery
->pdata
->wpc_lcd_on_charging_limit_current
;
578 battery
->chg_limit
= true;
579 wpc_vout_level
= (battery
->capacity
< 95) ?
580 WIRELESS_VOUT_5V_STEP
: WIRELESS_VOUT_10V
;
581 } else if (battery
->chg_limit
) {
582 battery
->chg_limit
= false;
584 } else if (battery
->chg_limit
) {
585 battery
->chg_limit
= false;
589 if (is_hv_wireless_type(battery
->cable_type
)) {
590 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_SWELLING_MODE
)
591 wpc_vout_level
= WIRELESS_VOUT_5V_STEP
;
593 if (wpc_vout_level
!= battery
->wpc_vout_level
) {
594 battery
->wpc_vout_level
= wpc_vout_level
;
595 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
) {
596 pr_info("%s: block to set wpc vout level(%d) because otg on\n",
597 __func__
, wpc_vout_level
);
599 union power_supply_propval value
= {0, };
601 value
.intval
= wpc_vout_level
;
602 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
603 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
604 pr_info("%s: change vout level(%d)",
605 __func__
, battery
->wpc_vout_level
);
606 battery
->aicl_current
= 0; /* reset aicl current */
608 } else if (battery
->wpc_vout_level
== WIRELESS_VOUT_10V
&& !battery
->chg_limit
)
609 /* reset aicl current to recover current for unexpected aicl during before vout boosting completion */
610 battery
->aicl_current
= 0;
612 pr_info("%s: change input_current(%d), vout_level(%d), chg_limit(%d)\n",
613 __func__
, input_current
, battery
->wpc_vout_level
, battery
->chg_limit
);
616 return input_current
;
619 static void sec_bat_check_afc_temp(struct sec_battery_info
*battery
, int *input_current
, int *charging_current
)
621 #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_QC30)
622 if (battery
->siop_level
>= 100) {
623 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_CHG_LIMIT
) {
624 battery
->chg_limit
= battery
->vbus_chg_by_siop
= false;
625 *input_current
= battery
->pdata
->pre_afc_input_current
;
627 /* change input current */
628 union power_supply_propval value
;
629 battery
->charge_power
= battery
->input_voltage
* (*input_current
);
630 value
.intval
= *input_current
;
631 psy_do_property(battery
->pdata
->charger_name
, set
,
632 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
633 battery
->input_current
= *input_current
;
635 /* set current event */
636 cancel_delayed_work(&battery
->afc_work
);
637 wake_unlock(&battery
->afc_wake_lock
);
638 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_AFC
,
639 (SEC_BAT_CURRENT_EVENT_CHG_LIMIT
| SEC_BAT_CURRENT_EVENT_AFC
));
640 /* vbus level : 5V --> 9V */
641 if (battery
->chg_limit_recovery_cable
== SEC_BATTERY_CABLE_12V_TA
) {
642 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_12V
);
643 } else if (battery
->chg_limit_recovery_cable
== SEC_BATTERY_CABLE_9V_TA
) {
644 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_9V
);
646 pr_info("%s: cable_type(%d), chg_limit_recovery_cable(%d) vbus_by_siop(%d)\n", __func__
,
647 battery
->cable_type
, battery
->chg_limit_recovery_cable
, battery
->vbus_chg_by_siop
);
648 } else if (!battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
) && (battery
->chg_temp
> battery
->pdata
->chg_high_temp
)) {
649 *input_current
= battery
->pdata
->chg_input_limit_current
;
650 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
651 battery
->chg_limit
= true;
652 } else if (!battery
->chg_limit
&& battery
->max_charge_power
>= (battery
->pdata
->pd_charging_charge_power
- 500) && (battery
->chg_temp
> battery
->pdata
->chg_high_temp
)) {
653 *input_current
= battery
->pdata
->default_input_current
;
654 *charging_current
= battery
->pdata
->default_charging_current
;
655 battery
->chg_limit
= true;
656 } else if (battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
)) {
657 if (battery
->chg_temp
< battery
->pdata
->chg_high_temp_recovery
) {
658 *input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
659 *charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
;
660 battery
->chg_limit
= false;
662 *input_current
= battery
->pdata
->chg_input_limit_current
;
663 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
664 battery
->chg_limit
= true;
666 } else if (battery
->chg_limit
&& battery
->max_charge_power
>= (battery
->pdata
->pd_charging_charge_power
- 500)) {
667 if (battery
->chg_temp
< battery
->pdata
->chg_high_temp_recovery
) {
668 *input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
669 *charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
;
670 battery
->chg_limit
= false;
672 *input_current
= battery
->pdata
->chg_input_limit_current
;
673 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
674 battery
->chg_limit
= true;
677 pr_info("%s: cable_type(%d), chg_limit(%d) vbus_by_siop(%d)\n", __func__
,
678 battery
->cable_type
, battery
->chg_limit
, battery
->vbus_chg_by_siop
);
679 } else if (is_hv_wire_type(battery
->cable_type
) && is_hv_wire_type(battery
->wire_status
) &&
680 !battery
->store_mode
&& (battery
->cable_type
!= SEC_BATTERY_CABLE_QC30
) &&
681 (battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) && !battery
->vbus_chg_by_siop
) {
682 battery
->chg_limit_recovery_cable
= battery
->cable_type
;
683 battery
->vbus_chg_by_siop
= true;
684 battery
->chg_limit
= false;
685 /* vbus level : 9V --> 5V */
686 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V
);
687 pr_info("%s: vbus set 5V by siop(recovery cable: %d)\n", __func__
,battery
->chg_limit_recovery_cable
);
690 if (!battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
) && (battery
->chg_temp
> battery
->pdata
->chg_high_temp
)) {
691 *input_current
= battery
->pdata
->chg_input_limit_current
;
692 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
693 battery
->chg_limit
= true;
694 } else if (battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
) && (battery
->chg_temp
< battery
->pdata
->chg_high_temp_recovery
)) {
695 *input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
696 *charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
;
697 battery
->chg_limit
= false;
702 #if defined(CONFIG_CCIC_NOTIFIER)
703 extern void select_pdo(int num
);
704 static int sec_bat_check_pdic_temp(struct sec_battery_info
*battery
, int input_current
)
706 if (battery
->pdic_ps_rdy
&& battery
->siop_level
>= 100) {
708 struct sec_bat_pdic_list
*pd_list
= &battery
->pd_list
;
709 int pd_index
= pd_list
->now_pd_index
;
711 if (!battery
->chg_limit
) {
712 if (battery
->chg_temp
>= battery
->pdata
->chg_high_temp
) {
713 battery
->chg_limit
= true;
718 if (battery
->chg_temp
<= battery
->pdata
->chg_high_temp_recovery
)
719 battery
->chg_limit
= false;
720 else if (battery
->chg_temp
>= battery
->pdata
->chg_high_temp
)
725 if (battery
->chg_limit
) {
726 input_current
= (input_current
> (battery
->pdata
->nv_charge_power
/ (pd_list
->pd_info
[0].input_voltage
/ 1000))) ?
727 (battery
->pdata
->nv_charge_power
/ (pd_list
->pd_info
[0].input_voltage
/ 1000)) : input_current
;
732 pd_list
->now_pd_index
= pd_index
;
735 (pd_index
>= pd_list
->max_pd_count
) ? (pd_list
->max_pd_count
- 1) : pd_index
;
737 if (pd_list
->now_pd_index
!= pd_index
) {
738 /* change input current before request new pdo
739 * if new pdo's input current is less than now
741 if (pd_list
->pd_info
[pd_index
].input_current
< input_current
) {
742 union power_supply_propval value
= {0, };
744 input_current
= pd_list
->pd_info
[pd_index
].input_current
;
745 value
.intval
= input_current
;
746 battery
->input_current
= input_current
;
747 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SELECT_PDO
,
748 SEC_BAT_CURRENT_EVENT_SELECT_PDO
);
749 psy_do_property(battery
->pdata
->charger_name
, set
,
750 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
752 /* select next pdo */
753 battery
->pdic_ps_rdy
= false;
754 select_pdo(pd_list
->pd_info
[pd_index
].pdo_index
);
755 pr_info("%s: change pd_list - index: %d, pdo_index: %d\n",
756 __func__
, pd_index
, pd_list
->pd_info
[pd_index
].pdo_index
);
759 pr_info("%s: pd_index(%d), input_current(%d), chg_limit(%d)\n",
760 __func__
, pd_index
, input_current
, battery
->chg_limit
);
763 return input_current
;
766 static int sec_bat_check_pd_input_current(struct sec_battery_info
*battery
, int input_current
)
768 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_SELECT_PDO
) {
769 input_current
= battery
->input_current
;
770 pr_info("%s: change input_current(%d), cable_type(%d)\n", __func__
, input_current
, battery
->cable_type
);
773 return input_current
;
778 static int sec_bat_check_afc_input_current(struct sec_battery_info
*battery
, int input_current
)
780 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
) {
783 if (!is_wireless_type(battery
->cable_type
)) {
784 input_current
= battery
->pdata
->pre_afc_input_current
; // 1000mA
785 work_delay
= battery
->pdata
->pre_afc_work_delay
;
787 input_current
= battery
->pdata
->pre_wc_afc_input_current
;
788 /* do not reduce this time, this is for noble pad */
789 work_delay
= battery
->pdata
->pre_wc_afc_work_delay
;
792 wake_lock(&battery
->afc_wake_lock
);
793 if (!delayed_work_pending(&battery
->afc_work
))
794 queue_delayed_work(battery
->monitor_wqueue
,
795 &battery
->afc_work
, msecs_to_jiffies(work_delay
));
797 pr_info("%s: change input_current(%d), cable_type(%d)\n", __func__
, input_current
, battery
->cable_type
);
800 return input_current
;
803 #if defined(CONFIG_CCIC_NOTIFIER)
804 static void sec_bat_get_input_current_in_power_list(struct sec_battery_info
*battery
)
806 int pdo_num
= battery
->pdic_info
.sink_status
.current_pdo_num
;
807 int max_input_current
= 0;
809 max_input_current
= battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_PDIC
].input_current_limit
=
810 battery
->pdic_info
.sink_status
.power_list
[pdo_num
].max_current
;
812 pr_info("%s:max_input_current : %dmA\n", __func__
, max_input_current
);
815 static void sec_bat_get_charging_current_in_power_list(struct sec_battery_info
*battery
)
817 int max_charging_current
= 0;
818 int pdo_num
= battery
->pdic_info
.sink_status
.current_pdo_num
;
819 int pd_power
= (battery
->pdic_info
.sink_status
.power_list
[pdo_num
].max_voltage
*
820 battery
->pdic_info
.sink_status
.power_list
[pdo_num
].max_current
);
822 /* We assume that output voltage to float voltage */
823 max_charging_current
= pd_power
/ (battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
);
824 max_charging_current
= max_charging_current
> battery
->pdata
->max_charging_current
?
825 battery
->pdata
->max_charging_current
: max_charging_current
;
826 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_PDIC
].fast_charging_current
= max_charging_current
;
827 battery
->charge_power
= pd_power
;
829 pr_info("%s:pd_charge_power : %dmW, max_charging_current : %dmA\n", __func__
,
830 battery
->charge_power
, max_charging_current
);
834 static int sec_bat_set_charging_current(struct sec_battery_info
*battery
)
836 static int afc_init
= false;
837 union power_supply_propval value
= {0, };
838 int input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
,
839 charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
,
840 topoff_current
= battery
->pdata
->full_check_current_1st
;
841 #if !defined(CONFIG_SEC_FACTORY)
845 if (battery
->aicl_current
)
846 input_current
= battery
->aicl_current
;
847 mutex_lock(&battery
->iolock
);
848 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) {
850 #if !defined(CONFIG_SEC_FACTORY)
851 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
)) {
852 input_current
= sec_bat_check_mix_temp(battery
, input_current
);
856 /* check input current */
857 #if !defined(CONFIG_SEC_FACTORY)
858 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
)) {
859 if (is_wireless_type(battery
->cable_type
) && battery
->pdata
->wpc_temp_check
) {
860 temp
= sec_bat_check_wpc_temp(battery
, input_current
);
861 if (input_current
> temp
)
862 input_current
= temp
;
864 #if defined(CONFIG_CCIC_NOTIFIER)
865 else if (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
&& battery
->pdata
->chg_temp_check
) {
866 input_current
= sec_bat_check_pdic_temp(battery
, input_current
);
867 input_current
= sec_bat_check_pd_input_current(battery
, input_current
);
870 else if (battery
->pdata
->chg_temp_check
)
871 sec_bat_check_afc_temp(battery
, &input_current
, &charging_current
);
875 input_current
= sec_bat_check_afc_input_current(battery
, input_current
);
876 /* Set limited max current with hv wire cable when store mode is set and LDU
877 Limited max current should be set with over 5% capacity since target could be turned off during boot up */
878 if (battery
->store_mode
&& is_hv_wire_type(battery
->wire_status
) && (battery
->capacity
>= 5)) {
879 input_current
= battery
->pdata
->store_mode_afc_input_current
;
882 sec_bat_get_charging_current_by_siop(battery
, &input_current
, &charging_current
);
884 /* Calculate wireless input current under the specific conditions (wpc_sleep_mode, chg_limit)*/
885 if (battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
) {
886 input_current
= sec_bat_get_wireless_current(battery
, input_current
);
889 /* check topoff current */
890 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
&&
891 battery
->pdata
->full_check_type_2nd
== SEC_BATTERY_FULLCHARGED_CHGPSY
) {
893 battery
->pdata
->full_check_current_2nd
;
896 /* check swelling state */
897 if (is_wireless_type(battery
->cable_type
)) {
898 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
) {
899 charging_current
= (charging_current
> battery
->pdata
->swelling_wc_low_temp_current
) ?
900 battery
->pdata
->swelling_wc_low_temp_current
: charging_current
;
901 topoff_current
= (topoff_current
> battery
->pdata
->swelling_low_temp_topoff
) ?
902 battery
->pdata
->swelling_low_temp_topoff
: topoff_current
;
903 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
) {
904 charging_current
= (charging_current
> battery
->pdata
->swelling_wc_high_temp_current
) ?
905 battery
->pdata
->swelling_wc_high_temp_current
: charging_current
;
906 topoff_current
= (topoff_current
> battery
->pdata
->swelling_high_temp_topoff
) ?
907 battery
->pdata
->swelling_high_temp_topoff
: topoff_current
;
908 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
) {
909 charging_current
= (charging_current
> battery
->pdata
->swelling_wc_low_temp_current
) ?
910 battery
->pdata
->swelling_wc_low_temp_current
: charging_current
;
913 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
) {
914 charging_current
= (charging_current
> battery
->pdata
->swelling_low_temp_current
) ?
915 battery
->pdata
->swelling_low_temp_current
: charging_current
;
916 topoff_current
= (topoff_current
> battery
->pdata
->swelling_low_temp_topoff
) ?
917 battery
->pdata
->swelling_low_temp_topoff
: topoff_current
;
918 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
) {
919 charging_current
= (charging_current
> battery
->pdata
->swelling_high_temp_current
) ?
920 battery
->pdata
->swelling_high_temp_current
: charging_current
;
921 topoff_current
= (topoff_current
> battery
->pdata
->swelling_high_temp_topoff
) ?
922 battery
->pdata
->swelling_high_temp_topoff
: topoff_current
;
923 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
) {
924 charging_current
= (charging_current
> battery
->pdata
->swelling_low_temp_current
) ?
925 battery
->pdata
->swelling_low_temp_current
: charging_current
;
928 /* usb unconfigured or suspend*/
929 if ((battery
->cable_type
== SEC_BATTERY_CABLE_USB
) && !lpcharge
&&
930 (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL_DEFAULT
)) {
931 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_USB_100MA
) {
932 pr_info("%s: usb unconfigured\n", __func__
);
933 input_current
= USB_CURRENT_UNCONFIGURED
;
934 charging_current
= USB_CURRENT_UNCONFIGURED
;
940 /* In wireless charging, must be set charging current before input current. */
941 if (is_wireless_type(battery
->cable_type
) &&
942 battery
->charging_current
!= charging_current
) {
943 value
.intval
= charging_current
;
944 psy_do_property(battery
->pdata
->charger_name
, set
,
945 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
946 battery
->charging_current
= charging_current
;
948 /* set input current, charging current */
949 if ((battery
->input_current
!= input_current
) ||
950 (battery
->charging_current
!= charging_current
)) {
951 /* update charge power */
952 battery
->charge_power
= battery
->input_voltage
* input_current
;
953 if (battery
->charge_power
> battery
->max_charge_power
)
954 battery
->max_charge_power
= battery
->charge_power
;
956 value
.intval
= input_current
;
957 psy_do_property(battery
->pdata
->charger_name
, set
,
958 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
959 battery
->input_current
= input_current
;
961 value
.intval
= charging_current
;
962 psy_do_property(battery
->pdata
->charger_name
, set
,
963 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
965 if (charging_current
<= 100)
966 battery
->charging_current
= 100;
968 battery
->charging_current
= charging_current
;
969 pr_info("%s: power(%d), input(%d), charge(%d)\n", __func__
,
970 battery
->charge_power
, battery
->input_current
, battery
->charging_current
);
973 /* set topoff current */
974 if (battery
->topoff_current
!= topoff_current
) {
975 value
.intval
= topoff_current
;
976 psy_do_property(battery
->pdata
->charger_name
, set
,
977 POWER_SUPPLY_PROP_CURRENT_FULL
, value
);
978 battery
->topoff_current
= topoff_current
;
982 #if defined(CONFIG_AFC_CHARGER_MODE)
984 psy_do_property(battery
->pdata
->charger_name
, set
,
985 POWER_SUPPLY_PROP_AFC_CHARGER_MODE
,
989 mutex_unlock(&battery
->iolock
);
993 static int sec_bat_set_charge(
994 struct sec_battery_info
*battery
,
997 union power_supply_propval val
= {0, };
998 ktime_t current_time
= {0, };
999 struct timespec ts
= {0, };
1001 if (battery
->cable_type
== SEC_BATTERY_CABLE_HMT_CONNECTED
)
1004 if ((battery
->current_event
& SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
) &&
1005 (chg_mode
== SEC_BAT_CHG_MODE_CHARGING
)) {
1006 dev_info(battery
->dev
, "%s: charge disable by HMT\n", __func__
);
1007 chg_mode
= SEC_BAT_CHG_MODE_CHARGING_OFF
;
1010 battery
->charger_mode
= chg_mode
;
1011 pr_info("%s set %s mode\n", __func__
, sec_bat_charge_mode_str
[chg_mode
]);
1013 val
.intval
= battery
->status
;
1014 psy_do_property(battery
->pdata
->charger_name
, set
,
1015 POWER_SUPPLY_PROP_STATUS
, val
);
1016 current_time
= ktime_get_boottime();
1017 ts
= ktime_to_timespec(current_time
);
1019 if (chg_mode
== SEC_BAT_CHG_MODE_CHARGING
) {
1020 /*Reset charging start time only in initial charging start */
1021 if (battery
->charging_start_time
== 0) {
1024 battery
->charging_start_time
= ts
.tv_sec
;
1025 battery
->charging_next_time
=
1026 battery
->pdata
->charging_reset_time
;
1028 battery
->charging_block
= false;
1030 #if defined(CONFIG_BATTERY_SBM_DATA)
1031 sec_bat_add_sbm_data(battery
, SBM_DATA_SET_CHARGE
);
1034 battery
->charging_start_time
= 0;
1035 battery
->charging_passed_time
= 0;
1036 battery
->charging_next_time
= 0;
1037 battery
->charging_fullcharged_time
= 0;
1038 battery
->full_check_cnt
= 0;
1039 battery
->charging_block
= true;
1040 #if defined(CONFIG_STEP_CHARGING)
1041 sec_bat_reset_step_charging(battery
);
1043 #if defined(CONFIG_BATTERY_CISD)
1044 battery
->usb_overheat_check
= false;
1045 battery
->cisd
.ab_vbat_check_count
= 0;
1046 if (chg_mode
== SEC_BAT_CHG_MODE_BUCK_OFF
) {
1047 battery
->cisd
.data
[CISD_DATA_BUCK_OFF
]++;
1048 battery
->cisd
.data
[CISD_DATA_BUCK_OFF_PER_DAY
]++;
1053 battery
->temp_highlimit_cnt
= 0;
1054 battery
->temp_high_cnt
= 0;
1055 battery
->temp_low_cnt
= 0;
1056 battery
->temp_recover_cnt
= 0;
1058 val
.intval
= chg_mode
;
1059 psy_do_property(battery
->pdata
->charger_name
, set
,
1060 POWER_SUPPLY_PROP_CHARGING_ENABLED
, val
);
1065 static bool sec_bat_check_by_psy(struct sec_battery_info
*battery
)
1067 char *psy_name
= NULL
;
1068 union power_supply_propval value
= {0, };
1071 switch (battery
->pdata
->battery_check_type
) {
1072 case SEC_BATTERY_CHECK_PMIC
:
1073 psy_name
= battery
->pdata
->pmic_name
;
1075 case SEC_BATTERY_CHECK_FUELGAUGE
:
1076 psy_name
= battery
->pdata
->fuelgauge_name
;
1078 case SEC_BATTERY_CHECK_CHARGER
:
1079 psy_name
= battery
->pdata
->charger_name
;
1082 dev_err(battery
->dev
,
1083 "%s: Invalid Battery Check Type\n", __func__
);
1085 goto battery_check_error
;
1089 psy_do_property(psy_name
, get
,
1090 POWER_SUPPLY_PROP_PRESENT
, value
);
1091 ret
= (bool)value
.intval
;
1093 battery_check_error
:
1097 static bool sec_bat_check(struct sec_battery_info
*battery
)
1101 if (battery
->factory_mode
|| battery
->is_jig_on
) {
1102 dev_dbg(battery
->dev
, "%s: No need to check in factory mode\n",
1107 if (battery
->health
!= POWER_SUPPLY_HEALTH_GOOD
&&
1108 battery
->health
!= POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
) {
1109 dev_dbg(battery
->dev
, "%s: No need to check\n", __func__
);
1113 switch (battery
->pdata
->battery_check_type
) {
1114 case SEC_BATTERY_CHECK_ADC
:
1115 if(battery
->cable_type
== SEC_BATTERY_CABLE_NONE
)
1116 ret
= battery
->present
;
1118 ret
= sec_bat_check_vf_adc(battery
);
1120 case SEC_BATTERY_CHECK_INT
:
1121 case SEC_BATTERY_CHECK_CALLBACK
:
1122 if(battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) {
1123 ret
= battery
->present
;
1125 if (battery
->pdata
->check_battery_callback
)
1126 ret
= battery
->pdata
->check_battery_callback();
1129 case SEC_BATTERY_CHECK_PMIC
:
1130 case SEC_BATTERY_CHECK_FUELGAUGE
:
1131 case SEC_BATTERY_CHECK_CHARGER
:
1132 ret
= sec_bat_check_by_psy(battery
);
1134 case SEC_BATTERY_CHECK_NONE
:
1135 dev_dbg(battery
->dev
, "%s: No Check\n", __func__
);
1143 static bool sec_bat_get_cable_type(
1144 struct sec_battery_info
*battery
,
1145 int cable_source_type
)
1148 int cable_type
= battery
->cable_type
;
1150 if (cable_source_type
& SEC_BATTERY_CABLE_SOURCE_CALLBACK
) {
1151 if (battery
->pdata
->check_cable_callback
)
1153 battery
->pdata
->check_cable_callback();
1156 if (cable_source_type
& SEC_BATTERY_CABLE_SOURCE_ADC
) {
1157 if (gpio_get_value_cansleep(
1158 battery
->pdata
->bat_gpio_ta_nconnected
) ^
1159 battery
->pdata
->bat_polarity_ta_nconnected
)
1160 cable_type
= SEC_BATTERY_CABLE_NONE
;
1163 sec_bat_get_charger_type_adc(battery
);
1166 if (battery
->cable_type
== cable_type
) {
1167 dev_dbg(battery
->dev
,
1168 "%s: No need to change cable status\n", __func__
);
1170 if (cable_type
< SEC_BATTERY_CABLE_NONE
||
1171 cable_type
>= SEC_BATTERY_CABLE_MAX
) {
1172 dev_err(battery
->dev
,
1173 "%s: Invalid cable type\n", __func__
);
1175 battery
->cable_type
= cable_type
;
1176 if (battery
->pdata
->check_cable_result_callback
)
1177 battery
->pdata
->check_cable_result_callback(
1178 battery
->cable_type
);
1182 dev_dbg(battery
->dev
, "%s: Cable Changed (%d)\n",
1183 __func__
, battery
->cable_type
);
1190 static void sec_bat_set_charging_status(struct sec_battery_info
*battery
,
1192 union power_supply_propval value
= {0, };
1195 case POWER_SUPPLY_STATUS_CHARGING
:
1196 if (battery
->siop_level
!= 100)
1197 battery
->stop_timer
= true;
1199 case POWER_SUPPLY_STATUS_NOT_CHARGING
:
1200 case POWER_SUPPLY_STATUS_DISCHARGING
:
1201 if ((battery
->status
== POWER_SUPPLY_STATUS_FULL
||
1202 (battery
->capacity
== 100 && !battery
->slate_mode
)) &&
1203 !battery
->store_mode
) {
1205 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
1206 POWER_SUPPLY_PROP_CHARGE_FULL
, value
);
1207 /* To get SOC value (NOT raw SOC), need to reset value */
1209 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
1210 POWER_SUPPLY_PROP_CAPACITY
, value
);
1211 battery
->capacity
= value
.intval
;
1213 battery
->expired_time
= battery
->pdata
->expired_time
;
1214 battery
->prev_safety_time
= 0;
1216 case POWER_SUPPLY_STATUS_FULL
:
1217 if (is_wireless_type(battery
->cable_type
)) {
1218 bool send_cs100_cmd
= true;
1220 #ifdef CONFIG_CS100_JPNCONCEPT
1221 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
1222 POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID
, value
);
1224 /* In case of the JPN PAD, this pad blocks the charge after give the cs100 command. */
1225 send_cs100_cmd
= (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
|| value
.intval
);
1227 if (send_cs100_cmd
) {
1228 value
.intval
= POWER_SUPPLY_STATUS_FULL
;
1229 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
1230 POWER_SUPPLY_PROP_STATUS
, value
);
1237 battery
->status
= status
;
1240 static bool sec_bat_battery_cable_check(struct sec_battery_info
*battery
)
1242 if (!sec_bat_check(battery
)) {
1243 if (battery
->check_count
< battery
->pdata
->check_count
)
1244 battery
->check_count
++;
1246 dev_err(battery
->dev
,
1247 "%s: Battery Disconnected\n", __func__
);
1248 battery
->present
= false;
1249 battery
->health
= POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
;
1251 if (battery
->status
!=
1252 POWER_SUPPLY_STATUS_DISCHARGING
) {
1253 sec_bat_set_charging_status(battery
,
1254 POWER_SUPPLY_STATUS_NOT_CHARGING
);
1255 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
1258 if (battery
->pdata
->check_battery_result_callback
)
1260 check_battery_result_callback();
1264 battery
->check_count
= 0;
1266 battery
->present
= true;
1268 if (battery
->health
== POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
) {
1269 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
1271 if (battery
->status
== POWER_SUPPLY_STATUS_NOT_CHARGING
) {
1272 sec_bat_set_charging_status(battery
,
1273 POWER_SUPPLY_STATUS_CHARGING
);
1274 #if defined(CONFIG_BATTERY_SWELLING)
1275 if (!battery
->swelling_mode
)
1277 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1281 dev_dbg(battery
->dev
, "%s: Battery Connected\n", __func__
);
1283 if (battery
->pdata
->cable_check_type
&
1284 SEC_BATTERY_CABLE_CHECK_POLLING
) {
1285 if (sec_bat_get_cable_type(battery
,
1286 battery
->pdata
->cable_source_type
)) {
1287 wake_lock(&battery
->cable_wake_lock
);
1288 queue_delayed_work(battery
->monitor_wqueue
,
1289 &battery
->cable_work
, 0);
1295 static int sec_bat_ovp_uvlo_by_psy(struct sec_battery_info
*battery
)
1297 char *psy_name
= NULL
;
1298 union power_supply_propval value
= {0, };
1300 value
.intval
= POWER_SUPPLY_HEALTH_GOOD
;
1302 switch (battery
->pdata
->ovp_uvlo_check_type
) {
1303 case SEC_BATTERY_OVP_UVLO_PMICPOLLING
:
1304 psy_name
= battery
->pdata
->pmic_name
;
1306 case SEC_BATTERY_OVP_UVLO_CHGPOLLING
:
1307 psy_name
= battery
->pdata
->charger_name
;
1310 dev_err(battery
->dev
,
1311 "%s: Invalid OVP/UVLO Check Type\n", __func__
);
1312 goto ovp_uvlo_check_error
;
1316 psy_do_property(psy_name
, get
,
1317 POWER_SUPPLY_PROP_HEALTH
, value
);
1319 ovp_uvlo_check_error
:
1320 return value
.intval
;
1323 static bool sec_bat_ovp_uvlo_result(
1324 struct sec_battery_info
*battery
, int health
)
1326 if (battery
->health
!= health
) {
1327 battery
->health
= health
;
1329 case POWER_SUPPLY_HEALTH_GOOD
:
1330 dev_info(battery
->dev
, "%s: Safe voltage\n", __func__
);
1331 dev_info(battery
->dev
, "%s: is_recharging : %d\n", __func__
, battery
->is_recharging
);
1332 sec_bat_set_charging_status(battery
,
1333 POWER_SUPPLY_STATUS_CHARGING
);
1334 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1335 #if defined(CONFIG_BATTERY_SWELLING)
1336 if (!battery
->swelling_mode
)
1338 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1339 battery
->health_check_count
= 0;
1341 case POWER_SUPPLY_HEALTH_OVERVOLTAGE
:
1342 case POWER_SUPPLY_HEALTH_UNDERVOLTAGE
:
1343 dev_info(battery
->dev
,
1344 "%s: Unsafe voltage (%d)\n",
1346 sec_bat_set_charging_status(battery
,
1347 POWER_SUPPLY_STATUS_NOT_CHARGING
);
1348 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
1349 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
1350 battery
->is_recharging
= false;
1351 battery
->health_check_count
= DEFAULT_HEALTH_CHECK_COUNT
;
1352 #if defined(CONFIG_BATTERY_CISD)
1353 battery
->cisd
.data
[CISD_DATA_UNSAFETY_VOLTAGE
]++;
1354 battery
->cisd
.data
[CISD_DATA_UNSAFE_VOLTAGE_PER_DAY
]++;
1356 /* Take the wakelock during 10 seconds
1357 when over-voltage status is detected */
1358 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
1361 power_supply_changed(battery
->psy_bat
);
1368 static bool sec_bat_ovp_uvlo(struct sec_battery_info
*battery
)
1370 int health
= POWER_SUPPLY_HEALTH_GOOD
;
1372 if (battery
->wdt_kick_disable
) {
1373 dev_dbg(battery
->dev
,
1374 "%s: No need to check in wdt test\n",
1377 } else if ((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
1378 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
1379 dev_dbg(battery
->dev
, "%s: No need to check in Full status", __func__
);
1383 if (battery
->health
!= POWER_SUPPLY_HEALTH_GOOD
&&
1384 battery
->health
!= POWER_SUPPLY_HEALTH_OVERVOLTAGE
&&
1385 battery
->health
!= POWER_SUPPLY_HEALTH_UNDERVOLTAGE
) {
1386 dev_dbg(battery
->dev
, "%s: No need to check\n", __func__
);
1390 health
= battery
->health
;
1392 switch (battery
->pdata
->ovp_uvlo_check_type
) {
1393 case SEC_BATTERY_OVP_UVLO_CALLBACK
:
1394 if (battery
->pdata
->ovp_uvlo_callback
)
1395 health
= battery
->pdata
->ovp_uvlo_callback();
1397 case SEC_BATTERY_OVP_UVLO_PMICPOLLING
:
1398 case SEC_BATTERY_OVP_UVLO_CHGPOLLING
:
1399 health
= sec_bat_ovp_uvlo_by_psy(battery
);
1401 case SEC_BATTERY_OVP_UVLO_PMICINT
:
1402 case SEC_BATTERY_OVP_UVLO_CHGINT
:
1403 /* nothing for interrupt check */
1408 /* Move the location for calling the get_health
1409 in case of attaching the jig */
1410 if (battery
->factory_mode
|| battery
->is_jig_on
) {
1411 dev_dbg(battery
->dev
,
1412 "%s: No need to check in factory mode\n",
1417 return sec_bat_ovp_uvlo_result(battery
, health
);
1420 static bool sec_bat_check_recharge(struct sec_battery_info
*battery
)
1422 #if defined(CONFIG_BATTERY_SWELLING)
1423 if (battery
->swelling_mode
== SWELLING_MODE_CHARGING
||
1424 battery
->swelling_mode
== SWELLING_MODE_FULL
) {
1425 pr_info("%s: Skip normal recharge check routine for swelling mode\n",
1430 if ((battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) &&
1431 (battery
->pdata
->full_condition_type
&
1432 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL
) &&
1433 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
1434 dev_info(battery
->dev
,
1435 "%s: Re-charging by NOTIMEFULL (%d)\n",
1436 __func__
, battery
->capacity
);
1437 goto check_recharge_check_count
;
1440 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
&&
1441 battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
) {
1442 int recharging_voltage
= battery
->pdata
->recharge_condition_vcell
;
1443 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
) {
1444 /* float voltage - 150mV */
1445 recharging_voltage
=\
1446 (battery
->pdata
->chg_float_voltage
/\
1447 battery
->pdata
->chg_float_voltage_conv
) - 150;
1448 dev_info(battery
->dev
, "%s: recharging voltage changed by low temp(%d)\n",
1449 __func__
, recharging_voltage
);
1451 dev_info(battery
->dev
, "%s: recharging voltage (%d)\n",
1452 __func__
, recharging_voltage
);
1454 if ((battery
->pdata
->recharge_condition_type
&
1455 SEC_BATTERY_RECHARGE_CONDITION_SOC
) &&
1456 (battery
->capacity
<=
1457 battery
->pdata
->recharge_condition_soc
)) {
1458 battery
->expired_time
= battery
->pdata
->recharging_expired_time
;
1459 battery
->prev_safety_time
= 0;
1460 dev_info(battery
->dev
,
1461 "%s: Re-charging by SOC (%d)\n",
1462 __func__
, battery
->capacity
);
1463 goto check_recharge_check_count
;
1466 if ((battery
->pdata
->recharge_condition_type
&
1467 SEC_BATTERY_RECHARGE_CONDITION_AVGVCELL
) &&
1468 (battery
->voltage_avg
<= recharging_voltage
)) {
1469 battery
->expired_time
= battery
->pdata
->recharging_expired_time
;
1470 battery
->prev_safety_time
= 0;
1471 dev_info(battery
->dev
,
1472 "%s: Re-charging by average VCELL (%d)\n",
1473 __func__
, battery
->voltage_avg
);
1474 goto check_recharge_check_count
;
1477 if ((battery
->pdata
->recharge_condition_type
&
1478 SEC_BATTERY_RECHARGE_CONDITION_VCELL
) &&
1479 (battery
->voltage_now
<= recharging_voltage
)) {
1480 battery
->expired_time
= battery
->pdata
->recharging_expired_time
;
1481 battery
->prev_safety_time
= 0;
1482 dev_info(battery
->dev
,
1483 "%s: Re-charging by VCELL (%d)\n",
1484 __func__
, battery
->voltage_now
);
1485 goto check_recharge_check_count
;
1489 battery
->recharge_check_cnt
= 0;
1492 check_recharge_check_count
:
1493 if (battery
->recharge_check_cnt
<
1494 battery
->pdata
->recharge_check_count
)
1495 battery
->recharge_check_cnt
++;
1496 dev_dbg(battery
->dev
,
1497 "%s: recharge count = %d\n",
1498 __func__
, battery
->recharge_check_cnt
);
1500 if (battery
->recharge_check_cnt
>=
1501 battery
->pdata
->recharge_check_count
)
1507 static bool sec_bat_voltage_check(struct sec_battery_info
*battery
)
1509 union power_supply_propval value
= {0, };
1511 if (battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
1512 dev_dbg(battery
->dev
,
1513 "%s: Charging Disabled\n", __func__
);
1517 /* OVP/UVLO check */
1518 if (sec_bat_ovp_uvlo(battery
)) {
1519 if (battery
->pdata
->ovp_uvlo_result_callback
)
1521 ovp_uvlo_result_callback(battery
->health
);
1525 if ((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
1526 #if defined(CONFIG_BATTERY_SWELLING)
1527 (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
||
1528 battery
->is_recharging
|| battery
->swelling_mode
)) {
1530 (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
||
1531 battery
->is_recharging
)) {
1534 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
1535 POWER_SUPPLY_PROP_CAPACITY
, value
);
1537 battery
->pdata
->full_condition_soc
&&
1538 battery
->voltage_now
<
1539 (battery
->pdata
->recharge_condition_vcell
- 50)) {
1540 sec_bat_set_charging_status(battery
,
1541 POWER_SUPPLY_STATUS_CHARGING
);
1542 dev_info(battery
->dev
,
1543 "%s: battery status full -> charging, RepSOC(%d)\n", __func__
, value
.intval
);
1548 /* Re-Charging check */
1549 if (sec_bat_check_recharge(battery
)) {
1550 if (battery
->pdata
->full_check_type
!=
1551 SEC_BATTERY_FULLCHARGED_NONE
)
1552 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1554 battery
->charging_mode
= SEC_BATTERY_CHARGING_2ND
;
1555 battery
->is_recharging
= true;
1556 #if defined(CONFIG_BATTERY_CISD)
1557 battery
->cisd
.recharge_count
++;
1558 battery
->cisd
.recharge_count_2
++;
1559 battery
->cisd
.data
[CISD_DATA_RECHARGING_COUNT
]++;
1560 battery
->cisd
.data
[CISD_DATA_RECHARGING_COUNT_PER_DAY
]++;
1562 #if defined(CONFIG_BATTERY_SWELLING)
1563 if (!battery
->swelling_mode
)
1565 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1572 #if defined(CONFIG_BATTERY_SWELLING)
1573 static void sec_bat_swelling_check(struct sec_battery_info
*battery
)
1575 union power_supply_propval val
= {0, };
1576 int swelling_rechg_voltage
= battery
->pdata
->swelling_high_rechg_voltage
;
1577 bool en_swelling
= false, en_rechg
= false;
1578 int swelling_high_recovery
= battery
->pdata
->swelling_high_temp_recov
;
1580 if (is_wireless_type(battery
->cable_type
)) {
1581 swelling_high_recovery
= battery
->pdata
->swelling_wc_high_temp_recov
;
1583 pr_info("%s: swelling highblock(%d), highrecov(%d)\n", __func__
, battery
->pdata
->swelling_high_temp_block
, swelling_high_recovery
);
1585 psy_do_property(battery
->pdata
->charger_name
, get
,
1586 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
1588 pr_info("%s: status(%d), swell_mode(%d:%d:%d), cv(%d)mV, temp(%d)\n",
1589 __func__
, battery
->status
, battery
->swelling_mode
,
1590 battery
->charging_block
, (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
),
1591 val
.intval
, battery
->temperature
);
1594 under voltage over voltage, battery missing */
1595 if ((battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) ||\
1596 (battery
->status
== POWER_SUPPLY_STATUS_NOT_CHARGING
) ||
1597 battery
->skip_swelling
) {
1598 pr_debug("%s: DISCHARGING or NOT-CHARGING or 15 test mode. stop swelling mode\n", __func__
);
1599 battery
->swelling_mode
= SWELLING_MODE_NONE
;
1600 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1601 goto skip_swelling_check
;
1604 if (!battery
->swelling_mode
) {
1605 if (((battery
->temperature
>= battery
->pdata
->swelling_high_temp_block
) ||
1606 (battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_2nd
)) &&
1607 battery
->pdata
->temp_check_type
) {
1608 pr_info("%s: swelling mode start. stop charging\n", __func__
);
1609 battery
->swelling_mode
= SWELLING_MODE_CHARGING
;
1610 battery
->swelling_full_check_cnt
= 0;
1611 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
1613 if (battery
->temperature
>= battery
->pdata
->swelling_high_temp_block
) {
1614 #if defined(CONFIG_BATTERY_CISD)
1615 battery
->cisd
.data
[CISD_DATA_HIGH_TEMP_SWELLING
]++;
1616 battery
->cisd
.data
[CISD_DATA_HIGH_TEMP_SWELLING_PER_DAY
]++;
1618 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
,
1619 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1620 } else if (battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_2nd
) {
1621 #if defined(CONFIG_BATTERY_CISD)
1622 battery
->cisd
.data
[CISD_DATA_LOW_TEMP_SWELLING
]++;
1623 battery
->cisd
.data
[CISD_DATA_LOW_TEMP_SWELLING_PER_DAY
]++;
1625 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
,
1626 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1629 } else if ((battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_1st
) &&
1630 !(battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
)) {
1631 pr_info("%s: low temperature reduce current\n", __func__
);
1632 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP
,
1633 SEC_BAT_CURRENT_EVENT_LOW_TEMP
);
1634 } else if ((battery
->temperature
>= battery
->pdata
->swelling_low_temp_recov_1st
) &&
1635 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
)) {
1636 pr_info("%s: normal temperature temperature recover current\n", __func__
);
1637 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_LOW_TEMP
);
1641 if (!battery
->voltage_now
)
1644 if (battery
->swelling_mode
) {
1645 if (battery
->temperature
<= battery
->pdata
->swelling_low_temp_recov_2nd
) {
1646 swelling_rechg_voltage
= battery
->pdata
->swelling_low_rechg_voltage
;
1649 if ((battery
->temperature
<= swelling_high_recovery
) &&
1650 (battery
->temperature
>= battery
->pdata
->swelling_low_temp_recov_2nd
)) {
1651 pr_info("%s: swelling mode end. restart charging\n", __func__
);
1652 battery
->swelling_mode
= SWELLING_MODE_NONE
;
1653 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1654 if ((battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_1st
) ||
1655 ((battery
->temperature
< battery
->pdata
->swelling_low_temp_recov_1st
) &&
1656 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
))) {
1657 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP
,
1658 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1660 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1662 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1663 /* restore 4.4V float voltage */
1664 val
.intval
= battery
->pdata
->swelling_normal_float_voltage
;
1665 psy_do_property(battery
->pdata
->charger_name
, set
,
1666 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
1667 #if defined(CONFIG_BATTERY_CISD)
1668 battery
->cisd
.data
[CISD_DATA_SWELLING_RECOVERY_CNT
]++;
1669 battery
->cisd
.data
[CISD_DATA_SWELLING_RECOVERY_CNT_PER_DAY
]++;
1671 } else if (battery
->voltage_now
< swelling_rechg_voltage
&&
1672 battery
->charging_block
) {
1673 pr_info("%s: swelling mode recharging start. Vbatt(%d)\n",
1674 __func__
, battery
->voltage_now
);
1675 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1677 /* change drop float voltage */
1678 val
.intval
= battery
->pdata
->swelling_drop_float_voltage
;
1679 psy_do_property(battery
->pdata
->charger_name
, set
,
1680 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
1681 /* set charging enable */
1682 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1683 if (battery
->temperature
< battery
->pdata
->swelling_low_temp_recov_2nd
) {
1684 pr_info("%s: swelling mode reduce charging current(LOW-temp:%d)\n",
1685 __func__
, battery
->temperature
);
1686 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
,
1687 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1688 } else if (battery
->temperature
> swelling_high_recovery
) {
1689 pr_info("%s: swelling mode reduce charging current(HIGH-temp:%d)\n",
1690 __func__
, battery
->temperature
);
1691 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
,
1692 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1694 #if defined(CONFIG_BATTERY_CISD)
1695 battery
->cisd
.data
[CISD_DATA_SWELLING_CHARGING_COUNT
]++;
1696 battery
->cisd
.data
[CISD_DATA_SWELLING_CHARGING_COUNT_PER_DAY
]++;
1701 if (en_swelling
&& !en_rechg
) {
1702 pr_info("%s : SAFETY TIME RESET (SWELLING MODE CHARING STOP!)\n", __func__
);
1703 battery
->expired_time
= battery
->pdata
->expired_time
;
1704 battery
->prev_safety_time
= 0;
1707 skip_swelling_check
:
1708 dev_dbg(battery
->dev
, "%s end\n", __func__
);
1712 #if defined(CONFIG_BATTERY_AGE_FORECAST)
1713 static bool sec_bat_set_aging_step(struct sec_battery_info
*battery
, int step
)
1715 union power_supply_propval value
= {0, };
1717 if (battery
->pdata
->num_age_step
<= 0 || step
< 0 || step
>= battery
->pdata
->num_age_step
) {
1718 pr_info("%s: [AGE] abnormal age step : %d/%d\n",
1719 __func__
, step
, battery
->pdata
->num_age_step
-1);
1723 battery
->pdata
->age_step
= step
;
1726 battery
->pdata
->chg_float_voltage
=
1727 battery
->pdata
->age_data
[battery
->pdata
->age_step
].float_voltage
;
1728 battery
->pdata
->swelling_normal_float_voltage
=
1729 battery
->pdata
->chg_float_voltage
;
1730 if (!battery
->swelling_mode
) {
1731 value
.intval
= battery
->pdata
->chg_float_voltage
;
1732 psy_do_property(battery
->pdata
->charger_name
, set
,
1733 POWER_SUPPLY_PROP_VOLTAGE_MAX
, value
);
1736 /* full/recharge condition */
1737 battery
->pdata
->recharge_condition_vcell
=
1738 battery
->pdata
->age_data
[battery
->pdata
->age_step
].recharge_condition_vcell
;
1739 battery
->pdata
->full_condition_soc
=
1740 battery
->pdata
->age_data
[battery
->pdata
->age_step
].full_condition_soc
;
1741 battery
->pdata
->full_condition_vcell
=
1742 battery
->pdata
->age_data
[battery
->pdata
->age_step
].full_condition_vcell
;
1744 value
.intval
= battery
->pdata
->full_condition_soc
;
1745 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
1746 POWER_SUPPLY_PROP_CAPACITY_LEVEL
, value
);
1748 dev_info(battery
->dev
,
1749 "%s: Step(%d/%d), Cycle(%d), float_v(%d), r_v(%d), f_s(%d), f_vl(%d)\n",
1751 battery
->pdata
->age_step
, battery
->pdata
->num_age_step
-1, battery
->batt_cycle
,
1752 battery
->pdata
->chg_float_voltage
,
1753 battery
->pdata
->recharge_condition_vcell
,
1754 battery
->pdata
->full_condition_soc
,
1755 battery
->pdata
->full_condition_vcell
);
1760 static void sec_bat_aging_check(struct sec_battery_info
*battery
)
1762 int prev_step
= battery
->pdata
->age_step
;
1766 if (battery
->pdata
->num_age_step
<= 0 || battery
->batt_cycle
< 0)
1769 if (battery
->temperature
< 50) {
1770 pr_info("%s: [AGE] skip (temperature:%d)\n", __func__
, battery
->temperature
);
1774 for (calc_step
= battery
->pdata
->num_age_step
- 1; calc_step
>= 0; calc_step
--) {
1775 if (battery
->pdata
->age_data
[calc_step
].cycle
<= battery
->batt_cycle
)
1779 if (calc_step
== prev_step
)
1782 ret
= sec_bat_set_aging_step(battery
, calc_step
);
1783 dev_info(battery
->dev
,
1784 "%s: %s change step (%d->%d), Cycle(%d)\n",
1785 __func__
, ret
? "Succeed in" : "Fail to",
1786 prev_step
, battery
->pdata
->age_step
, battery
->batt_cycle
);
1790 static bool sec_bat_temperature(
1791 struct sec_battery_info
*battery
)
1796 if (is_wireless_type(battery
->cable_type
)) {
1797 battery
->temp_highlimit_threshold
=
1798 battery
->pdata
->temp_highlimit_threshold_normal
;
1799 battery
->temp_highlimit_recovery
=
1800 battery
->pdata
->temp_highlimit_recovery_normal
;
1801 battery
->temp_high_threshold
=
1802 battery
->pdata
->wpc_high_threshold_normal
;
1803 battery
->temp_high_recovery
=
1804 battery
->pdata
->wpc_high_recovery_normal
;
1805 battery
->temp_low_recovery
=
1806 battery
->pdata
->wpc_low_recovery_normal
;
1807 battery
->temp_low_threshold
=
1808 battery
->pdata
->wpc_low_threshold_normal
;
1811 battery
->temp_highlimit_threshold
=
1812 battery
->pdata
->temp_highlimit_threshold_lpm
;
1813 battery
->temp_highlimit_recovery
=
1814 battery
->pdata
->temp_highlimit_recovery_lpm
;
1815 battery
->temp_high_threshold
=
1816 battery
->pdata
->temp_high_threshold_lpm
;
1817 battery
->temp_high_recovery
=
1818 battery
->pdata
->temp_high_recovery_lpm
;
1819 battery
->temp_low_recovery
=
1820 battery
->pdata
->temp_low_recovery_lpm
;
1821 battery
->temp_low_threshold
=
1822 battery
->pdata
->temp_low_threshold_lpm
;
1824 battery
->temp_highlimit_threshold
=
1825 battery
->pdata
->temp_highlimit_threshold_normal
;
1826 battery
->temp_highlimit_recovery
=
1827 battery
->pdata
->temp_highlimit_recovery_normal
;
1828 battery
->temp_high_threshold
=
1829 battery
->pdata
->temp_high_threshold_normal
;
1830 battery
->temp_high_recovery
=
1831 battery
->pdata
->temp_high_recovery_normal
;
1832 battery
->temp_low_recovery
=
1833 battery
->pdata
->temp_low_recovery_normal
;
1834 battery
->temp_low_threshold
=
1835 battery
->pdata
->temp_low_threshold_normal
;
1838 dev_info(battery
->dev
,
1839 "%s: HLT(%d) HLR(%d) HT(%d), HR(%d), LT(%d), LR(%d)\n",
1840 __func__
, battery
->temp_highlimit_threshold
,
1841 battery
->temp_highlimit_recovery
,
1842 battery
->temp_high_threshold
,
1843 battery
->temp_high_recovery
,
1844 battery
->temp_low_threshold
,
1845 battery
->temp_low_recovery
);
1849 static bool sec_bat_temperature_check(
1850 struct sec_battery_info
*battery
)
1853 int pre_health
= POWER_SUPPLY_HEALTH_GOOD
;
1855 if (battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
1856 battery
->health_change
= false;
1857 dev_dbg(battery
->dev
,
1858 "%s: Charging Disabled\n", __func__
);
1862 if (battery
->health
!= POWER_SUPPLY_HEALTH_GOOD
&&
1863 battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEAT
&&
1864 battery
->health
!= POWER_SUPPLY_HEALTH_COLD
&&
1865 battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
1866 dev_dbg(battery
->dev
, "%s: No need to check\n", __func__
);
1870 #if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
1871 if (!battery
->cooldown_mode
) {
1872 dev_err(battery
->dev
, "%s: Forced temp check block\n", __func__
);
1877 sec_bat_temperature(battery
);
1879 switch (battery
->pdata
->temp_check_type
) {
1880 case SEC_BATTERY_TEMP_CHECK_ADC
:
1881 temp_value
= battery
->temp_adc
;
1883 case SEC_BATTERY_TEMP_CHECK_TEMP
:
1884 temp_value
= battery
->temperature
;
1887 dev_err(battery
->dev
,
1888 "%s: Invalid Temp Check Type\n", __func__
);
1891 pre_health
= battery
->health
;
1893 if (battery
->pdata
->usb_thermal_source
&& (battery
->usb_temp
>= battery
->temp_highlimit_threshold
)) {
1894 if (battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
1895 if (battery
->temp_highlimit_cnt
<
1896 battery
->pdata
->temp_check_count
) {
1897 battery
->temp_highlimit_cnt
++;
1898 battery
->temp_high_cnt
= 0;
1899 battery
->temp_low_cnt
= 0;
1900 battery
->temp_recover_cnt
= 0;
1902 dev_err(battery
->dev
,
1903 "%s: usb therm highlimit count = %d\n",
1904 __func__
, battery
->temp_highlimit_cnt
);
1906 } else if (battery
->pdata
->usb_thermal_source
&& (battery
->usb_temp
> battery
->temp_highlimit_recovery
)
1907 && (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
)) {
1908 dev_err(battery
->dev
,
1909 "%s: usb therm highlimit \n",__func__
);
1910 } else if (temp_value
>= battery
->temp_highlimit_threshold
&& !battery
->pdata
->usb_thermal_source
) {
1911 if (battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
1912 if (battery
->temp_highlimit_cnt
<
1913 battery
->pdata
->temp_check_count
) {
1914 battery
->temp_highlimit_cnt
++;
1915 battery
->temp_high_cnt
= 0;
1916 battery
->temp_low_cnt
= 0;
1917 battery
->temp_recover_cnt
= 0;
1919 dev_err(battery
->dev
,
1920 "%s: highlimit count = %d\n",
1921 __func__
, battery
->temp_highlimit_cnt
);
1923 } else if (temp_value
>= battery
->temp_high_threshold
) {
1924 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
&& !battery
->pdata
->usb_thermal_source
) {
1925 if (temp_value
<= battery
->temp_highlimit_recovery
) {
1926 if (battery
->temp_recover_cnt
<
1927 battery
->pdata
->temp_check_count
) {
1928 battery
->temp_recover_cnt
++;
1929 battery
->temp_highlimit_cnt
= 0;
1930 battery
->temp_high_cnt
= 0;
1931 battery
->temp_low_cnt
= 0;
1933 dev_err(battery
->dev
,
1934 "%s: recovery count = %d\n",
1935 __func__
, battery
->temp_recover_cnt
);
1937 } else if (battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEAT
) {
1938 if (battery
->temp_high_cnt
<
1939 battery
->pdata
->temp_check_count
) {
1940 battery
->temp_high_cnt
++;
1941 battery
->temp_highlimit_cnt
= 0;
1942 battery
->temp_low_cnt
= 0;
1943 battery
->temp_recover_cnt
= 0;
1945 dev_err(battery
->dev
,
1946 "%s: high count = %d\n",
1947 __func__
, battery
->temp_high_cnt
);
1949 } else if ((temp_value
<= battery
->temp_high_recovery
) &&
1950 (temp_value
>= battery
->temp_low_recovery
)) {
1951 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
||
1952 battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
||
1953 battery
->health
== POWER_SUPPLY_HEALTH_COLD
) {
1954 if (battery
->temp_recover_cnt
<
1955 battery
->pdata
->temp_check_count
) {
1956 battery
->temp_recover_cnt
++;
1957 battery
->temp_highlimit_cnt
= 0;
1958 battery
->temp_high_cnt
= 0;
1959 battery
->temp_low_cnt
= 0;
1961 dev_err(battery
->dev
,
1962 "%s: recovery count = %d\n",
1963 __func__
, battery
->temp_recover_cnt
);
1965 } else if (temp_value
<= battery
->temp_low_threshold
) {
1966 if (battery
->health
!= POWER_SUPPLY_HEALTH_COLD
) {
1967 if (battery
->temp_low_cnt
<
1968 battery
->pdata
->temp_check_count
) {
1969 battery
->temp_low_cnt
++;
1970 battery
->temp_highlimit_cnt
= 0;
1971 battery
->temp_high_cnt
= 0;
1972 battery
->temp_recover_cnt
= 0;
1974 dev_err(battery
->dev
,
1975 "%s: low count = %d\n",
1976 __func__
, battery
->temp_low_cnt
);
1979 battery
->temp_highlimit_cnt
= 0;
1980 battery
->temp_high_cnt
= 0;
1981 battery
->temp_low_cnt
= 0;
1982 battery
->temp_recover_cnt
= 0;
1985 if (battery
->temp_highlimit_cnt
>=
1986 battery
->pdata
->temp_check_count
) {
1987 battery
->health
= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
;
1988 battery
->temp_highlimit_cnt
= 0;
1989 } else if (battery
->temp_high_cnt
>=
1990 battery
->pdata
->temp_check_count
) {
1991 battery
->health
= POWER_SUPPLY_HEALTH_OVERHEAT
;
1992 battery
->temp_high_cnt
= 0;
1993 } else if (battery
->temp_low_cnt
>=
1994 battery
->pdata
->temp_check_count
) {
1995 battery
->health
= POWER_SUPPLY_HEALTH_COLD
;
1996 battery
->temp_low_cnt
= 0;
1997 } else if (battery
->temp_recover_cnt
>=
1998 battery
->pdata
->temp_check_count
) {
1999 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
&&
2000 temp_value
> battery
->temp_high_recovery
) {
2001 battery
->health
= POWER_SUPPLY_HEALTH_OVERHEAT
;
2003 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
2005 battery
->temp_recover_cnt
= 0;
2007 if (pre_health
!= battery
->health
) {
2008 battery
->health_change
= true;
2009 dev_info(battery
->dev
, "%s, health_change true\n", __func__
);
2010 #if defined(CONFIG_BATTERY_SBM_DATA)
2011 sec_bat_add_sbm_data(battery
, SBM_DATA_TEMP
);
2014 battery
->health_change
= false;
2017 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
) ||
2018 (battery
->health
== POWER_SUPPLY_HEALTH_COLD
) ||
2019 (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
)) {
2020 union power_supply_propval val
= {0, };
2021 if (battery
->health_change
) {
2022 battery
->is_abnormal_temp
= true;
2023 if (is_wireless_type(battery
->cable_type
)) {
2024 val
.intval
= battery
->health
;
2025 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
2026 POWER_SUPPLY_PROP_HEALTH
, val
);
2028 dev_info(battery
->dev
,
2029 "%s: Unsafe Temperature\n", __func__
);
2030 sec_bat_set_charging_status(battery
,
2031 POWER_SUPPLY_STATUS_NOT_CHARGING
);
2032 #if defined(CONFIG_BATTERY_CISD)
2033 battery
->cisd
.data
[CISD_DATA_UNSAFETY_TEMPERATURE
]++;
2034 battery
->cisd
.data
[CISD_DATA_UNSAFE_TEMPERATURE_PER_DAY
]++;
2037 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
2038 /* change charging current to battery (default 0mA) */
2039 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
2040 if (is_hv_afc_wire_type(battery
->cable_type
) && !battery
->vbus_limit
) {
2041 #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_QC30)
2042 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_0V
);
2044 battery
->vbus_limit
= true;
2045 pr_info("%s: Set AFC TA to 0V\n", __func__
);
2047 } else if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
) {
2048 /* to discharge battery */
2049 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
2051 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2056 /* dose not need buck control at low temperature */
2057 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
||
2058 battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
) {
2059 if((battery
->charger_mode
== SEC_BAT_CHG_MODE_BUCK_OFF
) &&
2060 (battery
->voltage_now
< (battery
->pdata
->swelling_drop_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
))) {
2061 pr_info("%s: Vnow(%dmV) < %dmV has dropped enough to get buck on mode \n", __func__
,
2062 battery
->voltage_now
,
2063 (battery
->pdata
->swelling_drop_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
));
2064 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2068 /* if recovered from not charging */
2069 if ((battery
->health
== POWER_SUPPLY_HEALTH_GOOD
) &&
2071 POWER_SUPPLY_STATUS_NOT_CHARGING
)) {
2072 battery
->is_abnormal_temp
= false;
2073 dev_info(battery
->dev
,
2074 "%s: Safe Temperature\n", __func__
);
2075 if (battery
->capacity
>= 100)
2076 sec_bat_set_charging_status(battery
,
2077 POWER_SUPPLY_STATUS_FULL
);
2078 else /* Normal Charging */
2079 sec_bat_set_charging_status(battery
,
2080 POWER_SUPPLY_STATUS_CHARGING
);
2081 #if defined(CONFIG_BATTERY_SWELLING)
2082 if ((temp_value
> battery
->pdata
->swelling_high_temp_recov
) ||
2083 (temp_value
< battery
->pdata
->swelling_low_temp_recov_2nd
)) {
2084 pr_info("%s: swelling mode start. stop charging\n", __func__
);
2085 battery
->swelling_mode
= SWELLING_MODE_CHARGING
;
2086 battery
->swelling_full_check_cnt
= 0;
2087 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
2088 if (battery
->temperature
> battery
->pdata
->swelling_high_temp_recov
) {
2089 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
,
2090 SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
);
2091 } else if (battery
->temperature
< battery
->pdata
->swelling_low_temp_recov_2nd
) {
2092 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
,
2093 SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
);
2096 union power_supply_propval val
= {0, };
2097 /* restore 4.4V float voltage */
2098 val
.intval
= battery
->pdata
->swelling_normal_float_voltage
;
2099 psy_do_property(battery
->pdata
->charger_name
, set
,
2100 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
2101 /* turn on charger by cable type */
2102 if((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
2103 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
2104 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2106 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2109 if (temp_value
<= battery
->pdata
->swelling_low_temp_block_1st
||
2110 ((temp_value
< battery
->pdata
->swelling_low_temp_recov_1st
) &&
2111 (pre_health
== POWER_SUPPLY_HEALTH_COLD
))) {
2112 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP
,
2113 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
2117 /* turn on charger by cable type */
2118 if((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
2119 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
2120 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2122 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2131 static bool sec_bat_check_fullcharged_condition(
2132 struct sec_battery_info
*battery
)
2134 int full_check_type
= SEC_BATTERY_FULLCHARGED_NONE
;
2136 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
)
2137 full_check_type
= battery
->pdata
->full_check_type
;
2139 full_check_type
= battery
->pdata
->full_check_type_2nd
;
2141 switch (full_check_type
) {
2142 case SEC_BATTERY_FULLCHARGED_ADC
:
2143 case SEC_BATTERY_FULLCHARGED_FG_CURRENT
:
2144 case SEC_BATTERY_FULLCHARGED_SOC
:
2145 case SEC_BATTERY_FULLCHARGED_CHGGPIO
:
2146 case SEC_BATTERY_FULLCHARGED_CHGPSY
:
2149 /* If these is NOT full check type or NONE full check type,
2150 * it is full-charged
2152 case SEC_BATTERY_FULLCHARGED_CHGINT
:
2153 case SEC_BATTERY_FULLCHARGED_TIME
:
2154 case SEC_BATTERY_FULLCHARGED_NONE
:
2160 if (battery
->pdata
->full_condition_type
&
2161 SEC_BATTERY_FULL_CONDITION_SOC
) {
2162 if (battery
->capacity
<
2163 battery
->pdata
->full_condition_soc
) {
2164 dev_dbg(battery
->dev
,
2165 "%s: Not enough SOC (%d%%)\n",
2166 __func__
, battery
->capacity
);
2171 if (battery
->pdata
->full_condition_type
&
2172 SEC_BATTERY_FULL_CONDITION_VCELL
) {
2173 if (battery
->voltage_now
<
2174 battery
->pdata
->full_condition_vcell
) {
2175 dev_dbg(battery
->dev
,
2176 "%s: Not enough VCELL (%dmV)\n",
2177 __func__
, battery
->voltage_now
);
2182 if (battery
->pdata
->full_condition_type
&
2183 SEC_BATTERY_FULL_CONDITION_AVGVCELL
) {
2184 if (battery
->voltage_avg
<
2185 battery
->pdata
->full_condition_avgvcell
) {
2186 dev_dbg(battery
->dev
,
2187 "%s: Not enough AVGVCELL (%dmV)\n",
2188 __func__
, battery
->voltage_avg
);
2193 if (battery
->pdata
->full_condition_type
&
2194 SEC_BATTERY_FULL_CONDITION_OCV
) {
2195 if (battery
->voltage_ocv
<
2196 battery
->pdata
->full_condition_ocv
) {
2197 dev_dbg(battery
->dev
,
2198 "%s: Not enough OCV (%dmV)\n",
2199 __func__
, battery
->voltage_ocv
);
2207 static void sec_bat_do_test_function(
2208 struct sec_battery_info
*battery
)
2210 union power_supply_propval value
= {0, };
2212 switch (battery
->test_mode
) {
2214 if (battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) {
2215 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2216 sec_bat_set_charging_status(battery
,
2217 POWER_SUPPLY_STATUS_DISCHARGING
);
2221 if(battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
2222 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2223 psy_do_property(battery
->pdata
->charger_name
, get
,
2224 POWER_SUPPLY_PROP_STATUS
, value
);
2225 sec_bat_set_charging_status(battery
, value
.intval
);
2227 battery
->test_mode
= 0;
2229 case 3: // clear temp block
2230 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
2231 sec_bat_set_charging_status(battery
,
2232 POWER_SUPPLY_STATUS_DISCHARGING
);
2235 if(battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
2236 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2237 psy_do_property(battery
->pdata
->charger_name
, get
,
2238 POWER_SUPPLY_PROP_STATUS
, value
);
2239 sec_bat_set_charging_status(battery
, value
.intval
);
2243 pr_info("%s: error test: unknown state\n", __func__
);
2248 static bool sec_bat_time_management(
2249 struct sec_battery_info
*battery
)
2251 struct timespec ts
= {0, };
2252 unsigned long charging_time
;
2254 if (battery
->charging_start_time
== 0 || !battery
->safety_timer_set
) {
2255 dev_dbg(battery
->dev
,
2256 "%s: Charging Disabled\n", __func__
);
2260 get_monotonic_boottime(&ts
);
2262 if (ts
.tv_sec
>= battery
->charging_start_time
) {
2263 charging_time
= ts
.tv_sec
- battery
->charging_start_time
;
2265 charging_time
= 0xFFFFFFFF - battery
->charging_start_time
2269 battery
->charging_passed_time
= charging_time
;
2271 switch (battery
->status
) {
2272 case POWER_SUPPLY_STATUS_FULL
:
2273 if (battery
->expired_time
== 0) {
2274 dev_info(battery
->dev
,
2275 "%s: Recharging Timer Expired\n", __func__
);
2276 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2277 battery
->health
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
2278 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
2279 battery
->is_recharging
= false;
2280 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
)) {
2281 dev_err(battery
->dev
,
2282 "%s: Fail to Set Charger\n", __func__
);
2289 case POWER_SUPPLY_STATUS_CHARGING
:
2290 if ((battery
->pdata
->full_condition_type
&
2291 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL
) &&
2292 (battery
->is_recharging
&& (battery
->expired_time
== 0))) {
2293 dev_info(battery
->dev
,
2294 "%s: Recharging Timer Expired\n", __func__
);
2295 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2296 battery
->health
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
2297 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
2298 battery
->is_recharging
= false;
2299 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
)) {
2300 dev_err(battery
->dev
,
2301 "%s: Fail to Set Charger\n", __func__
);
2305 } else if (!battery
->is_recharging
&&
2306 (battery
->expired_time
== 0)) {
2307 dev_info(battery
->dev
,
2308 "%s: Charging Timer Expired\n", __func__
);
2309 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2310 battery
->health
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
2311 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
2312 #if defined(CONFIG_BATTERY_CISD)
2313 battery
->cisd
.data
[CISD_DATA_SAFETY_TIMER
]++;
2314 battery
->cisd
.data
[CISD_DATA_SAFETY_TIMER_PER_DAY
]++;
2316 #if defined(CONFIG_SEC_ABC)
2317 sec_abc_send_event("MODULE=battery@ERROR=safety_timer");
2319 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
)) {
2320 dev_err(battery
->dev
,
2321 "%s: Fail to Set Charger\n", __func__
);
2328 dev_err(battery
->dev
,
2329 "%s: Undefine Battery Status\n", __func__
);
2336 static bool sec_bat_check_fullcharged(
2337 struct sec_battery_info
*battery
)
2339 union power_supply_propval value
= {0, };
2340 int current_adc
= 0;
2341 int full_check_type
= SEC_BATTERY_FULLCHARGED_NONE
;
2345 if (!sec_bat_check_fullcharged_condition(battery
))
2346 goto not_full_charged
;
2348 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
)
2349 full_check_type
= battery
->pdata
->full_check_type
;
2351 full_check_type
= battery
->pdata
->full_check_type_2nd
;
2353 switch (full_check_type
) {
2354 case SEC_BATTERY_FULLCHARGED_ADC
:
2356 sec_bat_get_adc_data(battery
,
2357 SEC_BAT_ADC_CHANNEL_FULL_CHECK
,
2358 battery
->pdata
->adc_check_count
);
2360 dev_dbg(battery
->dev
,
2361 "%s: Current ADC (%d)\n",
2362 __func__
, current_adc
);
2364 if (current_adc
< 0)
2366 battery
->current_adc
= current_adc
;
2368 if (battery
->current_adc
<
2369 (battery
->charging_mode
==
2370 SEC_BATTERY_CHARGING_1ST
?
2371 battery
->pdata
->full_check_current_1st
:
2372 battery
->pdata
->full_check_current_2nd
)) {
2373 battery
->full_check_cnt
++;
2374 dev_dbg(battery
->dev
,
2375 "%s: Full Check ADC (%d)\n",
2377 battery
->full_check_cnt
);
2379 battery
->full_check_cnt
= 0;
2382 case SEC_BATTERY_FULLCHARGED_FG_CURRENT
:
2383 if ((battery
->current_now
> 0 && battery
->current_now
<
2384 battery
->pdata
->full_check_current_1st
) &&
2385 (battery
->current_avg
> 0 && battery
->current_avg
<
2386 (battery
->charging_mode
==
2387 SEC_BATTERY_CHARGING_1ST
?
2388 battery
->pdata
->full_check_current_1st
:
2389 battery
->pdata
->full_check_current_2nd
))) {
2390 battery
->full_check_cnt
++;
2391 dev_dbg(battery
->dev
,
2392 "%s: Full Check Current (%d)\n",
2394 battery
->full_check_cnt
);
2396 battery
->full_check_cnt
= 0;
2399 case SEC_BATTERY_FULLCHARGED_TIME
:
2400 if ((battery
->charging_mode
==
2401 SEC_BATTERY_CHARGING_2ND
?
2402 (battery
->charging_passed_time
-
2403 battery
->charging_fullcharged_time
) :
2404 battery
->charging_passed_time
) >
2405 (battery
->charging_mode
==
2406 SEC_BATTERY_CHARGING_1ST
?
2407 battery
->pdata
->full_check_current_1st
:
2408 battery
->pdata
->full_check_current_2nd
)) {
2409 battery
->full_check_cnt
++;
2410 dev_dbg(battery
->dev
,
2411 "%s: Full Check Time (%d)\n",
2413 battery
->full_check_cnt
);
2415 battery
->full_check_cnt
= 0;
2418 case SEC_BATTERY_FULLCHARGED_SOC
:
2419 if (battery
->capacity
<=
2420 (battery
->charging_mode
==
2421 SEC_BATTERY_CHARGING_1ST
?
2422 battery
->pdata
->full_check_current_1st
:
2423 battery
->pdata
->full_check_current_2nd
)) {
2424 battery
->full_check_cnt
++;
2425 dev_dbg(battery
->dev
,
2426 "%s: Full Check SOC (%d)\n",
2428 battery
->full_check_cnt
);
2430 battery
->full_check_cnt
= 0;
2433 case SEC_BATTERY_FULLCHARGED_CHGGPIO
:
2435 battery
->pdata
->chg_gpio_full_check
,
2438 dev_err(battery
->dev
,
2439 "%s: Error in Request of GPIO\n", __func__
);
2442 if (!(gpio_get_value_cansleep(
2443 battery
->pdata
->chg_gpio_full_check
) ^
2444 !battery
->pdata
->chg_polarity_full_check
)) {
2445 battery
->full_check_cnt
++;
2446 dev_dbg(battery
->dev
,
2447 "%s: Full Check GPIO (%d)\n",
2448 __func__
, battery
->full_check_cnt
);
2450 battery
->full_check_cnt
= 0;
2451 gpio_free(battery
->pdata
->chg_gpio_full_check
);
2454 case SEC_BATTERY_FULLCHARGED_CHGINT
:
2455 case SEC_BATTERY_FULLCHARGED_CHGPSY
:
2456 psy_do_property(battery
->pdata
->charger_name
, get
,
2457 POWER_SUPPLY_PROP_STATUS
, value
);
2459 if (value
.intval
== POWER_SUPPLY_STATUS_FULL
) {
2460 battery
->full_check_cnt
++;
2461 dev_info(battery
->dev
,
2462 "%s: Full Check Charger (%d)\n",
2463 __func__
, battery
->full_check_cnt
);
2465 battery
->full_check_cnt
= 0;
2468 /* If these is NOT full check type or NONE full check type,
2469 * it is full-charged
2471 case SEC_BATTERY_FULLCHARGED_NONE
:
2472 battery
->full_check_cnt
= 0;
2476 dev_err(battery
->dev
,
2477 "%s: Invalid Full Check\n", __func__
);
2481 if (battery
->full_check_cnt
>=
2482 battery
->pdata
->full_check_count
) {
2483 battery
->full_check_cnt
= 0;
2491 static void sec_bat_do_fullcharged(
2492 struct sec_battery_info
*battery
)
2494 union power_supply_propval value
= {0, };
2496 /* To let charger/fuel gauge know the full status,
2497 * set status before calling sec_bat_set_charge()
2499 #if defined(CONFIG_BATTERY_CISD)
2500 struct timespec now_ts
;
2502 if (battery
->status
!= POWER_SUPPLY_STATUS_FULL
) {
2503 battery
->cisd
.data
[CISD_DATA_FULL_COUNT
]++;
2504 battery
->cisd
.data
[CISD_DATA_FULL_COUNT_PER_DAY
]++;
2507 sec_bat_set_charging_status(battery
,
2508 POWER_SUPPLY_STATUS_FULL
);
2510 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
&&
2511 battery
->pdata
->full_check_type_2nd
!= SEC_BATTERY_FULLCHARGED_NONE
) {
2512 battery
->charging_mode
= SEC_BATTERY_CHARGING_2ND
;
2513 battery
->charging_fullcharged_time
= battery
->charging_passed_time
;
2514 value
.intval
= SEC_BAT_CHG_MODE_CHARGING_OFF
;
2515 psy_do_property(battery
->pdata
->charger_name
, set
,
2516 POWER_SUPPLY_PROP_CHARGING_ENABLED
, value
);
2517 sec_bat_set_charging_current(battery
);
2518 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2519 #if defined(CONFIG_BATTERY_SBM_DATA)
2520 sec_bat_add_sbm_data(battery
, SBM_DATA_FULL_1ST
);
2523 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2524 #if defined(CONFIG_BATTERY_CISD)
2525 now_ts
= ktime_to_timespec(ktime_get_boottime());
2526 if (!battery
->is_recharging
) {
2527 battery
->cisd
.charging_end_time
= now_ts
.tv_sec
;
2529 if (battery
->siop_level
== 100) {
2530 dev_info(battery
->dev
, "%s: cisd - leakage EFGH start(%ld)\n", __func__
, ((unsigned long)now_ts
.tv_sec
));
2531 battery
->cisd
.state
&= ~(CISD_STATE_LEAK_E
|CISD_STATE_LEAK_F
|CISD_STATE_LEAK_G
);
2532 battery
->cisd
.charging_end_time_2
= now_ts
.tv_sec
;
2533 battery
->cisd
.recharge_count_2
= 0;
2535 battery
->cisd
.state
&= ~(CISD_STATE_LEAK_E
|CISD_STATE_LEAK_F
|CISD_STATE_LEAK_G
);
2536 battery
->cisd
.recharge_count_2
= 0;
2537 battery
->cisd
.charging_end_time_2
= 0;
2540 battery
->is_recharging
= false;
2542 if (!battery
->wdt_kick_disable
) {
2543 pr_info("%s: wdt kick enable -> Charger Off, %d\n",
2544 __func__
, battery
->wdt_kick_disable
);
2545 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2547 pr_info("%s: wdt kick disabled -> skip charger off, %d\n",
2548 __func__
, battery
->wdt_kick_disable
);
2551 #if defined(CONFIG_BATTERY_AGE_FORECAST)
2552 sec_bat_aging_check(battery
);
2555 value
.intval
= POWER_SUPPLY_STATUS_FULL
;
2556 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2557 POWER_SUPPLY_PROP_STATUS
, value
);
2558 #if defined(CONFIG_BATTERY_SBM_DATA)
2559 sec_bat_add_sbm_data(battery
, SBM_DATA_FULL_2ND
);
2563 /* platform can NOT get information of battery
2564 * because wakeup time is too short to check uevent
2565 * To make sure that target is wakeup if full-charged,
2566 * activated wake lock in a few seconds
2568 if (battery
->pdata
->polling_type
== SEC_BATTERY_MONITOR_ALARM
)
2569 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
2572 static bool sec_bat_fullcharged_check(
2573 struct sec_battery_info
*battery
)
2575 if ((battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
) ||
2576 (battery
->status
== POWER_SUPPLY_STATUS_NOT_CHARGING
)) {
2577 dev_dbg(battery
->dev
,
2578 "%s: No Need to Check Full-Charged\n", __func__
);
2582 if (sec_bat_check_fullcharged(battery
)) {
2583 union power_supply_propval value
= {0, };
2584 if (battery
->capacity
< 100) {
2585 battery
->full_check_cnt
= battery
->pdata
->full_check_count
;
2587 sec_bat_do_fullcharged(battery
);
2590 /* update capacity max */
2591 value
.intval
= battery
->capacity
;
2592 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2593 POWER_SUPPLY_PROP_CHARGE_FULL
, value
);
2594 pr_info("%s : forced full-charged sequence for the capacity(%d)\n",
2595 __func__
, battery
->capacity
);
2598 dev_info(battery
->dev
,
2599 "%s: Charging Mode : %s\n", __func__
,
2600 battery
->is_recharging
?
2601 sec_bat_charging_mode_str
[SEC_BATTERY_CHARGING_RECHARGING
] :
2602 sec_bat_charging_mode_str
[battery
->charging_mode
]);
2607 static void sec_bat_get_temperature_info(
2608 struct sec_battery_info
*battery
)
2610 union power_supply_propval value
= {0, };
2612 switch (battery
->pdata
->thermal_source
) {
2613 case SEC_BATTERY_THERMAL_SOURCE_FG
:
2614 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2615 POWER_SUPPLY_PROP_TEMP
, value
);
2616 battery
->temperature
= value
.intval
;
2618 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2619 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
2620 battery
->temper_amb
= value
.intval
;
2622 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK
:
2623 if (battery
->pdata
->get_temperature_callback
) {
2624 battery
->pdata
->get_temperature_callback(
2625 POWER_SUPPLY_PROP_TEMP
, &value
);
2626 battery
->temperature
= value
.intval
;
2627 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2628 POWER_SUPPLY_PROP_TEMP
, value
);
2630 battery
->pdata
->get_temperature_callback(
2631 POWER_SUPPLY_PROP_TEMP_AMBIENT
, &value
);
2632 battery
->temper_amb
= value
.intval
;
2633 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2634 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
2637 case SEC_BATTERY_THERMAL_SOURCE_ADC
:
2638 sec_bat_get_value_by_adc(battery
,
2639 SEC_BAT_ADC_CHANNEL_TEMP
, &value
);
2640 battery
->temperature
= value
.intval
;
2642 sec_bat_get_value_by_adc(battery
,
2643 SEC_BAT_ADC_CHANNEL_TEMP_AMBIENT
, &value
);
2644 battery
->temper_amb
= value
.intval
;
2646 if (battery
->pdata
->usb_thermal_source
) {
2647 sec_bat_get_value_by_adc(battery
,
2648 SEC_BAT_ADC_CHANNEL_USB_TEMP
, &value
);
2649 battery
->usb_temp
= value
.intval
;
2650 if (battery
->vbus_limit
&& battery
->usb_temp
<= battery
->temp_highlimit_recovery
)
2651 battery
->vbus_limit
= false;
2654 if (battery
->pdata
->chg_thermal_source
) {
2655 sec_bat_get_value_by_adc(battery
,
2656 SEC_BAT_ADC_CHANNEL_CHG_TEMP
, &value
);
2657 battery
->chg_temp
= value
.intval
;
2660 if (battery
->pdata
->wpc_thermal_source
) {
2661 sec_bat_get_value_by_adc(battery
,
2662 SEC_BAT_ADC_CHANNEL_WPC_TEMP
, &value
);
2663 battery
->wpc_temp
= value
.intval
;
2664 battery
->coil_temp
= value
.intval
;
2667 if (battery
->pdata
->slave_thermal_source
) {
2668 sec_bat_get_value_by_adc(battery
,
2669 SEC_BAT_ADC_CHANNEL_SLAVE_CHG_TEMP
, &value
);
2670 battery
->slave_chg_temp
= value
.intval
;
2672 /* set temperature */
2673 value
.intval
= ((battery
->slave_chg_temp
) << 16) | (battery
->chg_temp
);
2674 psy_do_property(battery
->pdata
->charger_name
, set
,
2675 POWER_SUPPLY_PROP_TEMP
, value
);
2678 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
2679 if (battery
->temperature_test_battery
> -300 && battery
->temperature_test_battery
< 3000) {
2680 pr_info("%s : battery temperature test %d\n", __func__
, battery
->temperature_test_battery
);
2681 battery
->temperature
= battery
->temperature_test_battery
;
2683 if (battery
->temperature_test_usb
> -300 && battery
->temperature_test_usb
< 3000) {
2684 pr_info("%s : usb temperature test %d\n", __func__
, battery
->temperature_test_usb
);
2685 battery
->usb_temp
= battery
->temperature_test_usb
;
2687 if (battery
->temperature_test_wpc
> -300 && battery
->temperature_test_wpc
< 3000) {
2688 pr_info("%s : wpc temperature test %d\n", __func__
, battery
->temperature_test_wpc
);
2689 battery
->wpc_temp
= battery
->temperature_test_wpc
;
2690 battery
->coil_temp
= battery
->temperature_test_wpc
;
2692 if (battery
->temperature_test_chg
> -300 && battery
->temperature_test_chg
< 3000) {
2693 pr_info("%s : chg temperature test %d\n", __func__
, battery
->temperature_test_chg
);
2694 battery
->chg_temp
= battery
->temperature_test_chg
;
2698 #if defined(CONFIG_SEC_FACTORY)
2699 if (battery
->temperature
<= (-200)) {
2700 value
.intval
= battery
->usb_temp
;
2702 value
.intval
= battery
->temperature
;
2705 value
.intval
= battery
->temperature
;
2707 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2708 POWER_SUPPLY_PROP_TEMP
, value
);
2710 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2711 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
2719 static void sec_bat_get_battery_info(
2720 struct sec_battery_info
*battery
)
2722 union power_supply_propval value
= {0, };
2724 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2725 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
2726 battery
->voltage_now
= value
.intval
;
2728 value
.intval
= SEC_BATTERY_VOLTAGE_AVERAGE
;
2729 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2730 POWER_SUPPLY_PROP_VOLTAGE_AVG
, value
);
2731 battery
->voltage_avg
= value
.intval
;
2733 /* Do not call it to reduce time after cable_work, this funtion call FG full log*/
2734 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
)) {
2735 value
.intval
= SEC_BATTERY_VOLTAGE_OCV
;
2736 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2737 POWER_SUPPLY_PROP_VOLTAGE_AVG
, value
);
2738 battery
->voltage_ocv
= value
.intval
;
2741 value
.intval
= SEC_BATTERY_CURRENT_MA
;
2742 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2743 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
2744 battery
->current_now
= value
.intval
;
2746 value
.intval
= SEC_BATTERY_CURRENT_MA
;
2747 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2748 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
2749 battery
->current_avg
= value
.intval
;
2751 /* input current limit in charger */
2752 psy_do_property(battery
->pdata
->charger_name
, get
,
2753 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
2754 battery
->current_max
= value
.intval
;
2756 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2757 POWER_SUPPLY_PROP_CHARGE_COUNTER
, value
);
2758 battery
->charge_counter
= value
.intval
;
2760 /* check abnormal status for wireless charging */
2761 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
) &&
2762 is_wireless_type(battery
->cable_type
)) {
2763 value
.intval
= (battery
->status
== POWER_SUPPLY_STATUS_FULL
) ?
2764 100 : battery
->capacity
;
2765 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
2766 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
2769 sec_bat_get_temperature_info(battery
);
2771 /* To get SOC value (NOT raw SOC), need to reset value */
2773 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2774 POWER_SUPPLY_PROP_CAPACITY
, value
);
2775 /* if the battery status was full, and SOC wasn't 100% yet,
2776 then ignore FG SOC, and report (previous SOC +1)% */
2777 battery
->capacity
= value
.intval
;
2779 dev_info(battery
->dev
,
2780 "%s:Vnow(%dmV),Vavg(%dmV),Inow(%dmA),Imax(%dmA),Ichg(%dmA),SOC(%d%%),"
2781 "Tbat(%d),Tusb(%d),Tchg(%d),Twpc(%d)\n", __func__
,
2782 battery
->voltage_now
, battery
->voltage_avg
, battery
->current_now
,
2783 battery
->current_max
, battery
->charging_current
,
2784 battery
->capacity
, battery
->temperature
,
2785 battery
->usb_temp
,battery
->chg_temp
, battery
->wpc_temp
2787 dev_dbg(battery
->dev
,
2788 "%s,Vavg(%dmV),Vocv(%dmV),Tamb(%d),"
2789 "Iavg(%dmA),Iadc(%d)\n",
2790 battery
->present
? "Connected" : "Disconnected",
2791 battery
->voltage_avg
, battery
->voltage_ocv
,
2792 battery
->temper_amb
,
2793 battery
->current_avg
, battery
->current_adc
);
2795 sec_debug_set_extra_info_batt(battery
->capacity
, battery
->voltage_avg
, battery
->temperature
, battery
->current_avg
);
2798 static void sec_bat_polling_work(struct work_struct
*work
)
2800 struct sec_battery_info
*battery
= container_of(
2801 work
, struct sec_battery_info
, polling_work
.work
);
2803 wake_lock(&battery
->monitor_wake_lock
);
2804 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
2805 dev_dbg(battery
->dev
, "%s: Activated\n", __func__
);
2808 static void sec_bat_program_alarm(
2809 struct sec_battery_info
*battery
, int seconds
)
2811 alarm_start(&battery
->polling_alarm
,
2812 ktime_add(battery
->last_poll_time
, ktime_set(seconds
, 0)));
2815 static unsigned int sec_bat_get_polling_time(
2816 struct sec_battery_info
*battery
)
2818 if (battery
->status
==
2819 POWER_SUPPLY_STATUS_FULL
)
2820 battery
->polling_time
=
2821 battery
->pdata
->polling_time
[
2822 POWER_SUPPLY_STATUS_CHARGING
];
2824 battery
->polling_time
=
2825 battery
->pdata
->polling_time
[
2828 battery
->polling_short
= true;
2830 switch (battery
->status
) {
2831 case POWER_SUPPLY_STATUS_CHARGING
:
2832 if (battery
->polling_in_sleep
)
2833 battery
->polling_short
= false;
2835 case POWER_SUPPLY_STATUS_DISCHARGING
:
2836 if (battery
->polling_in_sleep
&& (battery
->ps_enable
!= true)) {
2837 battery
->polling_time
=
2838 battery
->pdata
->polling_time
[
2839 SEC_BATTERY_POLLING_TIME_SLEEP
];
2841 battery
->polling_time
=
2842 battery
->pdata
->polling_time
[
2844 if (!battery
->wc_enable
) {
2845 battery
->polling_time
= battery
->pdata
->polling_time
[
2846 SEC_BATTERY_POLLING_TIME_CHARGING
];
2847 pr_info("%s: wc_enable is false, polling time is 30sec\n", __func__
);
2849 battery
->polling_short
= false;
2851 case POWER_SUPPLY_STATUS_FULL
:
2852 if (battery
->polling_in_sleep
) {
2853 if (!(battery
->pdata
->full_condition_type
&
2854 SEC_BATTERY_FULL_CONDITION_NOSLEEPINFULL
) &&
2855 battery
->charging_mode
==
2856 SEC_BATTERY_CHARGING_NONE
) {
2857 battery
->polling_time
=
2858 battery
->pdata
->polling_time
[
2859 SEC_BATTERY_POLLING_TIME_SLEEP
];
2861 battery
->polling_short
= false;
2863 if (battery
->charging_mode
==
2864 SEC_BATTERY_CHARGING_NONE
)
2865 battery
->polling_short
= false;
2868 case POWER_SUPPLY_STATUS_NOT_CHARGING
:
2869 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
||
2870 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) &&
2871 (battery
->health_check_count
> 0)) {
2872 battery
->health_check_count
--;
2873 battery
->polling_time
= 1;
2874 battery
->polling_short
= false;
2879 if (battery
->polling_short
)
2880 return battery
->pdata
->polling_time
[
2881 SEC_BATTERY_POLLING_TIME_BASIC
];
2882 /* set polling time to 46s to reduce current noise on wc */
2883 else if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
&&
2884 battery
->status
== POWER_SUPPLY_STATUS_CHARGING
)
2885 battery
->polling_time
= 46;
2887 return battery
->polling_time
;
2890 static bool sec_bat_is_short_polling(
2891 struct sec_battery_info
*battery
)
2893 /* Change the full and short monitoring sequence
2894 * Originally, full monitoring was the last time of polling_count
2895 * But change full monitoring to first time
2896 * because temperature check is too late
2898 if (!battery
->polling_short
|| battery
->polling_count
== 1)
2904 static void sec_bat_update_polling_count(
2905 struct sec_battery_info
*battery
)
2907 /* do NOT change polling count in sleep
2908 * even though it is short polling
2909 * to keep polling count along sleep/wakeup
2911 if (battery
->polling_short
&& battery
->polling_in_sleep
)
2914 if (battery
->polling_short
&&
2915 ((battery
->polling_time
/
2916 battery
->pdata
->polling_time
[
2917 SEC_BATTERY_POLLING_TIME_BASIC
])
2918 > battery
->polling_count
))
2919 battery
->polling_count
++;
2921 battery
->polling_count
= 1; /* initial value = 1 */
2924 static void sec_bat_set_polling(
2925 struct sec_battery_info
*battery
)
2927 unsigned int polling_time_temp
= 0;
2929 dev_dbg(battery
->dev
, "%s: Start\n", __func__
);
2931 polling_time_temp
= sec_bat_get_polling_time(battery
);
2933 dev_info(battery
->dev
,
2934 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
2935 __func__
, sec_bat_status_str
[battery
->status
],
2936 battery
->polling_in_sleep
? "Yes" : "No",
2937 (battery
->charging_mode
==
2938 SEC_BATTERY_CHARGING_NONE
) ? "No" : "Yes",
2939 battery
->polling_short
? "Yes" : "No");
2940 dev_info(battery
->dev
,
2941 "%s: Polling time %d/%d sec.\n", __func__
,
2942 battery
->polling_short
?
2943 (polling_time_temp
* battery
->polling_count
) :
2944 polling_time_temp
, battery
->polling_time
);
2946 /* To sync with log above,
2947 * change polling count after log is displayed
2948 * Do NOT update polling count in initial monitor
2950 if (!battery
->pdata
->monitor_initial_count
)
2951 sec_bat_update_polling_count(battery
);
2953 dev_dbg(battery
->dev
,
2954 "%s: Initial monitor %d times left.\n", __func__
,
2955 battery
->pdata
->monitor_initial_count
);
2957 switch (battery
->pdata
->polling_type
) {
2958 case SEC_BATTERY_MONITOR_WORKQUEUE
:
2959 if (battery
->pdata
->monitor_initial_count
) {
2960 battery
->pdata
->monitor_initial_count
--;
2961 schedule_delayed_work(&battery
->polling_work
, HZ
);
2963 schedule_delayed_work(&battery
->polling_work
,
2964 polling_time_temp
* HZ
);
2966 case SEC_BATTERY_MONITOR_ALARM
:
2967 battery
->last_poll_time
= ktime_get_boottime();
2969 if (battery
->pdata
->monitor_initial_count
) {
2970 battery
->pdata
->monitor_initial_count
--;
2971 sec_bat_program_alarm(battery
, 1);
2973 sec_bat_program_alarm(battery
, polling_time_temp
);
2975 case SEC_BATTERY_MONITOR_TIMER
:
2980 dev_dbg(battery
->dev
, "%s: End\n", __func__
);
2983 /* OTG during HV wireless charging or sleep mode have 4.5W normal wireless charging UI */
2984 static bool sec_bat_hv_wc_normal_mode_check(struct sec_battery_info
*battery
)
2986 union power_supply_propval value
= {0, };
2988 psy_do_property(battery
->pdata
->charger_name
, get
,
2989 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
2990 if (value
.intval
|| sleep_mode
) {
2991 pr_info("%s: otg(%d), sleep_mode(%d)\n", __func__
, value
.intval
, sleep_mode
);
2997 #if defined(CONFIG_BATTERY_SWELLING)
2998 static void sec_bat_swelling_fullcharged_check(struct sec_battery_info
*battery
)
3000 union power_supply_propval value
= {0, };
3002 psy_do_property(battery
->pdata
->charger_name
, get
,
3003 POWER_SUPPLY_PROP_STATUS
, value
);
3005 if (value
.intval
== POWER_SUPPLY_STATUS_FULL
) {
3006 battery
->swelling_full_check_cnt
++;
3007 pr_info("%s: Swelling mode full-charged check (%d)\n",
3008 __func__
, battery
->swelling_full_check_cnt
);
3010 battery
->swelling_full_check_cnt
= 0;
3012 if (battery
->swelling_full_check_cnt
>=
3013 battery
->pdata
->full_check_count
) {
3014 battery
->swelling_full_check_cnt
= 0;
3015 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3016 battery
->is_recharging
= false;
3017 battery
->swelling_mode
= SWELLING_MODE_FULL
;
3018 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
3019 battery
->expired_time
= battery
->pdata
->expired_time
;
3020 battery
->prev_safety_time
= 0;
3021 #if defined(CONFIG_BATTERY_CISD)
3022 battery
->cisd
.data
[CISD_DATA_SWELLING_FULL_CNT
]++;
3023 battery
->cisd
.data
[CISD_DATA_SWELLING_FULL_CNT_PER_DAY
]++;
3029 #if defined(CONFIG_CALC_TIME_TO_FULL)
3030 static void sec_bat_calc_time_to_full(struct sec_battery_info
* battery
)
3032 if (delayed_work_pending(&battery
->timetofull_work
)) {
3033 pr_info("%s: keep time_to_full(%5d sec)\n", __func__
, battery
->timetofull
);
3034 } else if (battery
->status
== POWER_SUPPLY_STATUS_CHARGING
||
3035 (battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->capacity
!= 100)) {
3036 union power_supply_propval value
= {0, };
3039 if (is_hv_wire_12v_type(battery
->cable_type
) ||
3040 battery
->max_charge_power
>= (battery
->pdata
->pd_charging_charge_power
+ 5000)) { /* 20000mW */
3041 charge
= battery
->pdata
->ttf_hv_12v_charge_current
;
3042 } else if (is_hv_wire_type(battery
->cable_type
) ||
3043 /* if max_charge_power could support over than max_charging_current, calculate based on ttf_hv_charge_current */
3044 battery
->max_charge_power
>= (battery
->pdata
->max_charging_current
* 5)) {
3045 charge
= battery
->pdata
->ttf_hv_charge_current
;
3046 } else if (is_hv_wireless_type(battery
->cable_type
) ||
3047 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
) {
3048 if (sec_bat_hv_wc_normal_mode_check(battery
))
3049 charge
= battery
->pdata
->ttf_wireless_charge_current
;
3051 charge
= battery
->pdata
->ttf_hv_wireless_charge_current
;
3052 } else if (is_nv_wireless_type(battery
->cable_type
)) {
3053 charge
= battery
->pdata
->ttf_wireless_charge_current
;
3055 charge
= battery
->max_charge_power
/ 5;
3057 value
.intval
= charge
;
3058 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3059 POWER_SUPPLY_PROP_TIME_TO_FULL_NOW
, value
);
3060 dev_info(battery
->dev
, "%s: T: %5d sec, passed time: %5ld, current: %d\n",
3061 __func__
, value
.intval
, battery
->charging_passed_time
, charge
);
3062 battery
->timetofull
= value
.intval
;
3064 battery
->timetofull
= -1;
3068 static void sec_bat_time_to_full_work(struct work_struct
*work
)
3070 struct sec_battery_info
*battery
= container_of(work
,
3071 struct sec_battery_info
, timetofull_work
.work
);
3072 union power_supply_propval value
= {0, };
3074 psy_do_property(battery
->pdata
->charger_name
, get
,
3075 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
3076 battery
->current_max
= value
.intval
;
3078 value
.intval
= SEC_BATTERY_CURRENT_MA
;
3079 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3080 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
3081 battery
->current_now
= value
.intval
;
3083 value
.intval
= SEC_BATTERY_CURRENT_MA
;
3084 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3085 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
3086 battery
->current_avg
= value
.intval
;
3088 sec_bat_calc_time_to_full(battery
);
3089 dev_info(battery
->dev
, "%s: \n",__func__
);
3090 if (battery
->voltage_now
> 0)
3091 battery
->voltage_now
--;
3093 power_supply_changed(battery
->psy_bat
);
3097 extern bool get_usb_enumeration_state(void);
3098 /* To disaply slow charging when usb charging 100MA*/
3099 static void sec_bat_check_slowcharging_work(struct work_struct
*work
)
3101 struct sec_battery_info
*battery
= container_of(work
,
3102 struct sec_battery_info
, slowcharging_work
.work
);
3104 if (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL_DEFAULT
&&
3105 battery
->cable_type
== SEC_BATTERY_CABLE_USB
) {
3106 if (!get_usb_enumeration_state() &&
3107 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_USB_100MA
)) {
3108 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
, 0);
3109 battery
->max_charge_power
= battery
->input_voltage
* battery
->current_max
;
3112 dev_info(battery
->dev
, "%s: \n",__func__
);
3115 static void sec_bat_wc_cv_mode_check(struct sec_battery_info
*battery
)
3117 union power_supply_propval value
= {0, };
3119 pr_info("%s: battery->wc_cv_mode = %d \n", __func__
, battery
->wc_cv_mode
);
3121 if (battery
->capacity
>= battery
->pdata
->wireless_cc_cv
) {
3122 pr_info("%s: 4.5W WC Changed Vout input current limit\n", __func__
);
3123 battery
->wc_cv_mode
= true;
3124 sec_bat_set_charging_current(battery
);
3125 value
.intval
= WIRELESS_VOUT_CC_CV_VOUT
; // 5.5V
3126 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3127 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3128 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_5
; // 80mv
3129 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3130 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3131 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
||
3132 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
||
3133 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
3134 value
.intval
= WIRELESS_CLAMP_ENABLE
;
3135 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3136 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3138 /* Change FOD values for CV mode */
3139 value
.intval
= POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
;
3140 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3141 POWER_SUPPLY_PROP_STATUS
, value
);
3145 static void sec_bat_siop_level_work(struct work_struct
*work
)
3147 struct sec_battery_info
*battery
= container_of(work
,
3148 struct sec_battery_info
, siop_level_work
.work
);
3150 pr_info("%s : set current by siop level(%d)\n",__func__
, battery
->siop_level
);
3151 sec_bat_set_charging_current(battery
);
3152 wake_unlock(&battery
->siop_level_wake_lock
);
3155 static void sec_bat_wc_headroom_work(struct work_struct
*work
)
3157 struct sec_battery_info
*battery
= container_of(work
,
3158 struct sec_battery_info
, wc_headroom_work
.work
);
3159 union power_supply_propval value
= {0, };
3161 /* The default headroom is high, because initial wireless charging state is unstable.
3162 After 10sec wireless charging, however, recover headroom level to avoid chipset damage */
3163 if (battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
) {
3164 /* When the capacity is higher than 99, and the device is in 5V wireless charging state,
3165 then Vrect headroom has to be headroom_2.
3166 Refer to the sec_bat_siop_work function. */
3167 if (battery
->capacity
< 99 && battery
->status
!= POWER_SUPPLY_STATUS_FULL
) {
3168 if (is_nv_wireless_type(battery
->cable_type
)) {
3169 if (battery
->capacity
< battery
->pdata
->wireless_cc_cv
)
3170 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_4
; /* WPC 4.5W, Vrect Room 30mV */
3172 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_5
; /* WPC 4.5W, Vrect Room 80mV */
3173 } else if (is_hv_wireless_type(battery
->cable_type
)) {
3174 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_5
;
3176 value
.intval
= WIRELESS_VRECT_ADJ_OFF
;
3178 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3179 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3180 pr_info("%s: Changed Vrect adjustment from Rx activation(10seconds)", __func__
);
3182 if (is_nv_wireless_type(battery
->cable_type
))
3183 sec_bat_wc_cv_mode_check(battery
);
3185 wake_unlock(&battery
->wc_headroom_wake_lock
);
3188 static void sec_bat_ext_event_work(struct work_struct
*work
)
3190 struct sec_battery_info
*battery
= container_of(work
,
3191 struct sec_battery_info
, ext_event_work
.work
);
3193 union power_supply_propval value
= {0, };
3195 /* TX OFF state, it has only call scenario */
3196 if (battery
->ext_event
& BATT_EXT_EVENT_CALL
) {
3197 pr_info("%s: Call ON\n", __func__
);
3199 value
.intval
= BATT_EXT_EVENT_CALL
;
3200 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3201 POWER_SUPPLY_EXT_PROP_CALL_EVENT
, value
);
3203 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
||
3204 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_PACK
||
3205 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
3206 pr_info("%s : Call is on during Wireless Pack or TX\n",__func__
);
3207 battery
->wc_rx_phm_mode
= true;
3209 } else if (!(battery
->ext_event
& BATT_EXT_EVENT_CALL
)) {
3210 pr_info("%s: Call OFF\n", __func__
);
3212 value
.intval
= BATT_EXT_EVENT_NONE
;
3213 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3214 POWER_SUPPLY_EXT_PROP_CALL_EVENT
, value
);
3216 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
||
3217 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_PACK
||
3218 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
3219 pr_info("%s : Call is off during Wireless Pack or TX\n",__func__
);
3223 if(battery
->wc_rx_phm_mode
) {
3224 pr_info("%s: ESCAPE PHM STEP 1 - WC CONTROL: Enable", __func__
);
3225 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
3227 pr_info("%s: ESCAPE PHM STEP 2 - WC CONTROL: Disable", __func__
);
3228 gpio_direction_output(battery
->pdata
->wpc_en
, 1);
3230 pr_info("%s: ESCAPE PHM STEP 3 - WC CONTROL: Enable", __func__
);
3231 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
3233 battery
->wc_rx_phm_mode
= false;
3235 wake_unlock(&battery
->ext_event_wake_lock
);
3238 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
3239 static void sec_bat_fw_update_work(struct sec_battery_info
*battery
, int mode
)
3241 union power_supply_propval value
= {0, };
3243 dev_info(battery
->dev
, "%s \n", __func__
);
3245 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
3248 case SEC_WIRELESS_RX_SDCARD_MODE
:
3249 case SEC_WIRELESS_RX_BUILT_IN_MODE
:
3250 value
.intval
= mode
;
3251 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3252 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
, value
);
3254 case SEC_WIRELESS_TX_ON_MODE
:
3255 value
.intval
= true;
3256 psy_do_property(battery
->pdata
->charger_name
, set
,
3257 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3259 value
.intval
= mode
;
3260 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3261 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
, value
);
3264 case SEC_WIRELESS_TX_OFF_MODE
:
3265 value
.intval
= false;
3266 psy_do_property(battery
->pdata
->charger_name
, set
,
3267 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3274 static void sec_bat_fw_init_work(struct work_struct
*work
)
3276 struct sec_battery_info
*battery
= container_of(work
,
3277 struct sec_battery_info
, fw_init_work
.work
);
3279 union power_supply_propval value
= {0, };
3280 int uno_status
= 0, wpc_det
= 0;
3282 dev_info(battery
->dev
, "%s \n", __func__
);
3284 wpc_det
= gpio_get_value(battery
->pdata
->wpc_det
);
3286 pr_info("%s wpc_det = %d \n", __func__
, wpc_det
);
3288 psy_do_property(battery
->pdata
->charger_name
, get
,
3289 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3290 uno_status
= value
.intval
;
3291 pr_info("%s uno = %d \n", __func__
, uno_status
);
3293 if (!uno_status
&& !wpc_det
) {
3294 pr_info("%s uno on \n", __func__
);
3295 value
.intval
= true;
3296 psy_do_property(battery
->pdata
->charger_name
, set
,
3297 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3300 value
.intval
= SEC_WIRELESS_RX_INIT
;
3301 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3302 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
, value
);
3304 if (!uno_status
&& !wpc_det
) {
3305 pr_info("%s uno off \n", __func__
);
3306 value
.intval
= false;
3307 psy_do_property(battery
->pdata
->charger_name
, set
,
3308 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3312 #if defined(CONFIG_UPDATE_BATTERY_DATA)
3313 static int sec_bat_parse_dt(struct device
*dev
, struct sec_battery_info
*battery
);
3314 static void sec_bat_update_data_work(struct work_struct
*work
)
3316 struct sec_battery_info
*battery
= container_of(work
,
3317 struct sec_battery_info
, batt_data_work
.work
);
3319 sec_battery_update_data(battery
->data_path
);
3320 wake_unlock(&battery
->batt_data_wake_lock
);
3324 static void sec_bat_misc_event_work(struct work_struct
*work
)
3326 struct sec_battery_info
*battery
= container_of(work
,
3327 struct sec_battery_info
, misc_event_work
.work
);
3328 int xor_misc_event
= battery
->prev_misc_event
^ battery
->misc_event
;
3330 if ((xor_misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
) &&
3331 (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
)) {
3332 if (battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
) {
3333 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
3334 } else if (battery
->prev_misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
) {
3335 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
3339 pr_info("%s: change misc event(0x%x --> 0x%x)\n",
3340 __func__
, battery
->prev_misc_event
, battery
->misc_event
);
3341 battery
->prev_misc_event
= battery
->misc_event
;
3342 wake_unlock(&battery
->misc_event_wake_lock
);
3344 wake_lock(&battery
->monitor_wake_lock
);
3345 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
3348 static void sec_bat_calculate_safety_time(struct sec_battery_info
*battery
)
3350 unsigned long long expired_time
= battery
->expired_time
;
3351 struct timespec ts
= {0, };
3353 int input_power
= battery
->current_max
* battery
->input_voltage
* 1000;
3354 int charging_power
= battery
->charging_current
* (battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
);
3355 static int discharging_cnt
= 0;
3357 if (battery
->current_avg
< 0) {
3360 discharging_cnt
= 0;
3363 if (discharging_cnt
>= 5) {
3364 battery
->expired_time
= battery
->pdata
->expired_time
;
3365 battery
->prev_safety_time
= 0;
3366 pr_info("%s : SAFETY TIME RESET! DISCHARGING CNT(%d)\n",
3367 __func__
, discharging_cnt
);
3368 discharging_cnt
= 0;
3370 } else if (battery
->lcd_status
&& battery
->stop_timer
) {
3371 battery
->prev_safety_time
= 0;
3375 get_monotonic_boottime(&ts
);
3377 if (battery
->prev_safety_time
== 0) {
3378 battery
->prev_safety_time
= ts
.tv_sec
;
3381 if (input_power
> charging_power
) {
3382 curr
= battery
->charging_current
;
3384 curr
= input_power
/ (battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
);
3385 curr
= (curr
* 9) / 10;
3388 if (battery
->lcd_status
&& !battery
->stop_timer
) {
3389 battery
->stop_timer
= true;
3390 } else if (!battery
->lcd_status
&& battery
->stop_timer
) {
3391 battery
->stop_timer
= false;
3394 pr_info("%s : EXPIRED_TIME(%llu), IP(%d), CP(%d), CURR(%d), STANDARD(%d)\n",
3395 __func__
, expired_time
, input_power
, charging_power
, curr
, battery
->pdata
->standard_curr
);
3400 expired_time
= (expired_time
* battery
->pdata
->standard_curr
) / curr
;
3402 pr_info("%s : CAL_EXPIRED_TIME(%llu) TIME NOW(%ld) TIME PREV(%ld)\n", __func__
, expired_time
, ts
.tv_sec
, battery
->prev_safety_time
);
3404 if (expired_time
<= ((ts
.tv_sec
- battery
->prev_safety_time
) * 1000))
3407 expired_time
-= ((ts
.tv_sec
- battery
->prev_safety_time
) * 1000);
3409 battery
->cal_safety_time
= expired_time
;
3410 expired_time
= (expired_time
* curr
) / battery
->pdata
->standard_curr
;
3412 battery
->expired_time
= expired_time
;
3413 battery
->prev_safety_time
= ts
.tv_sec
;
3414 pr_info("%s : REMAIN_TIME(%ld) CAL_REMAIN_TIME(%ld)\n", __func__
, battery
->expired_time
, battery
->cal_safety_time
);
3417 static void sec_bat_monitor_work(
3418 struct work_struct
*work
)
3420 struct sec_battery_info
*battery
=
3421 container_of(work
, struct sec_battery_info
,
3423 static struct timespec old_ts
= {0, };
3424 struct timespec c_ts
= {0, };
3426 dev_dbg(battery
->dev
, "%s: Start\n", __func__
);
3427 c_ts
= ktime_to_timespec(ktime_get_boottime());
3429 mutex_lock(&battery
->wclock
);
3430 if (!battery
->wc_enable
) {
3431 pr_info("%s: wc_enable(%d), cnt(%d)\n",
3432 __func__
, battery
->wc_enable
, battery
->wc_enable_cnt
);
3433 if (battery
->wc_enable_cnt
> battery
->wc_enable_cnt_value
) {
3434 battery
->wc_enable
= true;
3435 battery
->wc_enable_cnt
= 0;
3436 if (battery
->pdata
->wpc_en
) {
3437 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
3438 pr_info("%s: WC CONTROL: Enable", __func__
);
3440 pr_info("%s: wpc_en(%d)\n",
3441 __func__
, gpio_get_value(battery
->pdata
->wpc_en
));
3443 battery
->wc_enable_cnt
++;
3445 mutex_unlock(&battery
->wclock
);
3447 /* monitor once after wakeup */
3448 if (battery
->polling_in_sleep
) {
3449 battery
->polling_in_sleep
= false;
3450 if ((battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) &&
3451 (battery
->ps_enable
!= true)) {
3452 if ((unsigned long)(c_ts
.tv_sec
- old_ts
.tv_sec
) < 10 * 60) {
3453 union power_supply_propval value
= {0, };
3455 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3456 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
3457 battery
->voltage_now
= value
.intval
;
3460 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3461 POWER_SUPPLY_PROP_CAPACITY
, value
);
3462 battery
->capacity
= value
.intval
;
3464 sec_bat_get_temperature_info(battery
);
3465 #if defined(CONFIG_BATTERY_CISD)
3466 sec_bat_cisd_check(battery
);
3468 power_supply_changed(battery
->psy_bat
);
3469 pr_info("Skip monitor work(%ld, Vnow:%d(mV), SoC:%d(%%), Tbat:%d(0.1'C))\n",
3470 c_ts
.tv_sec
- old_ts
.tv_sec
, battery
->voltage_now
, battery
->capacity
, battery
->temperature
);
3476 /* update last monitor time */
3479 sec_bat_get_battery_info(battery
);
3480 #if defined(CONFIG_BATTERY_CISD)
3481 sec_bat_cisd_check(battery
);
3484 #if defined(CONFIG_STEP_CHARGING)
3485 sec_bat_check_step_charging(battery
);
3487 #if defined(CONFIG_CALC_TIME_TO_FULL)
3488 /* time to full check */
3489 sec_bat_calc_time_to_full(battery
);
3493 if (battery
->test_mode
) {
3494 dev_err(battery
->dev
, "%s: Test Mode\n", __func__
);
3495 sec_bat_do_test_function(battery
);
3496 if (battery
->test_mode
!= 0)
3497 goto continue_monitor
;
3500 /* 1. battery check */
3501 if (!sec_bat_battery_cable_check(battery
))
3502 goto continue_monitor
;
3504 /* 2. voltage check */
3505 if (!sec_bat_voltage_check(battery
))
3506 goto continue_monitor
;
3508 /* monitor short routine in initial monitor */
3509 if (battery
->pdata
->monitor_initial_count
|| sec_bat_is_short_polling(battery
))
3510 goto skip_current_monitor
;
3512 /* 3. time management */
3513 if (!sec_bat_time_management(battery
))
3514 goto continue_monitor
;
3516 /* 4. temperature check */
3517 if (!sec_bat_temperature_check(battery
))
3518 goto continue_monitor
;
3520 #if defined(CONFIG_BATTERY_SWELLING)
3521 sec_bat_swelling_check(battery
);
3523 if ((battery
->swelling_mode
== SWELLING_MODE_CHARGING
|| battery
->swelling_mode
== SWELLING_MODE_FULL
) &&
3524 (!battery
->charging_block
))
3525 sec_bat_swelling_fullcharged_check(battery
);
3527 sec_bat_fullcharged_check(battery
);
3529 /* 5. full charging check */
3530 sec_bat_fullcharged_check(battery
);
3531 #endif /* CONFIG_BATTERY_SWELLING */
3533 /* 6. additional check */
3534 if (battery
->pdata
->monitor_additional_check
)
3535 battery
->pdata
->monitor_additional_check();
3537 #if defined(CONFIG_BATTERY_SBM_DATA)
3538 sec_bat_add_sbm_data(battery
, SBM_DATA_COMMON_INFO
);
3541 if ((battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
||
3542 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
||
3543 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) &&
3544 !battery
->wc_cv_mode
&& battery
->charging_passed_time
> 10)
3545 sec_bat_wc_cv_mode_check(battery
);
3548 /* clear HEATING_CONTROL*/
3549 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
);
3551 /* calculate safety time */
3552 if (!battery
->charging_block
)
3553 sec_bat_calculate_safety_time(battery
);
3555 /* set charging current */
3556 sec_bat_set_charging_current(battery
);
3558 skip_current_monitor
:
3559 dev_info(battery
->dev
,
3560 "%s: HLT(%d) HLR(%d) HT(%d), HR(%d), LT(%d), LR(%d), lpcharge(%d)\n",
3561 __func__
, battery
->temp_highlimit_threshold
, battery
->temp_highlimit_recovery
,
3562 battery
->temp_high_threshold
, battery
->temp_high_recovery
,
3563 battery
->temp_low_threshold
, battery
->temp_low_recovery
, lpcharge
);
3565 dev_info(battery
->dev
,
3566 "%s: Status(%s), mode(%s), Health(%s), Cable(%s, %s, %d, %d), level(%d%%), slate_mode(%d), store_mode(%d)"
3567 #if defined(CONFIG_AFC_CHARGER_MODE)
3568 ", HV(%s), sleep_mode(%d)"
3570 #if defined(CONFIG_BATTERY_AGE_FORECAST)
3574 sec_bat_status_str
[battery
->status
],
3575 sec_bat_charging_mode_str
[battery
->charging_mode
],
3576 sec_bat_health_str
[battery
->health
],
3577 sec_cable_type
[battery
->cable_type
],
3578 sec_cable_type
[battery
->wire_status
],
3579 battery
->muic_cable_type
,
3580 battery
->pd_usb_attached
,
3581 battery
->siop_level
,
3582 battery
->slate_mode
,
3584 #if defined(CONFIG_AFC_CHARGER_MODE)
3585 , battery
->hv_chg_name
, sleep_mode
3587 #if defined(CONFIG_BATTERY_AGE_FORECAST)
3588 , battery
->batt_cycle
3591 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
3592 dev_info(battery
->dev
,
3593 "%s: battery->stability_test(%d), battery->eng_not_full_status(%d)\n",
3594 __func__
, battery
->stability_test
, battery
->eng_not_full_status
);
3596 #if defined(CONFIG_SEC_FACTORY)
3597 if ((battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
) && (battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
)) {
3599 if ((battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
) && (battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
) && battery
->store_mode
) {
3601 dev_info(battery
->dev
,
3602 "%s: @battery->capacity = (%d), battery->status= (%d), battery->store_mode=(%d)\n",
3603 __func__
, battery
->capacity
, battery
->status
, battery
->store_mode
);
3605 if (battery
->capacity
>= STORE_MODE_CHARGING_MAX
) {
3606 int chg_mode
= battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
?
3607 SEC_BAT_CHG_MODE_BUCK_OFF
: SEC_BAT_CHG_MODE_CHARGING_OFF
;
3608 /* to discharge the battery, off buck */
3609 if (battery
->capacity
> STORE_MODE_CHARGING_MAX
)
3610 chg_mode
= SEC_BAT_CHG_MODE_BUCK_OFF
;
3612 sec_bat_set_charging_status(battery
,
3613 POWER_SUPPLY_STATUS_DISCHARGING
);
3614 sec_bat_set_charge(battery
, chg_mode
);
3617 if ((battery
->capacity
<= STORE_MODE_CHARGING_MIN
) && (battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
)) {
3618 sec_bat_set_charging_status(battery
,
3619 POWER_SUPPLY_STATUS_CHARGING
);
3620 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
3623 power_supply_changed(battery
->psy_bat
);
3626 sec_bat_set_polling(battery
);
3628 if (battery
->capacity
<= 0 || battery
->health_change
)
3629 wake_lock_timeout(&battery
->monitor_wake_lock
, HZ
* 5);
3631 wake_unlock(&battery
->monitor_wake_lock
);
3633 dev_dbg(battery
->dev
, "%s: End\n", __func__
);
3638 static enum alarmtimer_restart
sec_bat_alarm(
3639 struct alarm
*alarm
, ktime_t now
)
3641 struct sec_battery_info
*battery
= container_of(alarm
,
3642 struct sec_battery_info
, polling_alarm
);
3644 dev_dbg(battery
->dev
,
3647 /* In wake up, monitor work will be queued in complete function
3648 * To avoid duplicated queuing of monitor work,
3649 * do NOT queue monitor work in wake up by polling alarm
3651 if (!battery
->polling_in_sleep
) {
3652 wake_lock(&battery
->monitor_wake_lock
);
3653 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
3654 dev_dbg(battery
->dev
, "%s: Activated\n", __func__
);
3657 return ALARMTIMER_NORESTART
;
3660 static void sec_bat_check_input_voltage(struct sec_battery_info
*battery
)
3662 unsigned int voltage
= 0;
3663 int input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
3665 if (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
) {
3666 battery
->max_charge_power
= battery
->pd_max_charge_power
;
3669 else if (is_hv_wire_12v_type(battery
->cable_type
))
3670 voltage
= SEC_INPUT_VOLTAGE_12V
;
3671 else if (is_hv_wire_9v_type(battery
->cable_type
))
3672 voltage
= SEC_INPUT_VOLTAGE_9V
;
3673 else if (is_hv_wireless_type(battery
->cable_type
) ||
3674 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
)
3675 voltage
= SEC_INPUT_VOLTAGE_10V
;
3677 voltage
= SEC_INPUT_VOLTAGE_5V
;
3679 battery
->input_voltage
= voltage
;
3680 battery
->charge_power
= voltage
* input_current
;
3681 #if !defined(CONFIG_SEC_FACTORY)
3682 if (battery
->charge_power
> battery
->max_charge_power
)
3684 battery
->max_charge_power
= battery
->charge_power
;
3686 pr_info("%s: battery->input_voltage : %dV, %dmW, %dmW)\n", __func__
,
3687 battery
->input_voltage
, battery
->charge_power
, battery
->max_charge_power
);
3690 static void sec_bat_cable_work(struct work_struct
*work
)
3692 struct sec_battery_info
*battery
= container_of(work
,
3693 struct sec_battery_info
, cable_work
.work
);
3694 union power_supply_propval val
= {0, };
3695 int current_cable_type
= SEC_BATTERY_CABLE_NONE
;
3697 dev_info(battery
->dev
, "%s: Start\n", __func__
);
3698 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
,
3699 SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
);
3700 #if defined(CONFIG_CCIC_NOTIFIER)
3701 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
3702 if (battery
->pdic_info
.sink_status
.selected_pdo_num
==
3703 battery
->pdic_info
.sink_status
.current_pdo_num
)
3704 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SELECT_PDO
);
3705 sec_bat_get_input_current_in_power_list(battery
);
3706 sec_bat_get_charging_current_in_power_list(battery
);
3710 if (battery
->wc_status
&& battery
->wc_enable
) {
3711 int wireless_current
, wire_current
;
3712 int temp_current_type
;
3714 if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC
)
3715 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
3716 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_HV
)
3717 current_cable_type
= SEC_BATTERY_CABLE_HV_WIRELESS
;
3718 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK
)
3719 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_PACK
;
3720 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK_HV
)
3721 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_HV_PACK
;
3722 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_STAND
)
3723 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_STAND
;
3724 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_STAND_HV
)
3725 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_HV_STAND
;
3726 else if (battery
->wc_status
== SEC_WIRELESS_PAD_VEHICLE
)
3727 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_VEHICLE
;
3728 else if (battery
->wc_status
== SEC_WIRELESS_PAD_VEHICLE_HV
)
3729 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE
;
3730 else if (battery
->wc_status
== SEC_WIRELESS_PAD_PREPARE_HV
)
3731 current_cable_type
= SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
;
3732 else if (battery
->wc_status
== SEC_WIRELESS_PAD_TX
)
3733 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_TX
;
3735 current_cable_type
= SEC_BATTERY_CABLE_PMA_WIRELESS
;
3737 if (current_cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
)
3738 temp_current_type
= SEC_BATTERY_CABLE_HV_WIRELESS
;
3740 temp_current_type
= current_cable_type
;
3742 if (battery
->wire_status
!= SEC_BATTERY_CABLE_NONE
) {
3743 wireless_current
= battery
->pdata
->charging_current
[temp_current_type
].input_current_limit
;
3744 wireless_current
= wireless_current
* (is_hv_wireless_type(temp_current_type
) ?
3745 SEC_INPUT_VOLTAGE_9V
: SEC_INPUT_VOLTAGE_5V
);
3746 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
3747 if (wireless_current
< battery
->pd_max_charge_power
)
3748 current_cable_type
= battery
->wire_status
;
3750 wire_current
= (battery
->wire_status
== SEC_BATTERY_CABLE_PREPARE_TA
?
3751 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_TA
].input_current_limit
:
3752 battery
->pdata
->charging_current
[battery
->wire_status
].input_current_limit
);
3754 wire_current
= wire_current
* (is_hv_wire_type(battery
->wire_status
) ?
3755 (battery
->wire_status
== SEC_BATTERY_CABLE_12V_TA
? SEC_INPUT_VOLTAGE_12V
: SEC_INPUT_VOLTAGE_9V
)
3756 : SEC_INPUT_VOLTAGE_5V
);
3757 pr_info("%s: wl_cur(%d), wr_cur(%d), wc_cable_type(%d), wire_cable_type(%d)\n",
3758 __func__
, wireless_current
, wire_current
, current_cable_type
, battery
->wire_status
);
3760 if (wireless_current
< wire_current
)
3761 current_cable_type
= battery
->wire_status
;
3765 current_cable_type
= battery
->wire_status
;
3767 if (battery
->wc_status
) {
3768 /* wired charger has priority, but wireless charger exist. */
3769 val
.intval
= is_wired_type(current_cable_type
) ?
3770 MFC_LDO_OFF
: MFC_LDO_ON
;
3771 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3772 POWER_SUPPLY_PROP_CHARGE_EMPTY
, val
);
3775 if (current_cable_type
== SEC_BATTERY_CABLE_PDIC
&&
3776 battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
&&
3777 !battery
->slate_mode
) {
3778 cancel_delayed_work(&battery
->afc_work
);
3779 wake_unlock(&battery
->afc_wake_lock
);
3780 sec_bat_set_current_event(battery
, 0,
3781 SEC_BAT_CURRENT_EVENT_AFC
| SEC_BAT_CURRENT_EVENT_AICL
);
3782 battery
->aicl_current
= 0;
3783 sec_bat_set_charging_current(battery
);
3784 power_supply_changed(battery
->psy_bat
);
3785 goto end_of_cable_work
;
3788 /* to clear this value when cable type switched without dettach */
3789 if ((is_wired_type(battery
->cable_type
) && is_wireless_type(current_cable_type
)) ||
3790 (is_wireless_type(battery
->cable_type
) && is_wired_type(current_cable_type
)))
3791 battery
->max_charge_power
= 0;
3793 if ((current_cable_type
== battery
->cable_type
) && !battery
->slate_mode
) {
3794 dev_dbg(battery
->dev
,
3795 "%s: Cable is NOT Changed(%d)\n",
3796 __func__
, battery
->cable_type
);
3797 /* Do NOT activate cable work for NOT changed */
3798 goto end_of_cable_work
;
3801 #if defined(CONFIG_BATTERY_SWELLING)
3802 if ((current_cable_type
== SEC_BATTERY_CABLE_NONE
) ||
3803 (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
&& battery
->swelling_mode
== SWELLING_MODE_NONE
) ||
3804 (battery
->cable_type
== SEC_BATTERY_CABLE_OTG
&& battery
->swelling_mode
== SWELLING_MODE_NONE
)) {
3805 battery
->swelling_mode
= SWELLING_MODE_NONE
;
3806 /* restore 4.4V float voltage */
3807 val
.intval
= battery
->pdata
->swelling_normal_float_voltage
;
3808 psy_do_property(battery
->pdata
->charger_name
, set
,
3809 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
3810 pr_info("%s: float voltage = %d\n", __func__
, val
.intval
);
3812 pr_info("%s: skip float_voltage setting, swelling_mode(%d)\n",
3813 __func__
, battery
->swelling_mode
);
3817 battery
->cable_type
= current_cable_type
;
3818 battery
->wpc_vout_level
= WIRELESS_VOUT_10V
;
3819 if (is_wireless_type(battery
->cable_type
)) {
3820 power_supply_changed(battery
->psy_bat
);
3821 /* After 10sec wireless charging, Vrect headroom has to be reduced */
3822 wake_lock(&battery
->wc_headroom_wake_lock
);
3823 queue_delayed_work(battery
->monitor_wqueue
, &battery
->wc_headroom_work
,
3824 msecs_to_jiffies(10000));
3827 if (battery
->pdata
->check_cable_result_callback
)
3828 battery
->pdata
->check_cable_result_callback(battery
->cable_type
);
3829 /* platform can NOT get information of cable connection
3830 * because wakeup time is too short to check uevent
3831 * To make sure that target is wakeup
3832 * if cable is connected and disconnected,
3833 * activated wake lock in a few seconds
3835 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
3837 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
||
3838 ((battery
->pdata
->cable_check_type
&
3839 SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE
) &&
3840 battery
->cable_type
== SEC_BATTERY_CABLE_UNKNOWN
)) {
3841 /* initialize all status */
3842 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3843 battery
->vbus_chg_by_siop
= false;
3844 battery
->is_recharging
= false;
3845 #if defined(CONFIG_BATTERY_CISD)
3846 battery
->cisd
.charging_end_time
= 0;
3847 battery
->cisd
.recharge_count
= 0;
3848 battery
->cisd
.charging_end_time_2
= 0;
3849 battery
->cisd
.recharge_count_2
= 0;
3850 battery
->cisd
.ab_vbat_check_count
= 0;
3851 battery
->cisd
.state
&= ~CISD_STATE_OVER_VOLTAGE
;
3853 battery
->input_voltage
= 0;
3854 battery
->charge_power
= 0;
3855 battery
->max_charge_power
= 0;
3856 battery
->pd_max_charge_power
= 0;
3857 sec_bat_set_charging_status(battery
,
3858 POWER_SUPPLY_STATUS_DISCHARGING
);
3859 battery
->chg_limit
= false;
3860 battery
->mix_limit
= false;
3861 battery
->chg_limit_recovery_cable
= SEC_BATTERY_CABLE_NONE
;
3862 battery
->wc_heating_start_time
= 0;
3863 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
3864 cancel_delayed_work(&battery
->afc_work
);
3865 wake_unlock(&battery
->afc_wake_lock
);
3866 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
3867 USB_CURRENT_HIGH_SPEED
, USB_CURRENT_HIGH_SPEED
);
3868 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_TA
,
3869 battery
->pdata
->default_input_current
, battery
->pdata
->default_charging_current
);
3870 /* usb default current is 100mA before configured*/
3871 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_100MA
,
3872 (SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
|
3873 SEC_BAT_CURRENT_EVENT_AFC
|
3874 SEC_BAT_CURRENT_EVENT_USB_SUPER
|
3875 SEC_BAT_CURRENT_EVENT_USB_100MA
|
3876 SEC_BAT_CURRENT_EVENT_VBAT_OVP
|
3877 SEC_BAT_CURRENT_EVENT_VSYS_OVP
|
3878 SEC_BAT_CURRENT_EVENT_CHG_LIMIT
|
3879 SEC_BAT_CURRENT_EVENT_AICL
|
3880 SEC_BAT_CURRENT_EVENT_SELECT_PDO
));
3882 cancel_delayed_work(&battery
->slowcharging_work
);
3883 battery
->wc_cv_mode
= false;
3884 battery
->is_sysovlo
= false;
3885 battery
->is_vbatovlo
= false;
3886 battery
->is_abnormal_temp
= false;
3888 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
))
3889 goto end_of_cable_work
;
3890 } else if(battery
->slate_mode
) {
3891 dev_info(battery
->dev
,
3892 "%s:slate mode on\n",__func__
);
3893 battery
->is_recharging
= false;
3894 battery
->cable_type
= SEC_BATTERY_CABLE_NONE
;
3895 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3896 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
3897 sec_bat_set_charging_status(battery
,
3898 POWER_SUPPLY_STATUS_DISCHARGING
);
3899 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
3901 #if defined(CONFIG_EN_OOPS)
3902 val
.intval
= battery
->cable_type
;
3903 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
3904 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN
, val
);
3906 /* Do NOT display the charging icon when OTG or HMT_CONNECTED is enabled */
3907 if (battery
->cable_type
== SEC_BATTERY_CABLE_OTG
||
3908 battery
->cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
3909 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3910 battery
->status
= POWER_SUPPLY_STATUS_DISCHARGING
;
3911 } else if (!battery
->is_sysovlo
&& !battery
->is_vbatovlo
&& !battery
->is_abnormal_temp
&&
3912 (!battery
->charging_block
|| !battery
->swelling_mode
)) {
3913 if (battery
->pdata
->full_check_type
!=
3914 SEC_BATTERY_FULLCHARGED_NONE
)
3915 battery
->charging_mode
=
3916 SEC_BATTERY_CHARGING_1ST
;
3918 battery
->charging_mode
=
3919 SEC_BATTERY_CHARGING_2ND
;
3921 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
)
3922 sec_bat_set_charging_status(battery
,
3923 POWER_SUPPLY_STATUS_FULL
);
3925 sec_bat_set_charging_status(battery
,
3926 POWER_SUPPLY_STATUS_CHARGING
);
3929 if (!battery
->is_sysovlo
&& !battery
->is_vbatovlo
&& !battery
->is_abnormal_temp
)
3930 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
3932 if (battery
->cable_type
== SEC_BATTERY_CABLE_TA
||
3933 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
||
3934 battery
->cable_type
== SEC_BATTERY_CABLE_PMA_WIRELESS
) {
3935 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_AFC
, SEC_BAT_CURRENT_EVENT_AFC
);
3937 cancel_delayed_work(&battery
->afc_work
);
3938 wake_unlock(&battery
->afc_wake_lock
);
3939 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AFC
);
3942 if (battery
->cable_type
== SEC_BATTERY_CABLE_OTG
||
3943 battery
->cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
3944 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
))
3945 goto end_of_cable_work
;
3946 } else if (!battery
->is_sysovlo
&& !battery
->is_vbatovlo
&& !battery
->is_abnormal_temp
&&
3947 (!battery
->charging_block
|| !battery
->swelling_mode
)) {
3948 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
))
3949 goto end_of_cable_work
;
3952 if (battery
->cable_type
== SEC_BATTERY_CABLE_USB
&& !lpcharge
)
3953 queue_delayed_work(battery
->monitor_wqueue
, &battery
->slowcharging_work
,
3954 msecs_to_jiffies(3000));
3956 #if defined(CONFIG_CALC_TIME_TO_FULL)
3958 cancel_delayed_work(&battery
->timetofull_work
);
3959 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
) {
3962 if (!is_wireless_type(battery
->cable_type
)) {
3963 work_delay
= battery
->pdata
->pre_afc_work_delay
;
3965 work_delay
= battery
->pdata
->pre_wc_afc_work_delay
;
3968 queue_delayed_work(battery
->monitor_wqueue
,
3969 &battery
->timetofull_work
, msecs_to_jiffies(work_delay
));
3975 /* set online(cable type) */
3976 val
.intval
= battery
->cable_type
;
3977 psy_do_property(battery
->pdata
->charger_name
, set
,
3978 POWER_SUPPLY_PROP_ONLINE
, val
);
3979 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
3980 POWER_SUPPLY_PROP_ONLINE
, val
);
3981 /* set charging current */
3982 psy_do_property(battery
->pdata
->charger_name
, get
,
3983 POWER_SUPPLY_PROP_CURRENT_AVG
, val
);
3984 battery
->aicl_current
= 0;
3985 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AICL
);
3986 battery
->input_current
= val
.intval
;
3987 /* to init battery type current when wireless charging -> battery case */
3988 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
)
3989 psy_do_property(battery
->pdata
->charger_name
, set
,
3990 POWER_SUPPLY_PROP_CURRENT_MAX
, val
);
3991 if (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
)
3992 sec_bat_check_input_voltage(battery
);
3993 sec_bat_set_charging_current(battery
);
3995 /* polling time should be reset when cable is changed
3996 * polling_in_sleep should be reset also
3997 * before polling time is re-calculated
3998 * to prevent from counting 1 for events
3999 * right after cable is connected
4001 battery
->polling_in_sleep
= false;
4002 sec_bat_get_polling_time(battery
);
4004 dev_info(battery
->dev
,
4005 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
4006 __func__
, sec_bat_status_str
[battery
->status
],
4007 battery
->polling_in_sleep
? "Yes" : "No",
4008 (battery
->charging_mode
==
4009 SEC_BATTERY_CHARGING_NONE
) ? "No" : "Yes",
4010 battery
->polling_short
? "Yes" : "No");
4011 dev_info(battery
->dev
,
4012 "%s: Polling time is reset to %d sec.\n", __func__
,
4013 battery
->polling_time
);
4015 battery
->polling_count
= 1; /* initial value = 1 */
4017 wake_lock(&battery
->monitor_wake_lock
);
4018 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
4020 wake_unlock(&battery
->cable_wake_lock
);
4021 dev_info(battery
->dev
, "%s: End\n", __func__
);
4024 static void sec_bat_afc_work(struct work_struct
*work
)
4026 struct sec_battery_info
*battery
= container_of(work
,
4027 struct sec_battery_info
, afc_work
.work
);
4028 union power_supply_propval value
= {0, };
4030 psy_do_property(battery
->pdata
->charger_name
, get
,
4031 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
4032 battery
->current_max
= value
.intval
;
4034 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
) {
4035 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AFC
);
4036 if ((battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
&&
4037 battery
->current_max
>= battery
->pdata
->pre_wc_afc_input_current
) ||
4038 ((battery
->cable_type
== SEC_BATTERY_CABLE_TA
) &&
4039 battery
->current_max
>= battery
->pdata
->pre_afc_input_current
)) {
4040 sec_bat_set_charging_current(battery
);
4043 wake_unlock(&battery
->afc_wake_lock
);
4046 ssize_t
sec_bat_show_attrs(struct device
*dev
,
4047 struct device_attribute
*attr
, char *buf
)
4049 struct power_supply
*psy
= dev_get_drvdata(dev
);
4050 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
4051 const ptrdiff_t offset
= attr
- sec_battery_attrs
;
4052 union power_supply_propval value
= {0, };
4057 case BATT_RESET_SOC
:
4059 case BATT_READ_RAW_SOC
:
4062 SEC_FUELGAUGE_CAPACITY_TYPE_RAW
;
4063 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4064 POWER_SUPPLY_PROP_CAPACITY
, value
);
4066 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4070 case BATT_READ_ADJ_SOC
:
4073 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n",
4074 battery
->batt_type
);
4077 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4078 battery
->voltage_ocv
);
4081 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4082 battery
->inbat_adc
);
4084 case BATT_VOL_ADC_CAL
:
4088 case BATT_VOL_ADC_AVER
:
4091 case BATT_CURRENT_UA_NOW
:
4093 value
.intval
= SEC_BATTERY_CURRENT_UA
;
4094 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4095 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
4096 #if defined(CONFIG_SEC_FACTORY)
4097 pr_err("%s: batt_current_ua_now (%d)\n",
4098 __func__
, value
.intval
);
4100 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4104 case BATT_CURRENT_UA_AVG
:
4106 value
.intval
= SEC_BATTERY_CURRENT_UA
;
4107 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4108 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
4110 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4115 case BATT_FILTER_CFG
:
4117 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4118 POWER_SUPPLY_PROP_FILTER_CFG
, value
);
4120 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n",
4125 switch (battery
->pdata
->thermal_source
) {
4126 case SEC_BATTERY_THERMAL_SOURCE_FG
:
4127 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4128 POWER_SUPPLY_PROP_TEMP
, value
);
4130 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK
:
4131 if (battery
->pdata
->get_temperature_callback
) {
4132 battery
->pdata
->get_temperature_callback(
4133 POWER_SUPPLY_PROP_TEMP
, &value
);
4136 case SEC_BATTERY_THERMAL_SOURCE_ADC
:
4137 sec_bat_get_value_by_adc(battery
,
4138 SEC_BAT_ADC_CHANNEL_TEMP
, &value
);
4143 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4148 If F/G is used for reading the temperature and
4149 compensation table is used,
4150 the raw value that isn't compensated can be read by
4151 POWER_SUPPLY_PROP_TEMP_AMBIENT
4153 switch (battery
->pdata
->thermal_source
) {
4154 case SEC_BATTERY_THERMAL_SOURCE_FG
:
4155 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4156 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
4157 battery
->temp_adc
= value
.intval
;
4162 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4165 case BATT_TEMP_AVER
:
4167 case BATT_TEMP_ADC_AVER
:
4170 if (battery
->pdata
->usb_thermal_source
) {
4171 sec_bat_get_value_by_adc(battery
,
4172 SEC_BAT_ADC_CHANNEL_USB_TEMP
, &value
);
4173 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4176 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4181 if (battery
->pdata
->usb_thermal_source
) {
4182 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4183 battery
->usb_temp_adc
);
4185 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4190 if (battery
->pdata
->chg_thermal_source
) {
4191 sec_bat_get_value_by_adc(battery
,
4192 SEC_BAT_ADC_CHANNEL_CHG_TEMP
, &value
);
4193 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4196 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4201 if (battery
->pdata
->chg_thermal_source
) {
4202 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4203 battery
->chg_temp_adc
);
4205 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4209 case SLAVE_CHG_TEMP
:
4210 if (battery
->pdata
->slave_thermal_source
) {
4211 sec_bat_get_value_by_adc(battery
,
4212 SEC_BAT_ADC_CHANNEL_SLAVE_CHG_TEMP
, &value
);
4213 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4216 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4220 case SLAVE_CHG_TEMP_ADC
:
4221 if (battery
->pdata
->slave_thermal_source
) {
4222 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4223 battery
->slave_chg_temp_adc
);
4225 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4231 case BATT_SLATE_MODE
:
4232 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4233 battery
->slate_mode
);
4236 case BATT_LP_CHARGING
:
4238 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4242 case SIOP_ACTIVATED
:
4245 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4246 battery
->siop_level
);
4249 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", 0);
4251 case BATT_CHARGING_SOURCE
:
4252 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4253 battery
->cable_type
);
4262 SEC_BATTERY_CAPACITY_DESIGNED
;
4263 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4264 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4266 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x ",
4270 SEC_BATTERY_CAPACITY_ABSOLUTE
;
4271 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4272 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4274 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x ",
4278 SEC_BATTERY_CAPACITY_TEMPERARY
;
4279 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4280 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4282 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x ",
4286 SEC_BATTERY_CAPACITY_CURRENT
;
4287 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4288 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4290 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x\n",
4297 struct power_supply
*psy_fg
= NULL
;
4298 psy_fg
= get_power_supply_by_name(battery
->pdata
->fuelgauge_name
);
4300 pr_err("%s: Fail to get psy (%s)\n",
4301 __func__
, battery
->pdata
->fuelgauge_name
);
4303 if (psy_fg
->desc
->get_property
!= NULL
) {
4304 ret
= psy_fg
->desc
->get_property(psy_fg
,
4305 POWER_SUPPLY_PROP_ENERGY_FULL
, &value
);
4307 pr_err("%s: Fail to %s get (%d=>%d)\n",
4308 __func__
, battery
->pdata
->fuelgauge_name
,
4309 POWER_SUPPLY_PROP_ENERGY_FULL
, ret
);
4314 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4319 case CHG_CURRENT_ADC
:
4320 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4321 battery
->current_adc
);
4326 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4327 is_wireless_type(battery
->cable_type
) ? 1: 0);
4330 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4331 battery
->wc_enable
);
4334 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4335 battery
->wc_enable
);
4337 case WC_CONTROL_CNT
:
4338 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4339 battery
->wc_enable_cnt_value
);
4342 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4343 battery
->led_cover
);
4345 case HV_CHARGER_STATUS
:
4348 if (is_hv_wire_12v_type(battery
->cable_type
) ||
4349 battery
->max_charge_power
>= HV_CHARGER_STATUS_STANDARD2
) /* 20000mW */
4351 else if (is_hv_wire_type(battery
->cable_type
) ||
4352 (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
&&
4353 battery
->pd_max_charge_power
>= HV_CHARGER_STATUS_STANDARD1
&&
4354 battery
->pdic_info
.sink_status
.available_pdo_num
> 1) ||
4355 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_TA
||
4356 battery
->max_charge_power
>= HV_CHARGER_STATUS_STANDARD1
) /* 12000mW */
4359 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", check_val
);
4362 case HV_WC_CHARGER_STATUS
:
4363 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4364 is_hv_wireless_type(battery
->cable_type
) ? 1 : 0);
4366 case HV_CHARGER_SET
:
4369 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4370 battery
->factory_mode
);
4373 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4374 battery
->store_mode
);
4379 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4380 battery
->test_mode
);
4383 case BATT_EVENT_CALL
:
4384 case BATT_EVENT_2G_CALL
:
4385 case BATT_EVENT_TALK_GSM
:
4387 case BATT_EVENT_3G_CALL
:
4388 case BATT_EVENT_TALK_WCDMA
:
4390 case BATT_EVENT_MUSIC
:
4392 case BATT_EVENT_VIDEO
:
4394 case BATT_EVENT_BROWSER
:
4396 case BATT_EVENT_HOTSPOT
:
4398 case BATT_EVENT_CAMERA
:
4400 case BATT_EVENT_CAMCORDER
:
4402 case BATT_EVENT_DATA_CALL
:
4404 case BATT_EVENT_WIFI
:
4406 case BATT_EVENT_WIBRO
:
4408 case BATT_EVENT_LTE
:
4410 case BATT_EVENT_LCD
:
4412 case BATT_EVENT_GPS
:
4416 case BATT_TEMP_TABLE
:
4417 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
,
4418 "%d %d %d %d %d %d %d %d\n",
4419 battery
->pdata
->temp_high_threshold_normal
,
4420 battery
->pdata
->temp_high_recovery_normal
,
4421 battery
->pdata
->temp_low_threshold_normal
,
4422 battery
->pdata
->temp_low_recovery_normal
,
4423 battery
->pdata
->temp_high_threshold_lpm
,
4424 battery
->pdata
->temp_high_recovery_lpm
,
4425 battery
->pdata
->temp_low_threshold_lpm
,
4426 battery
->pdata
->temp_low_recovery_lpm
);
4428 case BATT_HIGH_CURRENT_USB
:
4429 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4430 battery
->is_hc_usb
);
4432 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
4433 case TEST_CHARGE_CURRENT
:
4435 psy_do_property(battery
->pdata
->charger_name
, get
,
4436 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
4437 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4442 case SET_STABILITY_TEST
:
4443 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4444 battery
->stability_test
);
4446 case BATT_CAPACITY_MAX
:
4447 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4448 POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN
, value
);
4449 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4451 case BATT_INBAT_VOLTAGE
:
4452 case BATT_INBAT_VOLTAGE_OCV
:
4453 if(battery
->pdata
->support_fgsrc_change
== true) {
4454 int j
, k
, ocv
, ocv_data
[10];
4456 psy_do_property(battery
->pdata
->fgsrc_switch_name
, set
,
4457 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4458 for (j
= 0; j
< 10; j
++) {
4460 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4461 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
4462 ocv_data
[j
] = value
.intval
;
4465 psy_do_property(battery
->pdata
->fgsrc_switch_name
, set
,
4466 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4467 for (j
= 1; j
< 10; j
++) {
4470 while (k
> 0 && ocv_data
[k
-1] > ocv
) {
4471 ocv_data
[k
] = ocv_data
[k
-1];
4477 for (j
= 2; j
< 8; j
++) {
4482 ret
= sec_bat_get_inbat_vol_by_adc(battery
);
4484 dev_info(battery
->dev
, "in-battery voltage ocv(%d)\n", ret
);
4485 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4488 case CHECK_SLAVE_CHG
:
4489 psy_do_property(battery
->pdata
->charger_name
, get
,
4490 POWER_SUPPLY_EXT_PROP_CHECK_SLAVE_I2C
, value
);
4491 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4493 pr_info("%s : CHECK_SLAVE_CHG=%d\n",__func__
,value
.intval
);
4495 case BATT_INBAT_WIRELESS_CS100
:
4496 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4497 POWER_SUPPLY_PROP_STATUS
, value
);
4498 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4500 case HMT_TA_CONNECTED
:
4501 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4502 (battery
->cable_type
== SEC_BATTERY_CABLE_HMT_CONNECTED
) ? 1 : 0);
4505 #if defined(CONFIG_CCIC_NOTIFIER)
4506 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4507 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
) ? 0 : 1);
4509 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4510 (battery
->cable_type
== SEC_BATTERY_CABLE_HMT_CHARGE
) ? 1 : 0);
4513 #if defined(CONFIG_BATTERY_AGE_FORECAST)
4515 value
.intval
= SEC_BATTERY_CAPACITY_CYCLE
;
4516 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4517 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4518 value
.intval
= value
.intval
/ 100;
4519 dev_info(battery
->dev
, "fg cycle(%d)\n", value
.intval
);
4520 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4522 case FG_FULL_VOLTAGE
:
4523 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d %d\n",
4524 battery
->pdata
->chg_float_voltage
, battery
->pdata
->recharge_condition_vcell
);
4528 SEC_BATTERY_CAPACITY_AGEDCELL
;
4529 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4530 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4531 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4534 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", battery
->batt_cycle
);
4538 if (battery
->pdata
->wpc_thermal_source
) {
4539 sec_bat_get_value_by_adc(battery
,
4540 SEC_BAT_ADC_CHANNEL_WPC_TEMP
, &value
);
4541 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4544 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4548 case BATT_WPC_TEMP_ADC
:
4549 if (battery
->pdata
->wpc_thermal_source
) {
4550 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4551 battery
->wpc_temp_adc
);
4553 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4557 case BATT_COIL_TEMP
:
4558 if (battery
->pdata
->coil_thermal_source
) {
4559 sec_bat_get_value_by_adc(battery
,
4560 SEC_BAT_ADC_CHANNEL_WPC_TEMP
, &value
);
4561 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4564 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4568 case BATT_COIL_TEMP_ADC
:
4569 if (battery
->pdata
->coil_thermal_source
) {
4570 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4571 battery
->coil_temp_adc
);
4573 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4577 case BATT_WIRELESS_MST_SWITCH_TEST
:
4578 value
.intval
= SEC_WIRELESS_MST_SWITCH_VERIFY
;
4579 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4580 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4581 pr_info("%s MST switch verify. result: %x\n", __func__
, value
.intval
);
4582 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4584 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
4585 case BATT_WIRELESS_FIRMWARE_UPDATE
:
4586 value
.intval
= SEC_WIRELESS_OTP_FIRM_VERIFY
;
4587 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4588 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4589 pr_info("%s RX firmware verify. result: %d\n", __func__
, value
.intval
);
4590 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4592 case OTP_FIRMWARE_RESULT
:
4593 value
.intval
= SEC_WIRELESS_OTP_FIRM_RESULT
;
4594 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4595 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4596 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4599 value
.intval
= SEC_WIRELESS_IC_GRADE
;
4600 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4601 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4602 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%x ", value
.intval
);
4604 value
.intval
= SEC_WIRELESS_IC_REVISION
;
4605 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4606 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4607 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%x\n", value
.intval
);
4609 case OTP_FIRMWARE_VER_BIN
:
4610 value
.intval
= SEC_WIRELESS_OTP_FIRM_VER_BIN
;
4611 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4612 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4613 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4615 case OTP_FIRMWARE_VER
:
4616 value
.intval
= SEC_WIRELESS_OTP_FIRM_VER
;
4617 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4618 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4620 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4622 case TX_FIRMWARE_RESULT
:
4623 value
.intval
= SEC_WIRELESS_TX_FIRM_RESULT
;
4624 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4625 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4626 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4628 case TX_FIRMWARE_VER
:
4629 value
.intval
= SEC_WIRELESS_TX_FIRM_VER
;
4630 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4631 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4633 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4635 case BATT_TX_STATUS
:
4636 value
.intval
= SEC_TX_FIRMWARE
;
4637 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4638 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4640 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4644 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4645 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4646 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4649 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4650 POWER_SUPPLY_PROP_ENERGY_AVG
, value
);
4651 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4653 case BATT_HV_WIRELESS_STATUS
:
4654 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4655 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
4656 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4658 case BATT_HV_WIRELESS_PAD_CTRL
:
4661 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4662 POWER_SUPPLY_EXT_PROP_WIRELESS_OP_FREQ
, value
);
4663 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4666 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4667 POWER_SUPPLY_EXT_PROP_WIRELESS_TX_CMD
, value
);
4668 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%02x ",
4671 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4672 POWER_SUPPLY_EXT_PROP_WIRELESS_TX_VAL
, value
);
4673 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%02x ",
4676 case BATT_TUNE_FLOAT_VOLTAGE
:
4677 ret
= battery
->pdata
->chg_float_voltage
;
4678 pr_info("%s float voltage = %d mA",__func__
, ret
);
4679 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4682 case BATT_TUNE_INPUT_CHARGE_CURRENT
:
4683 ret
= battery
->pdata
->charging_current
[i
].input_current_limit
;
4684 pr_info("%s input charge current = %d mA",__func__
, ret
);
4685 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4688 case BATT_TUNE_FAST_CHARGE_CURRENT
:
4689 ret
= battery
->pdata
->charging_current
[i
].fast_charging_current
;
4690 pr_info("%s fast charge current = %d mA",__func__
, ret
);
4691 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4694 case BATT_TUNE_UI_TERM_CURRENT_1ST
:
4695 ret
= battery
->pdata
->full_check_current_1st
;
4696 pr_info("%s ui term current = %d mA",__func__
, ret
);
4697 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4700 case BATT_TUNE_UI_TERM_CURRENT_2ND
:
4701 ret
= battery
->pdata
->full_check_current_2nd
;
4702 pr_info("%s ui term current = %d mA",__func__
, ret
);
4703 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4706 case BATT_TUNE_TEMP_HIGH_NORMAL
:
4707 ret
= battery
->pdata
->temp_high_threshold_normal
;
4708 pr_info("%s temp high normal block = %d ",__func__
, ret
);
4709 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4712 case BATT_TUNE_TEMP_HIGH_REC_NORMAL
:
4713 ret
= battery
->pdata
->temp_high_recovery_normal
;
4714 pr_info("%s temp high normal recover = %d ",__func__
, ret
);
4715 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4718 case BATT_TUNE_TEMP_LOW_NORMAL
:
4719 ret
= battery
->pdata
->temp_low_threshold_normal
;
4720 pr_info("%s temp low normal block = %d ",__func__
, ret
);
4721 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4724 case BATT_TUNE_TEMP_LOW_REC_NORMAL
:
4725 ret
= battery
->pdata
->temp_low_recovery_normal
;
4726 pr_info("%s temp low normal recover = %d ",__func__
, ret
);
4727 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4730 case BATT_TUNE_CHG_TEMP_HIGH
:
4731 ret
= battery
->pdata
->chg_high_temp
;
4732 pr_info("%s chg_high_temp = %d ",__func__
, ret
);
4733 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4736 case BATT_TUNE_CHG_TEMP_REC
:
4737 ret
= battery
->pdata
->chg_high_temp_recovery
;
4738 pr_info("%s chg_high_temp_recovery = %d ",__func__
, ret
);
4739 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4742 case BATT_TUNE_CHG_LIMMIT_CUR
:
4743 ret
= battery
->pdata
->chg_charging_limit_current
;
4744 pr_info("%s chg_charging_limit_current = %d ",__func__
, ret
);
4745 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4748 case BATT_TUNE_COIL_TEMP_HIGH
:
4750 case BATT_TUNE_COIL_TEMP_REC
:
4752 case BATT_TUNE_COIL_LIMMIT_CUR
:
4754 #if defined(CONFIG_UPDATE_BATTERY_DATA)
4755 case BATT_UPDATE_DATA
:
4756 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n",
4757 battery
->data_path
? "OK" : "NOK");
4760 case BATT_MISC_EVENT
:
4761 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4762 battery
->misc_event
);
4764 case BATT_EXT_DEV_CHG
:
4766 case BATT_WDT_CONTROL
:
4767 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4768 battery
->wdt_kick_disable
);
4771 value
.strval
= NULL
;
4772 psy_do_property(battery
->pdata
->charger_name
, get
,
4773 POWER_SUPPLY_EXT_PROP_MULTI_CHARGER_MODE
, value
);
4774 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n",
4775 (value
.strval
) ? value
.strval
: "master");
4777 case CHECK_PS_READY
:
4778 #if defined(CONFIG_CCIC_NOTIFIER)
4779 value
.intval
= battery
->pdic_ps_rdy
;
4780 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4782 pr_info("%s : CHECK_PS_READY=%d\n",__func__
,value
.intval
);
4786 psy_do_property(battery
->pdata
->charger_name
, get
,
4787 POWER_SUPPLY_EXT_PROP_CHIP_ID
, value
);
4788 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4791 case CISD_FULLCAPREP_MAX
:
4793 union power_supply_propval fullcaprep_val
;
4795 fullcaprep_val
.intval
= SEC_BATTERY_CAPACITY_FULL
;
4796 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4797 POWER_SUPPLY_PROP_ENERGY_NOW
, fullcaprep_val
);
4799 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4800 fullcaprep_val
.intval
);
4803 #if defined(CONFIG_BATTERY_CISD)
4806 struct cisd
*pcisd
= &battery
->cisd
;
4807 char temp_buf
[1024] = {0,};
4810 sprintf(temp_buf
+strlen(temp_buf
), "%d", pcisd
->data
[CISD_DATA_RESET_ALG
]);
4811 for (j
= CISD_DATA_RESET_ALG
+ 1; j
< CISD_DATA_MAX_PER_DAY
; j
++)
4812 sprintf(temp_buf
+strlen(temp_buf
), " %d", pcisd
->data
[j
]);
4813 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4816 case CISD_DATA_JSON
:
4818 struct cisd
*pcisd
= &battery
->cisd
;
4819 char temp_buf
[1920] = {0,};
4822 sprintf(temp_buf
+strlen(temp_buf
), "\"%s\":\"%d\"",
4823 cisd_data_str
[CISD_DATA_RESET_ALG
], pcisd
->data
[CISD_DATA_RESET_ALG
]);
4824 for (j
= CISD_DATA_RESET_ALG
+ 1; j
< CISD_DATA_MAX
; j
++)
4825 sprintf(temp_buf
+strlen(temp_buf
), ",\"%s\":\"%d\"", cisd_data_str
[j
], pcisd
->data
[j
]);
4826 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4829 case CISD_DATA_D_JSON
:
4831 struct cisd
*pcisd
= &battery
->cisd
;
4832 char temp_buf
[1920] = {0,};
4835 sprintf(temp_buf
+strlen(temp_buf
), "\"%s\":\"%d\"",
4836 cisd_data_str_d
[CISD_DATA_FULL_COUNT_PER_DAY
-CISD_DATA_MAX
],
4837 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
]);
4838 for (j
= CISD_DATA_FULL_COUNT_PER_DAY
+ 1; j
< CISD_DATA_MAX_PER_DAY
; j
++)
4839 sprintf(temp_buf
+strlen(temp_buf
), ",\"%s\":\"%d\"",
4840 cisd_data_str_d
[j
-CISD_DATA_MAX
], pcisd
->data
[j
]);
4842 /* Clear Daily Data */
4843 for (j
= CISD_DATA_FULL_COUNT_PER_DAY
; j
< CISD_DATA_MAX_PER_DAY
; j
++)
4846 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
] = 1;
4847 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX_PER_DAY
] = -300;
4848 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX_PER_DAY
] = -300;
4849 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX_PER_DAY
] = -300;
4850 pcisd
->data
[CISD_DATA_USB_TEMP_MAX_PER_DAY
] = -300;
4851 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN_PER_DAY
] = 1000;
4852 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN_PER_DAY
] = 1000;
4853 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN_PER_DAY
] = 1000;
4854 pcisd
->data
[CISD_DATA_USB_TEMP_MIN_PER_DAY
] = 1000;
4856 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY
] = -300;
4857 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY
] = -300;
4858 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX_PER_DAY
] = -300;
4859 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY
] = -300;
4860 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY
] = 1000;
4861 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY
] = 1000;
4862 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN_PER_DAY
] = 1000;
4863 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY
] = 1000;
4865 pcisd
->data
[CISD_DATA_CAP_MIN_PER_DAY
] = 0xFFFF;
4866 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4869 case CISD_WIRE_COUNT
:
4871 struct cisd
*pcisd
= &battery
->cisd
;
4872 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4873 pcisd
->data
[CISD_DATA_WIRE_COUNT
]);
4878 struct cisd
*pcisd
= &battery
->cisd
;
4879 struct pad_data
*pad_data
= pcisd
->pad_array
;
4880 char temp_buf
[1024] = {0,};
4883 sprintf(temp_buf
+strlen(temp_buf
), "%d %d",
4884 PAD_INDEX_VALUE
, pcisd
->pad_count
);
4885 while ((pad_data
!= NULL
) && ((pad_data
= pad_data
->next
) != NULL
) &&
4886 (pad_data
->id
< MAX_PAD_ID
) && (j
++ < pcisd
->pad_count
))
4887 sprintf(temp_buf
+strlen(temp_buf
), " 0x%02x:%d", pad_data
->id
, pad_data
->count
);
4888 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4891 case CISD_WC_DATA_JSON
:
4893 struct cisd
*pcisd
= &battery
->cisd
;
4894 struct pad_data
*pad_data
= pcisd
->pad_array
;
4895 char temp_buf
[1024] = {0,};
4898 sprintf(temp_buf
+strlen(temp_buf
), "\"%s\":\"%d\"",
4899 PAD_INDEX_STRING
, PAD_INDEX_VALUE
);
4900 while ((pad_data
!= NULL
) && ((pad_data
= pad_data
->next
) != NULL
) &&
4901 (pad_data
->id
< MAX_PAD_ID
) && (j
++ < pcisd
->pad_count
))
4902 sprintf(temp_buf
+strlen(temp_buf
), ",\"%s%02x\":\"%d\"",
4903 PAD_JSON_STRING
, pad_data
->id
, pad_data
->count
);
4904 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4907 case PREV_BATTERY_DATA
:
4909 if (battery
->enable_update_data
)
4910 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d, %d, %d, %d\n",
4911 battery
->voltage_now
, battery
->temperature
,
4912 battery
->is_jig_on
, !battery
->charging_block
);
4915 case PREV_BATTERY_INFO
:
4917 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d,%d,%d,%d\n",
4918 battery
->prev_volt
, battery
->prev_temp
,
4919 battery
->prev_jig_on
, battery
->prev_chg_on
);
4920 pr_info("%s: Read Prev Battery Info : %d, %d, %d, %d\n", __func__
,
4921 battery
->prev_volt
, battery
->prev_temp
,
4922 battery
->prev_jig_on
, battery
->prev_chg_on
);
4926 #if defined(CONFIG_BATTERY_SBM_DATA)
4928 if (battery
->sbm_data
) {
4929 sec_bat_get_sbm_data_string(&value
);
4930 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", value
.strval
);
4931 battery
->sbm_data
= false;
4937 case SAFETY_TIMER_SET
:
4938 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4939 battery
->safety_timer_set
);
4941 case BATT_SWELLING_CONTROL
:
4942 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4943 battery
->skip_swelling
);
4945 case SAFETY_TIMER_INFO
:
4946 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%ld\n",
4947 battery
->cal_safety_time
);
4949 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
4950 case BATT_TEMP_TEST
:
4951 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d %d %d %d\n",
4952 battery
->temperature_test_battery
,
4953 battery
->temperature_test_usb
,
4954 battery
->temperature_test_wpc
,
4955 battery
->temperature_test_chg
);
4958 case BATT_CURRENT_EVENT
:
4959 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4960 battery
->current_event
);
4964 union power_supply_propval cc_val
;
4966 cc_val
.intval
= SEC_BATTERY_CAPACITY_QH
;
4967 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4968 POWER_SUPPLY_PROP_ENERGY_NOW
, cc_val
);
4970 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4984 void update_external_temp_table(struct sec_battery_info
*battery
, int temp
[])
4986 battery
->pdata
->temp_high_threshold_normal
= temp
[0];
4987 battery
->pdata
->temp_high_recovery_normal
= temp
[1];
4988 battery
->pdata
->temp_low_threshold_normal
= temp
[2];
4989 battery
->pdata
->temp_low_recovery_normal
= temp
[3];
4990 battery
->pdata
->temp_high_threshold_lpm
= temp
[4];
4991 battery
->pdata
->temp_high_recovery_lpm
= temp
[5];
4992 battery
->pdata
->temp_low_threshold_lpm
= temp
[6];
4993 battery
->pdata
->temp_low_recovery_lpm
= temp
[7];
4997 ssize_t
sec_bat_store_attrs(
4999 struct device_attribute
*attr
,
5000 const char *buf
, size_t count
)
5002 struct power_supply
*psy
= dev_get_drvdata(dev
);
5003 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
5004 const ptrdiff_t offset
= attr
- sec_battery_attrs
;
5009 union power_supply_propval value
= {0, };
5012 case BATT_RESET_SOC
:
5013 /* Do NOT reset fuel gauge in charging mode */
5014 if ((battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) ||
5015 battery
->is_jig_on
) {
5016 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_BATT_RESET_SOC
, 0);
5019 SEC_FUELGAUGE_CAPACITY_TYPE_RESET
;
5020 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
5021 POWER_SUPPLY_PROP_CAPACITY
, value
);
5022 dev_info(battery
->dev
,"do reset SOC\n");
5023 /* update battery info */
5024 sec_bat_get_battery_info(battery
);
5028 case BATT_READ_RAW_SOC
:
5030 case BATT_READ_ADJ_SOC
:
5033 strncpy(battery
->batt_type
, buf
, sizeof(battery
->batt_type
) - 1);
5034 battery
->batt_type
[sizeof(battery
->batt_type
)-1] = '\0';
5041 case BATT_VOL_ADC_CAL
:
5045 case BATT_VOL_ADC_AVER
:
5047 case BATT_CURRENT_UA_NOW
:
5049 case BATT_CURRENT_UA_AVG
:
5051 case BATT_FILTER_CFG
:
5052 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5054 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
5055 POWER_SUPPLY_PROP_FILTER_CFG
, value
);
5060 #if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
5061 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5062 dev_info(battery
->dev
,
5063 "%s: cooldown mode %s \n", __func__
, (x
? "enable" : "disable"));
5065 battery
->cooldown_mode
= false;
5067 battery
->cooldown_mode
= true;
5074 case BATT_TEMP_AVER
:
5076 case BATT_TEMP_ADC_AVER
:
5086 case SLAVE_CHG_TEMP
:
5088 case SLAVE_CHG_TEMP_ADC
:
5092 case BATT_SLATE_MODE
:
5093 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5094 if (x
== battery
->slate_mode
) {
5095 dev_info(battery
->dev
,
5096 "%s : skip same slate mode : %d\n", __func__
, x
);
5098 } else if (x
== 1) {
5099 battery
->slate_mode
= true;
5100 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SLATE
, SEC_BAT_CURRENT_EVENT_SLATE
);
5101 dev_info(battery
->dev
,
5102 "%s: enable slate mode : %d\n", __func__
, x
);
5103 } else if (x
== 0) {
5104 battery
->slate_mode
= false;
5105 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SLATE
);
5106 dev_info(battery
->dev
,
5107 "%s: disable slate mode : %d\n", __func__
, x
);
5109 dev_info(battery
->dev
,
5110 "%s: SLATE MODE unknown command\n", __func__
);
5113 wake_lock(&battery
->cable_wake_lock
);
5114 queue_delayed_work(battery
->monitor_wqueue
,
5115 &battery
->cable_work
, 0);
5119 case BATT_LP_CHARGING
:
5121 case SIOP_ACTIVATED
:
5124 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5125 dev_info(battery
->dev
,
5126 "%s: siop level: %d\n", __func__
, x
);
5128 battery
->wc_heating_start_time
= 0;
5129 if (x
== battery
->siop_level
) {
5130 dev_info(battery
->dev
,
5131 "%s: skip same siop level: %d\n", __func__
, x
);
5133 } else if (x
>= 0 && x
<= 100) {
5134 battery
->siop_level
= x
;
5136 battery
->siop_level
= 100;
5139 wake_lock(&battery
->siop_level_wake_lock
);
5140 queue_delayed_work(battery
->monitor_wqueue
, &battery
->siop_level_work
, 0);
5146 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5150 case BATT_CHARGING_SOURCE
:
5162 case CHG_CURRENT_ADC
:
5169 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5171 mutex_lock(&battery
->wclock
);
5172 battery
->wc_enable
= false;
5173 battery
->wc_enable_cnt
= 0;
5174 mutex_unlock(&battery
->wclock
);
5175 } else if (x
== 1) {
5176 mutex_lock(&battery
->wclock
);
5177 battery
->wc_enable
= true;
5178 battery
->wc_enable_cnt
= 0;
5179 mutex_unlock(&battery
->wclock
);
5181 dev_info(battery
->dev
,
5182 "%s: WPC ENABLE unknown command\n",
5186 wake_lock(&battery
->cable_wake_lock
);
5187 queue_delayed_work(battery
->monitor_wqueue
,
5188 &battery
->cable_work
, 0);
5193 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5194 if (battery
->pdata
->wpc_en
) {
5196 mutex_lock(&battery
->wclock
);
5197 battery
->wc_enable
= false;
5198 battery
->wc_enable_cnt
= 0;
5200 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5201 POWER_SUPPLY_EXT_PROP_WC_CONTROL
, value
);
5202 gpio_direction_output(battery
->pdata
->wpc_en
, 1);
5203 pr_info("%s: WC CONTROL: Disable", __func__
);
5204 mutex_unlock(&battery
->wclock
);
5205 } else if (x
== 1) {
5206 mutex_lock(&battery
->wclock
);
5207 battery
->wc_enable
= true;
5208 battery
->wc_enable_cnt
= 0;
5210 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5211 POWER_SUPPLY_EXT_PROP_WC_CONTROL
, value
);
5212 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
5213 pr_info("%s: WC CONTROL: Enable", __func__
);
5214 mutex_unlock(&battery
->wclock
);
5216 dev_info(battery
->dev
,
5217 "%s: WC CONTROL unknown command\n",
5225 case WC_CONTROL_CNT
:
5226 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5227 battery
->wc_enable_cnt_value
= x
;
5232 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5233 pr_info("%s: MFC, LED_COVER(%d)\n", __func__
, x
);
5234 battery
->led_cover
= x
;
5235 value
.intval
= battery
->led_cover
;
5236 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5237 POWER_SUPPLY_PROP_FILTER_CFG
, value
);
5241 case HV_CHARGER_STATUS
:
5243 case HV_WC_CHARGER_STATUS
:
5245 case HV_CHARGER_SET
:
5246 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5247 dev_info(battery
->dev
,
5248 "%s: HV_CHARGER_SET(%d)\n", __func__
, x
);
5250 battery
->wire_status
= SEC_BATTERY_CABLE_9V_TA
;
5251 wake_lock(&battery
->cable_wake_lock
);
5252 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5254 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
5255 wake_lock(&battery
->cable_wake_lock
);
5256 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5262 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5263 battery
->factory_mode
= x
? true : false;
5268 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5269 #if !defined(CONFIG_SEC_FACTORY)
5271 battery
->store_mode
= true;
5272 wake_lock(&battery
->parse_mode_dt_wake_lock
);
5273 queue_delayed_work(battery
->monitor_wqueue
,
5274 &battery
->parse_mode_dt_work
, 0);
5281 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5282 /* update battery info */
5283 sec_bat_get_battery_info(battery
);
5288 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5289 battery
->test_mode
= x
;
5290 wake_lock(&battery
->monitor_wake_lock
);
5291 queue_delayed_work(battery
->monitor_wqueue
,
5292 &battery
->monitor_work
, 0);
5297 case BATT_EVENT_CALL
:
5298 case BATT_EVENT_2G_CALL
:
5299 case BATT_EVENT_TALK_GSM
:
5300 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5304 case BATT_EVENT_3G_CALL
:
5305 case BATT_EVENT_TALK_WCDMA
:
5306 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5310 case BATT_EVENT_MUSIC
:
5311 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5315 case BATT_EVENT_VIDEO
:
5316 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5320 case BATT_EVENT_BROWSER
:
5321 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5325 case BATT_EVENT_HOTSPOT
:
5326 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5330 case BATT_EVENT_CAMERA
:
5331 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5335 case BATT_EVENT_CAMCORDER
:
5336 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5340 case BATT_EVENT_DATA_CALL
:
5341 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5345 case BATT_EVENT_WIFI
:
5346 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5350 case BATT_EVENT_WIBRO
:
5351 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5355 case BATT_EVENT_LTE
:
5356 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5360 case BATT_EVENT_LCD
:
5361 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5363 get_monotonic_boottime(&ts
);
5365 battery
->lcd_status
= true;
5367 battery
->lcd_status
= false;
5372 case BATT_EVENT_GPS
:
5373 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5377 case BATT_TEMP_TABLE
:
5378 if (sscanf(buf
, "%10d %10d %10d %10d %10d %10d %10d %10d\n",
5379 &t
[0], &t
[1], &t
[2], &t
[3], &t
[4], &t
[5], &t
[6], &t
[7]) == 8) {
5380 pr_info("%s: (new) %d %d %d %d %d %d %d %d\n",
5381 __func__
, t
[0], t
[1], t
[2], t
[3], t
[4], t
[5], t
[6], t
[7]);
5382 pr_info("%s: (default) %d %d %d %d %d %d %d %d\n",
5384 battery
->pdata
->temp_high_threshold_normal
,
5385 battery
->pdata
->temp_high_recovery_normal
,
5386 battery
->pdata
->temp_low_threshold_normal
,
5387 battery
->pdata
->temp_low_recovery_normal
,
5388 battery
->pdata
->temp_high_threshold_lpm
,
5389 battery
->pdata
->temp_high_recovery_lpm
,
5390 battery
->pdata
->temp_low_threshold_lpm
,
5391 battery
->pdata
->temp_low_recovery_lpm
);
5392 update_external_temp_table(battery
, t
);
5396 case BATT_HIGH_CURRENT_USB
:
5397 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5398 battery
->is_hc_usb
= x
? true : false;
5399 value
.intval
= battery
->is_hc_usb
;
5401 psy_do_property(battery
->pdata
->charger_name
, set
,
5402 POWER_SUPPLY_PROP_USB_HC
, value
);
5404 pr_info("%s: is_hc_usb (%d)\n", __func__
, battery
->is_hc_usb
);
5408 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
5409 case TEST_CHARGE_CURRENT
:
5410 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5411 if (x
>= 0 && x
<= 2000) {
5412 dev_err(battery
->dev
,
5413 "%s: BATT_TEST_CHARGE_CURRENT(%d)\n", __func__
, x
);
5414 battery
->pdata
->charging_current
[
5415 SEC_BATTERY_CABLE_USB
].input_current_limit
= x
;
5416 battery
->pdata
->charging_current
[
5417 SEC_BATTERY_CABLE_USB
].fast_charging_current
= x
;
5419 battery
->eng_not_full_status
= true;
5420 battery
->pdata
->temp_check_type
=
5421 SEC_BATTERY_TEMP_CHECK_NONE
;
5423 if (battery
->cable_type
== SEC_BATTERY_CABLE_USB
) {
5425 psy_do_property(battery
->pdata
->charger_name
, set
,
5426 POWER_SUPPLY_PROP_CURRENT_NOW
,
5434 case SET_STABILITY_TEST
:
5435 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5436 dev_err(battery
->dev
,
5437 "%s: BATT_STABILITY_TEST(%d)\n", __func__
, x
);
5439 battery
->stability_test
= true;
5440 battery
->eng_not_full_status
= true;
5443 battery
->stability_test
= false;
5444 battery
->eng_not_full_status
= false;
5449 case BATT_CAPACITY_MAX
:
5450 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5451 dev_err(battery
->dev
,
5452 "%s: BATT_CAPACITY_MAX(%d), fg_reset(%d)\n", __func__
, x
, fg_reset
);
5453 if (!fg_reset
&& !battery
->store_mode
) {
5455 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
5456 POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN
, value
);
5460 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
5461 POWER_SUPPLY_PROP_CAPACITY
, value
);
5462 battery
->capacity
= value
.intval
;
5464 #if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
5465 battery
->fg_reset
= 1;
5471 case BATT_INBAT_VOLTAGE
:
5473 case BATT_INBAT_VOLTAGE_OCV
:
5475 case CHECK_SLAVE_CHG
:
5477 case BATT_INBAT_WIRELESS_CS100
:
5478 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5479 pr_info("%s send cs100 command \n",__func__
);
5480 value
.intval
= POWER_SUPPLY_STATUS_FULL
;
5481 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5482 POWER_SUPPLY_PROP_STATUS
, value
);
5486 case HMT_TA_CONNECTED
:
5487 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5488 #if !defined(CONFIG_CCIC_NOTIFIER)
5489 dev_info(battery
->dev
,
5490 "%s: HMT_TA_CONNECTED(%d)\n", __func__
, x
);
5492 value
.intval
= false;
5493 psy_do_property(battery
->pdata
->charger_name
, set
,
5494 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5496 dev_info(battery
->dev
,
5497 "%s: changed to OTG cable detached\n", __func__
);
5499 battery
->wire_status
= SEC_BATTERY_CABLE_HMT_CONNECTED
;
5500 wake_lock(&battery
->cable_wake_lock
);
5501 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5503 value
.intval
= true;
5504 psy_do_property(battery
->pdata
->charger_name
, set
,
5505 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5507 dev_info(battery
->dev
,
5508 "%s: changed to OTG cable attached\n", __func__
);
5510 battery
->wire_status
= SEC_BATTERY_CABLE_OTG
;
5511 wake_lock(&battery
->cable_wake_lock
);
5512 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5519 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5520 #if defined(CONFIG_CCIC_NOTIFIER)
5521 dev_info(battery
->dev
,
5522 "%s: HMT_TA_CHARGE(%d)\n", __func__
, x
);
5524 /* do not charge off without cable type, since wdt could be expired */
5525 if (x
&& (battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
)
5526 && (battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
)) {
5527 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
);
5528 /* No charging when FULL & NONE */
5529 if (!((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
5530 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
))) {
5531 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
5534 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
,
5535 SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
);
5536 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
5538 dev_info(battery
->dev
, "%s: Wrong HMT control\n", __func__
);
5542 dev_info(battery
->dev
,
5543 "%s: HMT_TA_CHARGE(%d)\n", __func__
, x
);
5544 psy_do_property(battery
->pdata
->charger_name
, get
,
5545 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
5547 dev_info(battery
->dev
,
5548 "%s: ignore HMT_TA_CHARGE(%d)\n", __func__
, x
);
5551 value
.intval
= false;
5552 psy_do_property(battery
->pdata
->charger_name
, set
,
5553 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5555 dev_info(battery
->dev
,
5556 "%s: changed to OTG cable detached\n", __func__
);
5557 battery
->wire_status
= SEC_BATTERY_CABLE_HMT_CHARGE
;
5558 wake_lock(&battery
->cable_wake_lock
);
5559 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5561 value
.intval
= false;
5562 psy_do_property(battery
->pdata
->charger_name
, set
,
5563 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5565 dev_info(battery
->dev
,
5566 "%s: changed to OTG cable detached\n", __func__
);
5567 battery
->wire_status
= SEC_BATTERY_CABLE_HMT_CONNECTED
;
5568 wake_lock(&battery
->cable_wake_lock
);
5569 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5576 #if defined(CONFIG_BATTERY_AGE_FORECAST)
5579 case FG_FULL_VOLTAGE
:
5584 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5585 dev_info(battery
->dev
, "%s: BATTERY_CYCLE(%d)\n", __func__
, x
);
5587 int prev_battery_cycle
= battery
->batt_cycle
;
5588 battery
->batt_cycle
= x
;
5589 #if defined(CONFIG_BATTERY_CISD)
5590 battery
->cisd
.data
[CISD_DATA_CYCLE
] = x
;
5592 if (prev_battery_cycle
< 0) {
5593 sec_bat_aging_check(battery
);
5601 case BATT_WPC_TEMP_ADC
:
5602 case BATT_COIL_TEMP
:
5603 case BATT_COIL_TEMP_ADC
:
5605 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
5606 case BATT_WIRELESS_FIRMWARE_UPDATE
:
5607 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5608 if (x
== SEC_WIRELESS_RX_SDCARD_MODE
) {
5609 pr_info("%s fw mode is SDCARD \n", __func__
);
5610 sec_bat_fw_update_work(battery
, SEC_WIRELESS_RX_SDCARD_MODE
);
5611 } else if (x
== SEC_WIRELESS_RX_BUILT_IN_MODE
) {
5612 pr_info("%s fw mode is BUILD IN \n", __func__
);
5613 sec_bat_fw_update_work(battery
, SEC_WIRELESS_RX_BUILT_IN_MODE
);
5614 } else if (x
== SEC_WIRELESS_TX_ON_MODE
) {
5615 pr_info("%s tx mode is on \n", __func__
);
5616 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_ON_MODE
);
5617 } else if (x
== SEC_WIRELESS_TX_OFF_MODE
) {
5618 pr_info("%s tx mode is off \n", __func__
);
5619 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_OFF_MODE
);
5621 dev_info(battery
->dev
, "%s: wireless firmware unknown command\n", __func__
);
5627 case OTP_FIRMWARE_RESULT
:
5628 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5631 pr_info("%s RX firmware update ready!\n", __func__
);
5632 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5633 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
5635 dev_info(battery
->dev
, "%s: firmware unknown command\n", __func__
);
5642 case OTP_FIRMWARE_VER_BIN
:
5643 case OTP_FIRMWARE_VER
:
5644 case TX_FIRMWARE_RESULT
:
5645 case TX_FIRMWARE_VER
:
5647 case BATT_TX_STATUS
:
5648 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5649 if (x
== SEC_TX_OFF
) {
5650 pr_info("%s TX mode is off \n", __func__
);
5651 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_OFF_MODE
);
5652 } else if (x
== SEC_TX_STANDBY
) {
5653 pr_info("%s TX mode is on \n", __func__
);
5654 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_ON_MODE
);
5656 dev_info(battery
->dev
, "%s: TX firmware unknown command\n", __func__
);
5666 case BATT_HV_WIRELESS_STATUS
:
5667 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5668 if (x
== 1 && is_hv_wireless_type(battery
->cable_type
)) {
5669 wake_lock(&battery
->cable_wake_lock
);
5670 #ifdef CONFIG_SEC_FACTORY
5671 pr_info("%s change cable type HV WIRELESS -> WIRELESS \n", __func__
);
5672 battery
->wc_status
= SEC_WIRELESS_PAD_WPC
;
5673 battery
->cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
5674 sec_bat_set_charging_current(battery
);
5676 pr_info("%s HV_WIRELESS_STATUS set to 1. Vout set to 5V. \n", __func__
);
5677 value
.intval
= WIRELESS_VOUT_5V
;
5678 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5679 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5680 wake_unlock(&battery
->cable_wake_lock
);
5681 } else if (x
== 3 && is_hv_wireless_type(battery
->cable_type
)) {
5682 pr_info("%s HV_WIRELESS_STATUS set to 3. Vout set to 10V. \n", __func__
);
5683 value
.intval
= WIRELESS_VOUT_10V
;
5684 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5685 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5687 dev_info(battery
->dev
, "%s: HV_WIRELESS_STATUS unknown command\n", __func__
);
5693 case BATT_HV_WIRELESS_PAD_CTRL
:
5694 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5696 pr_err("%s: x : %d\n", __func__
, x
);
5699 ret
= sec_set_param(CM_OFFSET
, '1');
5701 pr_err("%s:sec_set_param failed\n", __func__
);
5704 pr_info("%s: hv wirelee charging is disabled\n", __func__
);
5707 } else if (x
== 2) {
5708 ret
= sec_set_param(CM_OFFSET
, '0');
5710 pr_err("%s: sec_set_param failed\n", __func__
);
5713 pr_info("%s: hv wireless charging is enabled\n", __func__
);
5716 } else if (x
== 3) {
5717 pr_info("%s led off \n", __func__
);
5718 value
.intval
= WIRELESS_PAD_LED_OFF
;
5719 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5720 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5721 } else if (x
== 4) {
5722 pr_info("%s led on \n", __func__
);
5723 value
.intval
= WIRELESS_PAD_LED_ON
;
5724 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5725 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5727 dev_info(battery
->dev
, "%s: BATT_HV_WIRELESS_PAD_CTRL unknown command\n", __func__
);
5733 case BATT_TUNE_FLOAT_VOLTAGE
:
5734 sscanf(buf
, "%10d\n", &x
);
5735 pr_info("%s float voltage = %d mV",__func__
, x
);
5737 if(x
> 4000 && x
<= 4400 ){
5739 psy_do_property(battery
->pdata
->charger_name
, set
,
5740 POWER_SUPPLY_PROP_VOLTAGE_MAX
, value
);
5743 case BATT_TUNE_INPUT_CHARGE_CURRENT
:
5744 sscanf(buf
, "%10d\n", &x
);
5745 pr_info("%s input charge current = %d mA",__func__
, x
);
5747 if(x
>= 0 && x
<= 4000 ){
5748 for(i
=0; i
< SEC_BATTERY_CABLE_MAX
; i
++)
5749 battery
->pdata
->charging_current
[i
].input_current_limit
= x
;
5752 psy_do_property(battery
->pdata
->charger_name
, set
,
5753 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
5756 case BATT_TUNE_FAST_CHARGE_CURRENT
:
5757 sscanf(buf
, "%10d\n", &x
);
5758 pr_info("%s fast charge current = %d mA",__func__
, x
);
5759 if(x
>= 0 && x
<= 4000 ){
5760 for(i
=0; i
< SEC_BATTERY_CABLE_MAX
; i
++)
5761 battery
->pdata
->charging_current
[i
].fast_charging_current
= x
;
5764 psy_do_property(battery
->pdata
->charger_name
, set
,
5765 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
5768 case BATT_TUNE_UI_TERM_CURRENT_1ST
:
5769 sscanf(buf
, "%10d\n", &x
);
5770 pr_info("%s ui term current = %d mA",__func__
, x
);
5772 if(x
> 0 && x
< 1000 ){
5773 battery
->pdata
->full_check_current_1st
= x
;
5776 case BATT_TUNE_UI_TERM_CURRENT_2ND
:
5777 sscanf(buf
, "%10d\n", &x
);
5778 pr_info("%s ui term current = %d mA",__func__
, x
);
5780 if(x
> 0 && x
< 1000 ){
5781 battery
->pdata
->full_check_current_2nd
= x
;
5784 case BATT_TUNE_TEMP_HIGH_NORMAL
:
5785 sscanf(buf
, "%10d\n", &x
);
5786 pr_info("%s temp high normal block = %d ",__func__
, x
);
5787 if(x
< 1000 && x
>= -200)
5788 battery
->pdata
->temp_high_threshold_normal
= x
;
5790 case BATT_TUNE_TEMP_HIGH_REC_NORMAL
:
5791 sscanf(buf
, "%10d\n", &x
);
5792 pr_info("%s temp high normal recover = %d ",__func__
, x
);
5793 if(x
< 1000 && x
>= -200)
5794 battery
->pdata
->temp_high_recovery_normal
= x
;
5796 case BATT_TUNE_TEMP_LOW_NORMAL
:
5797 sscanf(buf
, "%10d\n", &x
);
5798 pr_info("%s temp low normal block = %d ",__func__
, x
);
5799 if(x
< 1000 && x
>= -200)
5800 battery
->pdata
->temp_low_threshold_normal
= x
;
5802 case BATT_TUNE_TEMP_LOW_REC_NORMAL
:
5803 sscanf(buf
, "%10d\n", &x
);
5804 pr_info("%s temp low normal recover = %d ",__func__
, x
);
5805 if(x
< 1000 && x
>= -200)
5806 battery
->pdata
->temp_low_recovery_normal
= x
;
5808 case BATT_TUNE_CHG_TEMP_HIGH
:
5809 sscanf(buf
, "%10d\n", &x
);
5810 pr_info("%s chg_high_temp = %d ",__func__
, x
);
5811 if(x
< 1000 && x
>= -200)
5812 battery
->pdata
->chg_high_temp
= x
;
5814 case BATT_TUNE_CHG_TEMP_REC
:
5815 sscanf(buf
, "%10d\n", &x
);
5816 pr_info("%s chg_high_temp_recovery = %d ",__func__
, x
);
5817 if(x
< 1000 && x
>= -200)
5818 battery
->pdata
->chg_high_temp_recovery
= x
;
5820 case BATT_TUNE_CHG_LIMMIT_CUR
:
5821 sscanf(buf
, "%10d\n", &x
);
5822 pr_info("%s chg_charging_limit_current = %d ",__func__
, x
);
5823 if(x
< 3000 && x
> 0)
5825 battery
->pdata
->chg_charging_limit_current
= x
;
5826 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_ERR
].input_current_limit
= x
;
5827 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_UNKNOWN
].input_current_limit
= x
;
5828 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_TA
].input_current_limit
= x
;
5831 case BATT_TUNE_COIL_TEMP_HIGH
:
5833 case BATT_TUNE_COIL_TEMP_REC
:
5835 case BATT_TUNE_COIL_LIMMIT_CUR
:
5836 sscanf(buf
, "%10d\n", &x
);
5837 pr_info("%s wpc_charging_limit_current = %d ",__func__
, x
);
5838 if(x
< 3000 && x
> 0)
5840 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_ERR
].input_current_limit
= x
;
5841 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_UNKNOWN
].input_current_limit
= x
;
5842 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_TA
].input_current_limit
= x
;
5845 #if defined(CONFIG_UPDATE_BATTERY_DATA)
5846 case BATT_UPDATE_DATA
:
5847 if (!battery
->data_path
&& (count
* sizeof(char)) < 256) {
5848 battery
->data_path
= kzalloc((count
* sizeof(char) + 1), GFP_KERNEL
);
5849 if (battery
->data_path
) {
5850 sscanf(buf
, "%s\n", battery
->data_path
);
5851 cancel_delayed_work(&battery
->batt_data_work
);
5852 wake_lock(&battery
->batt_data_wake_lock
);
5853 queue_delayed_work(battery
->monitor_wqueue
,
5854 &battery
->batt_data_work
, msecs_to_jiffies(100));
5856 pr_info("%s: failed to alloc data_path buffer\n", __func__
);
5862 case BATT_MISC_EVENT
:
5864 case BATT_EXT_DEV_CHG
:
5865 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5866 pr_info("%s: Connect Ext Device : %d ",__func__
, x
);
5870 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
5873 case EXT_DEV_GAMEPAD_CHG
:
5874 battery
->wire_status
= SEC_BATTERY_CABLE_TA
;
5877 case EXT_DEV_GAMEPAD_OTG
:
5878 battery
->wire_status
= SEC_BATTERY_CABLE_OTG
;
5885 psy_do_property(battery
->pdata
->charger_name
, set
,
5886 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5889 queue_delayed_work(battery
->monitor_wqueue
,
5890 &battery
->cable_work
, 0);
5894 case BATT_WDT_CONTROL
:
5895 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5896 pr_info("%s: Charger WDT Set : %d\n", __func__
, x
);
5897 battery
->wdt_kick_disable
= x
;
5902 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5904 psy_do_property(battery
->pdata
->charger_name
, set
,
5905 POWER_SUPPLY_EXT_PROP_MULTI_CHARGER_MODE
, value
);
5909 case CHECK_PS_READY
:
5912 case CISD_FULLCAPREP_MAX
:
5914 #if defined(CONFIG_BATTERY_CISD)
5917 struct cisd
*pcisd
= &battery
->cisd
;
5918 int temp_data
[CISD_DATA_MAX_PER_DAY
] = {0,};
5920 sscanf(buf
, "%10d\n", &temp_data
[0]);
5922 if (temp_data
[CISD_DATA_RESET_ALG
] > 0) {
5923 if (sscanf(buf
, "%10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d, %10d\n",
5924 &temp_data
[0], &temp_data
[1], &temp_data
[2],
5925 &temp_data
[3], &temp_data
[4], &temp_data
[5],
5926 &temp_data
[6], &temp_data
[7], &temp_data
[8],
5927 &temp_data
[9], &temp_data
[10], &temp_data
[11],
5928 &temp_data
[12], &temp_data
[13], &temp_data
[14],
5929 &temp_data
[15], &temp_data
[16], &temp_data
[17],
5930 &temp_data
[18], &temp_data
[19], &temp_data
[20],
5931 &temp_data
[21], &temp_data
[22], &temp_data
[23],
5932 &temp_data
[24], &temp_data
[25], &temp_data
[26],
5933 &temp_data
[27], &temp_data
[28], &temp_data
[29],
5934 &temp_data
[30], &temp_data
[31], &temp_data
[32],
5935 &temp_data
[33], &temp_data
[34], &temp_data
[35],
5936 &temp_data
[36], &temp_data
[37], &temp_data
[38],
5937 &temp_data
[39], &temp_data
[40], &temp_data
[41],
5938 &temp_data
[42], &temp_data
[43], &temp_data
[44],
5939 &temp_data
[45], &temp_data
[46], &temp_data
[47],
5940 &temp_data
[48], &temp_data
[49], &temp_data
[50],
5941 &temp_data
[51], &temp_data
[52], &temp_data
[53],
5942 &temp_data
[54], &temp_data
[55], &temp_data
[56],
5943 &temp_data
[57], &temp_data
[58], &temp_data
[59],
5944 &temp_data
[60], &temp_data
[61], &temp_data
[62],
5945 &temp_data
[63], &temp_data
[64], &temp_data
[65],
5946 &temp_data
[66], &temp_data
[67], &temp_data
[68],
5947 &temp_data
[69], &temp_data
[70], &temp_data
[71],
5948 &temp_data
[72], &temp_data
[73], &temp_data
[74],
5949 &temp_data
[75], &temp_data
[76]) <= CISD_DATA_MAX_PER_DAY
) {
5950 for (i
= 0; i
< CISD_DATA_MAX_PER_DAY
; i
++)
5952 pcisd
->data
[CISD_DATA_ALG_INDEX
] = battery
->pdata
->cisd_alg_index
;
5953 pcisd
->data
[CISD_DATA_FULL_COUNT
] = temp_data
[0];
5954 pcisd
->data
[CISD_DATA_CAP_MAX
] = temp_data
[1];
5955 pcisd
->data
[CISD_DATA_CAP_MIN
] = temp_data
[2];
5956 pcisd
->data
[CISD_DATA_VALERT_COUNT
] = temp_data
[16];
5957 pcisd
->data
[CISD_DATA_CYCLE
] = temp_data
[17];
5958 pcisd
->data
[CISD_DATA_WIRE_COUNT
] = temp_data
[18];
5959 pcisd
->data
[CISD_DATA_WIRELESS_COUNT
] = temp_data
[19];
5960 pcisd
->data
[CISD_DATA_HIGH_TEMP_SWELLING
] = temp_data
[20];
5961 pcisd
->data
[CISD_DATA_LOW_TEMP_SWELLING
] = temp_data
[21];
5962 pcisd
->data
[CISD_DATA_SWELLING_CHARGING_COUNT
] = temp_data
[22];
5963 pcisd
->data
[CISD_DATA_AICL_COUNT
] = temp_data
[26];
5964 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX
] = temp_data
[27];
5965 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN
] = temp_data
[28];
5966 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX
] = temp_data
[29];
5967 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN
] = temp_data
[30];
5968 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX
] = temp_data
[31];
5969 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN
] = temp_data
[32];
5970 pcisd
->data
[CISD_DATA_UNSAFETY_VOLTAGE
] = temp_data
[33];
5971 pcisd
->data
[CISD_DATA_UNSAFETY_TEMPERATURE
] = temp_data
[34];
5972 pcisd
->data
[CISD_DATA_SAFETY_TIMER
] = temp_data
[35];
5973 pcisd
->data
[CISD_DATA_VSYS_OVP
] = temp_data
[36];
5974 pcisd
->data
[CISD_DATA_VBAT_OVP
] = temp_data
[37];
5975 pcisd
->data
[CISD_DATA_AFC_FAIL
] = temp_data
[39];
5976 pcisd
->data
[CISD_DATA_WATER_DETECT
] = temp_data
[38];
5979 const char *p
= buf
;
5981 pr_info("%s: %s\n", __func__
, buf
);
5982 for (i
= CISD_DATA_RESET_ALG
; i
< CISD_DATA_MAX_PER_DAY
; i
++) {
5983 if (sscanf(p
, "%10d%n", &pcisd
->data
[i
], &x
) > 0)
5986 pr_info("%s: NO DATA (cisd_data)\n", __func__
);
5987 temp_data
[CISD_DATA_RESET_ALG
] = -1;
5992 pr_info("%s: %s cisd data\n", __func__
,
5993 ((temp_data
[CISD_DATA_RESET_ALG
] < 0 || battery
->fg_reset
) ? "init" : "update"));
5995 if (temp_data
[CISD_DATA_RESET_ALG
] < 0 || battery
->fg_reset
) {
5996 /* initialize data */
5997 for (i
= CISD_DATA_RESET_ALG
; i
< CISD_DATA_MAX_PER_DAY
; i
++)
6000 battery
->fg_reset
= 0;
6002 pcisd
->data
[CISD_DATA_ALG_INDEX
] = battery
->pdata
->cisd_alg_index
;
6004 pcisd
->data
[CISD_DATA_FULL_COUNT
] = 1;
6005 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX
] = -300;
6006 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX
] = -300;
6007 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX
] = -300;
6008 pcisd
->data
[CISD_DATA_USB_TEMP_MAX
] = -300;
6009 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN
] = 1000;
6010 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN
] = 1000;
6011 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN
] = 1000;
6012 pcisd
->data
[CISD_DATA_USB_TEMP_MIN
] = 1000;
6013 pcisd
->data
[CISD_DATA_CAP_MIN
] = 0xFFFF;
6015 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
] = 1;
6016 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX_PER_DAY
] = -300;
6017 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX_PER_DAY
] = -300;
6018 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX_PER_DAY
] = -300;
6019 pcisd
->data
[CISD_DATA_USB_TEMP_MAX_PER_DAY
] = -300;
6020 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN_PER_DAY
] = 1000;
6021 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN_PER_DAY
] = 1000;
6022 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN_PER_DAY
] = 1000;
6023 pcisd
->data
[CISD_DATA_USB_TEMP_MIN_PER_DAY
] = 1000;
6025 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX
] = -300;
6026 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX
] = -300;
6027 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX
] = -300;
6028 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX
] = -300;
6029 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN
] = 1000;
6030 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN
] = 1000;
6031 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN
] = 1000;
6032 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN
] = 1000;
6034 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY
] = -300;
6035 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY
] = -300;
6036 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX_PER_DAY
] = -300;
6037 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY
] = -300;
6038 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY
] = 1000;
6039 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY
] = 1000;
6040 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN_PER_DAY
] = 1000;
6041 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY
] = 1000;
6043 pcisd
->data
[CISD_DATA_CAP_MIN_PER_DAY
] = 0xFFFF;
6046 /* initialize pad data */
6047 init_cisd_pad_data(&battery
->cisd
);
6051 wake_lock(&battery
->monitor_wake_lock
);
6052 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
6055 case CISD_DATA_JSON
:
6058 struct cisd
*pcisd
= &battery
->cisd
;
6060 if (sscanf(buf
, "%1c\n", &tc
) == 1) {
6062 for (i
= 0; i
< CISD_DATA_MAX
; i
++)
6065 pcisd
->data
[CISD_DATA_FULL_COUNT
] = 1;
6066 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX
] = -300;
6067 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX
] = -300;
6068 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX
] = -300;
6069 pcisd
->data
[CISD_DATA_USB_TEMP_MAX
] = -300;
6070 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN
] = 1000;
6071 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN
] = 1000;
6072 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN
] = 1000;
6073 pcisd
->data
[CISD_DATA_USB_TEMP_MIN
] = 1000;
6074 pcisd
->data
[CISD_DATA_CAP_MIN
] = 0xFFFF;
6076 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
] = 1;
6077 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX_PER_DAY
] = -300;
6078 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX_PER_DAY
] = -300;
6079 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX_PER_DAY
] = -300;
6080 pcisd
->data
[CISD_DATA_USB_TEMP_MAX_PER_DAY
] = -300;
6081 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN_PER_DAY
] = 1000;
6082 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN_PER_DAY
] = 1000;
6083 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN_PER_DAY
] = 1000;
6084 pcisd
->data
[CISD_DATA_USB_TEMP_MIN_PER_DAY
] = 1000;
6086 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX
] = -300;
6087 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX
] = -300;
6088 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX
] = -300;
6089 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX
] = -300;
6090 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN
] = 1000;
6091 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN
] = 1000;
6092 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN
] = 1000;
6093 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN
] = 1000;
6095 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY
] = -300;
6096 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY
] = -300;
6097 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX_PER_DAY
] = -300;
6098 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY
] = -300;
6099 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY
] = 1000;
6100 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY
] = 1000;
6101 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN_PER_DAY
] = 1000;
6102 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY
] = 1000;
6104 pcisd
->data
[CISD_DATA_CAP_MIN_PER_DAY
] = 0xFFFF;
6111 case CISD_DATA_D_JSON
:
6113 case CISD_WIRE_COUNT
:
6114 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6115 struct cisd
*pcisd
= &battery
->cisd
;
6116 pr_info("%s: Wire Count : %d\n", __func__
, x
);
6117 pcisd
->data
[CISD_DATA_WIRE_COUNT
] = x
;
6118 pcisd
->data
[CISD_DATA_WIRE_COUNT_PER_DAY
]++;
6123 set_cisd_pad_data(battery
, buf
);
6126 case CISD_WC_DATA_JSON
:
6128 case PREV_BATTERY_DATA
:
6129 if (sscanf(buf
, "%10d, %10d, %10d, %10d\n",
6130 &battery
->prev_volt
, &battery
->prev_temp
,
6131 &battery
->prev_jig_on
, &battery
->prev_chg_on
) >= 4) {
6132 pr_info("%s: prev voltage : %d, prev_temp : %d, prev_jig_on : %d, prev_chg_on : %d\n",
6133 __func__
, battery
->prev_volt
, battery
->prev_temp
,
6134 battery
->prev_jig_on
, battery
->prev_chg_on
);
6136 if (battery
->prev_volt
>= 3700 && battery
->prev_temp
>= 150 &&
6137 !battery
->prev_jig_on
&& battery
->fg_reset
)
6138 pr_info("%s: Battery have been Removed\n", __func__
);
6142 battery
->enable_update_data
= 1;
6144 case PREV_BATTERY_INFO
:
6147 #if defined(CONFIG_BATTERY_SBM_DATA)
6151 case SAFETY_TIMER_SET
:
6152 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6154 battery
->safety_timer_set
= true;
6156 battery
->safety_timer_set
= false;
6161 case BATT_SWELLING_CONTROL
:
6162 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6164 pr_info("%s : 15TEST START!! SWELLING MODE DISABLE\n", __func__
);
6165 battery
->skip_swelling
= true;
6167 pr_info("%s : 15TEST END!! SWELLING MODE END\n", __func__
);
6168 battery
->skip_swelling
= false;
6173 case SAFETY_TIMER_INFO
:
6175 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
6176 case BATT_TEMP_TEST
:
6179 if (sscanf(buf
, "%c %10d\n", &tc
, &x
) == 2) {
6180 pr_info("%s : temperature t: %c, temp: %d\n", __func__
, tc
, x
);
6182 battery
->temperature_test_usb
= x
;
6183 } else if (tc
== 'w') {
6184 battery
->temperature_test_wpc
= x
;
6185 } else if (tc
== 'b') {
6186 battery
->temperature_test_battery
= x
;
6187 } else if (tc
== 'c') {
6188 battery
->temperature_test_chg
= x
;
6195 case BATT_CURRENT_EVENT
:
6200 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6201 dev_info(battery
->dev
,
6202 "%s: ext event 0x%x \n", __func__
, x
);
6203 battery
->ext_event
= x
;
6204 wake_lock(&battery
->ext_event_wake_lock
);
6205 queue_delayed_work(battery
->monitor_wqueue
, &battery
->ext_event_work
, 0);
6217 static int sec_bat_create_attrs(struct device
*dev
)
6219 unsigned long i
= 0;
6222 for (i
= 0; i
< ARRAY_SIZE(sec_battery_attrs
); i
++) {
6223 rc
= device_create_file(dev
, &sec_battery_attrs
[i
]);
6225 goto create_attrs_failed
;
6227 goto create_attrs_succeed
;
6229 create_attrs_failed
:
6231 device_remove_file(dev
, &sec_battery_attrs
[i
]);
6232 create_attrs_succeed
:
6236 static int sec_bat_set_property(struct power_supply
*psy
,
6237 enum power_supply_property psp
,
6238 const union power_supply_propval
*val
)
6240 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6241 int current_cable_type
= SEC_BATTERY_CABLE_NONE
;
6242 int full_check_type
= SEC_BATTERY_FULLCHARGED_NONE
;
6243 union power_supply_propval value
= {0, };
6244 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6246 dev_dbg(battery
->dev
,
6247 "%s: (%d,%d)\n", __func__
, psp
, val
->intval
);
6250 case POWER_SUPPLY_PROP_STATUS
:
6251 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
)
6252 full_check_type
= battery
->pdata
->full_check_type
;
6254 full_check_type
= battery
->pdata
->full_check_type_2nd
;
6255 if ((full_check_type
== SEC_BATTERY_FULLCHARGED_CHGINT
) &&
6256 (val
->intval
== POWER_SUPPLY_STATUS_FULL
))
6257 sec_bat_do_fullcharged(battery
);
6258 sec_bat_set_charging_status(battery
, val
->intval
);
6260 case POWER_SUPPLY_PROP_HEALTH
:
6261 sec_bat_ovp_uvlo_result(battery
, val
->intval
);
6263 case POWER_SUPPLY_PROP_ONLINE
:
6264 current_cable_type
= val
->intval
;
6265 #if !defined(CONFIG_CCIC_NOTIFIER)
6266 if ((battery
->muic_cable_type
!= ATTACHED_DEV_SMARTDOCK_TA_MUIC
)
6267 && ((current_cable_type
== SEC_BATTERY_CABLE_SMART_OTG
) ||
6268 (current_cable_type
== SEC_BATTERY_CABLE_SMART_NOTG
)))
6272 if (current_cable_type
< 0) {
6273 dev_info(battery
->dev
,
6274 "%s: ignore event(%d)\n",
6275 __func__
, current_cable_type
);
6276 } else if (current_cable_type
== SEC_BATTERY_CABLE_OTG
) {
6277 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
6278 battery
->is_recharging
= false;
6279 sec_bat_set_charging_status(battery
,
6280 POWER_SUPPLY_STATUS_DISCHARGING
);
6281 battery
->cable_type
= current_cable_type
;
6282 wake_lock(&battery
->monitor_wake_lock
);
6283 queue_delayed_work(battery
->monitor_wqueue
,
6284 &battery
->monitor_work
, 0);
6287 battery
->wire_status
= current_cable_type
;
6288 if ((battery
->wire_status
== SEC_BATTERY_CABLE_NONE
) &&
6289 (battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
) )
6290 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
6292 dev_info(battery
->dev
,
6293 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
6294 __func__
, current_cable_type
, battery
->wc_status
,
6295 battery
->wire_status
);
6297 /* cable is attached or detached
6298 * if current_cable_type is minus value,
6299 * check cable by sec_bat_get_cable_type()
6300 * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
6301 * (0 is SEC_BATTERY_CABLE_UNKNOWN)
6303 if ((current_cable_type
>= 0) &&
6304 (current_cable_type
< SEC_BATTERY_CABLE_MAX
) &&
6305 (battery
->pdata
->cable_source_type
&
6306 SEC_BATTERY_CABLE_SOURCE_EXTERNAL
)) {
6308 wake_lock(&battery
->cable_wake_lock
);
6309 queue_delayed_work(battery
->monitor_wqueue
,
6310 &battery
->cable_work
,0);
6312 if (sec_bat_get_cable_type(battery
,
6313 battery
->pdata
->cable_source_type
)) {
6314 wake_lock(&battery
->cable_wake_lock
);
6315 queue_delayed_work(battery
->monitor_wqueue
,
6316 &battery
->cable_work
,0);
6320 case POWER_SUPPLY_PROP_CAPACITY
:
6321 battery
->capacity
= val
->intval
;
6322 power_supply_changed(battery
->psy_bat
);
6324 case POWER_SUPPLY_PROP_VOLTAGE_NOW
:
6325 /* If JIG is attached, the voltage is set as 1079 */
6326 pr_info("%s : set to the battery history : (%d)\n",__func__
, val
->intval
);
6327 if(val
->intval
== 1079) {
6328 battery
->voltage_now
= 1079;
6329 battery
->voltage_avg
= 1079;
6330 power_supply_changed(battery
->psy_bat
);
6333 case POWER_SUPPLY_PROP_CHARGE_TYPE
:
6334 wake_lock(&battery
->monitor_wake_lock
);
6335 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
6337 case POWER_SUPPLY_PROP_PRESENT
:
6338 battery
->present
= val
->intval
;
6340 wake_lock(&battery
->monitor_wake_lock
);
6341 queue_delayed_work(battery
->monitor_wqueue
,
6342 &battery
->monitor_work
, 0);
6344 #if defined(CONFIG_BATTERY_SWELLING)
6345 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT
:
6348 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
:
6349 case POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW
:
6351 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
6352 value
.intval
= val
->intval
;
6353 pr_info("%s: CHGIN-OTG %s\n", __func__
, value
.intval
> 0 ? "on" : "off");
6354 psy_do_property(battery
->pdata
->charger_name
, set
,
6355 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6357 case POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
:
6358 value
.intval
= val
->intval
;
6359 pr_info("%s: WCIN-UNO %s\n", __func__
, value
.intval
> 0 ? "on" : "off");
6360 psy_do_property(battery
->pdata
->charger_name
, set
,
6361 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
6363 #if defined(CONFIG_UPDATE_BATTERY_DATA)
6364 case POWER_SUPPLY_PROP_POWER_DESIGN
:
6365 sec_bat_parse_dt(battery
->dev
, battery
);
6368 #if defined(CONFIG_BATTERY_CISD)
6369 case POWER_SUPPLY_PROP_VOLTAGE_MIN
:
6370 pr_info("%s: Valert was occured! run monitor work for updating cisd data!\n", __func__
);
6371 battery
->cisd
.data
[CISD_DATA_VALERT_COUNT
]++;
6372 battery
->cisd
.data
[CISD_DATA_VALERT_COUNT_PER_DAY
]++;
6373 wake_lock(&battery
->monitor_wake_lock
);
6374 queue_delayed_work_on(0, battery
->monitor_wqueue
,
6375 &battery
->monitor_work
, 0);
6378 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6380 case POWER_SUPPLY_EXT_PROP_AICL_CURRENT
:
6381 battery
->aicl_current
= val
->intval
;
6382 battery
->max_charge_power
= battery
->charge_power
= battery
->input_voltage
* val
->intval
;
6383 pr_info("%s: aicl : %dmA, %dmW)\n", __func__
,
6384 battery
->aicl_current
, battery
->charge_power
);
6386 if (is_wired_type(battery
->cable_type
))
6387 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_AICL
,
6388 SEC_BAT_CURRENT_EVENT_AICL
);
6390 #if defined(CONFIG_BATTERY_CISD)
6391 battery
->cisd
.data
[CISD_DATA_AICL_COUNT
]++;
6392 battery
->cisd
.data
[CISD_DATA_AICL_COUNT_PER_DAY
]++;
6395 case POWER_SUPPLY_EXT_PROP_SYSOVLO
:
6396 if (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
) {
6397 pr_info("%s: Vsys is ovlo !!\n", __func__
);
6398 battery
->is_sysovlo
= true;
6399 battery
->is_recharging
= false;
6400 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
6401 battery
->health
= POWER_SUPPLY_HEALTH_VSYS_OVP
;
6402 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_VSYS_OVP
, SEC_BAT_CURRENT_EVENT_VSYS_OVP
);
6403 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
6404 #if defined(CONFIG_BATTERY_CISD)
6405 battery
->cisd
.data
[CISD_DATA_VSYS_OVP
]++;
6406 battery
->cisd
.data
[CISD_DATA_VSYS_OVP_PER_DAY
]++;
6408 #if defined(CONFIG_SEC_ABC)
6409 sec_abc_send_event("MODULE=battery@ERROR=vsys_ovp");
6411 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
6412 wake_lock(&battery
->monitor_wake_lock
);
6413 queue_delayed_work(battery
->monitor_wqueue
,
6414 &battery
->monitor_work
, 0);
6417 case POWER_SUPPLY_EXT_PROP_VBAT_OVP
:
6418 if (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
) {
6419 pr_info("%s: Vbat is ovlo !!\n", __func__
);
6420 battery
->is_vbatovlo
= true;
6421 battery
->is_recharging
= false;
6422 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
6423 battery
->health
= POWER_SUPPLY_HEALTH_VBAT_OVP
;
6424 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_VBAT_OVP
, SEC_BAT_CURRENT_EVENT_VBAT_OVP
);
6425 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
6427 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
6428 wake_lock(&battery
->monitor_wake_lock
);
6429 queue_delayed_work(battery
->monitor_wqueue
,
6430 &battery
->monitor_work
, 0);
6433 case POWER_SUPPLY_EXT_PROP_USB_CONFIGURE
:
6434 if (battery
->pdic_info
.sink_status
.rp_currentlvl
> RP_CURRENT_LEVEL_DEFAULT
)
6436 pr_info("%s: usb configured %d\n", __func__
, val
->intval
);
6437 if (val
->intval
== USB_CURRENT_UNCONFIGURED
) {
6438 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_100MA
,
6439 (SEC_BAT_CURRENT_EVENT_USB_100MA
| SEC_BAT_CURRENT_EVENT_USB_SUPER
));
6440 } else if (val
->intval
== USB_CURRENT_HIGH_SPEED
) {
6441 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
, 1);
6442 sec_bat_set_current_event(battery
, 0,
6443 (SEC_BAT_CURRENT_EVENT_USB_100MA
| SEC_BAT_CURRENT_EVENT_USB_SUPER
));
6444 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
6445 USB_CURRENT_HIGH_SPEED
, USB_CURRENT_HIGH_SPEED
);
6446 } else if (val
->intval
== USB_CURRENT_SUPER_SPEED
) {
6447 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
, 1);
6448 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_SUPER
,
6449 (SEC_BAT_CURRENT_EVENT_USB_100MA
| SEC_BAT_CURRENT_EVENT_USB_SUPER
));
6450 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
6451 USB_CURRENT_SUPER_SPEED
, USB_CURRENT_SUPER_SPEED
);
6453 sec_bat_set_charging_current(battery
);
6455 case POWER_SUPPLY_EXT_PROP_HV_DISABLE
:
6456 pr_info("HV wired charging mode is %s\n", (val
->intval
== CH_MODE_AFC_DISABLE_VAL
? "Disabled" : "Enabled"));
6457 sec_bat_set_current_event(battery
, (val
->intval
== CH_MODE_AFC_DISABLE_VAL
?
6458 SEC_BAT_CURRENT_EVENT_HV_DISABLE
: 0), SEC_BAT_CURRENT_EVENT_HV_DISABLE
);
6460 case POWER_SUPPLY_EXT_PROP_WC_CONTROL
:
6461 pr_info("%s: Recover MFC IC (wc_enable: %d)\n",
6462 __func__
, battery
->wc_enable
);
6464 if (battery
->pdata
->wpc_en
) {
6465 mutex_lock(&battery
->wclock
);
6466 if (battery
->wc_enable
) {
6467 gpio_direction_output(battery
->pdata
->wpc_en
, 1);
6469 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
6471 mutex_unlock(&battery
->wclock
);
6473 #if defined(CONFIG_BATTERY_CISD)
6474 increase_cisd_count(CISD_DATA_DROP_VALUE
);
6488 static int sec_bat_get_property(struct power_supply
*psy
,
6489 enum power_supply_property psp
,
6490 union power_supply_propval
*val
)
6492 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6493 union power_supply_propval value
= {0, };
6494 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6497 case POWER_SUPPLY_PROP_STATUS
:
6498 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
) ||
6499 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) {
6500 val
->intval
= POWER_SUPPLY_STATUS_DISCHARGING
;
6502 if ((battery
->pdata
->cable_check_type
&
6503 SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE
) &&
6505 switch (battery
->cable_type
) {
6506 case SEC_BATTERY_CABLE_USB
:
6507 case SEC_BATTERY_CABLE_USB_CDP
:
6509 POWER_SUPPLY_STATUS_DISCHARGING
;
6513 #if defined(CONFIG_STORE_MODE)
6514 if (battery
->store_mode
&& !lpcharge
&&
6515 battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
&&
6516 battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
&&
6517 battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
6518 val
->intval
= POWER_SUPPLY_STATUS_CHARGING
;
6521 val
->intval
= battery
->status
;
6524 case POWER_SUPPLY_PROP_CHARGE_TYPE
:
6525 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) {
6526 val
->intval
= POWER_SUPPLY_CHARGE_TYPE_NONE
;
6528 psy_do_property(battery
->pdata
->charger_name
, get
,
6529 POWER_SUPPLY_PROP_CHARGE_TYPE
, value
);
6530 if (value
.intval
== SEC_BATTERY_CABLE_UNKNOWN
)
6531 /* if error in CHARGE_TYPE of charger
6532 * set CHARGE_TYPE as NONE
6534 val
->intval
= POWER_SUPPLY_CHARGE_TYPE_NONE
;
6536 val
->intval
= value
.intval
;
6539 case POWER_SUPPLY_PROP_HEALTH
:
6540 if (battery
->health
>= POWER_SUPPLY_HEALTH_MAX
)
6541 val
->intval
= POWER_SUPPLY_HEALTH_UNKNOWN
;
6543 val
->intval
= battery
->health
;
6545 case POWER_SUPPLY_PROP_PRESENT
:
6546 val
->intval
= battery
->present
;
6548 case POWER_SUPPLY_PROP_ONLINE
:
6549 if (is_hv_wireless_type(battery
->cable_type
) ||
6550 (battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
)) {
6551 if (sec_bat_hv_wc_normal_mode_check(battery
))
6552 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6554 val
->intval
= SEC_BATTERY_CABLE_HV_WIRELESS_ETX
;
6556 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
)
6557 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6558 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
)
6559 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6560 else if(battery
->cable_type
== SEC_BATTERY_CABLE_PMA_WIRELESS
)
6561 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6562 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_VEHICLE
)
6563 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6564 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
)
6565 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6567 val
->intval
= battery
->cable_type
;
6568 pr_info("%s cable type = %d sleep_mode = %d\n", __func__
, val
->intval
, sleep_mode
);
6570 case POWER_SUPPLY_PROP_TECHNOLOGY
:
6571 val
->intval
= battery
->pdata
->technology
;
6573 case POWER_SUPPLY_PROP_VOLTAGE_NOW
:
6574 #ifdef CONFIG_SEC_FACTORY
6575 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
6576 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
6577 battery
->voltage_now
= value
.intval
;
6578 dev_err(battery
->dev
,
6579 "%s: voltage now(%d)\n", __func__
, battery
->voltage_now
);
6581 /* voltage value should be in uV */
6582 val
->intval
= battery
->voltage_now
* 1000;
6584 case POWER_SUPPLY_PROP_VOLTAGE_AVG
:
6585 #ifdef CONFIG_SEC_FACTORY
6586 value
.intval
= SEC_BATTERY_VOLTAGE_AVERAGE
;
6587 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
6588 POWER_SUPPLY_PROP_VOLTAGE_AVG
, value
);
6589 battery
->voltage_avg
= value
.intval
;
6590 dev_err(battery
->dev
,
6591 "%s: voltage avg(%d)\n", __func__
, battery
->voltage_avg
);
6593 /* voltage value should be in uV */
6594 val
->intval
= battery
->voltage_avg
* 1000;
6596 case POWER_SUPPLY_PROP_CURRENT_NOW
:
6597 val
->intval
= battery
->current_now
;
6599 case POWER_SUPPLY_PROP_CURRENT_AVG
:
6600 val
->intval
= battery
->current_avg
;
6602 case POWER_SUPPLY_PROP_CHARGE_FULL
:
6603 #if defined(CONFIG_BATTERY_CISD)
6604 val
->intval
= battery
->pdata
->battery_full_capacity
* 1000;
6609 /* charging mode (differ from power supply) */
6610 case POWER_SUPPLY_PROP_CHARGE_NOW
:
6611 val
->intval
= battery
->charging_mode
;
6613 case POWER_SUPPLY_PROP_CAPACITY
:
6614 if (battery
->pdata
->fake_capacity
) {
6616 pr_info("%s : capacity(%d)\n", __func__
, val
->intval
);
6618 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
6619 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
) {
6620 if(battery
->eng_not_full_status
)
6621 val
->intval
= battery
->capacity
;
6625 val
->intval
= battery
->capacity
;
6628 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
)
6631 val
->intval
= battery
->capacity
;
6635 case POWER_SUPPLY_PROP_TEMP
:
6636 val
->intval
= battery
->temperature
;
6638 case POWER_SUPPLY_PROP_TEMP_AMBIENT
:
6639 val
->intval
= battery
->temper_amb
;
6641 #if defined(CONFIG_CALC_TIME_TO_FULL)
6642 case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW
:
6643 if (battery
->capacity
== 100) {
6648 if (((battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) ||
6649 (battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->capacity
!= 100)) &&
6650 !battery
->swelling_mode
)
6651 val
->intval
= battery
->timetofull
;
6656 #if defined(CONFIG_BATTERY_SWELLING)
6657 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT
:
6658 if (battery
->swelling_mode
)
6664 case POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW
:
6665 val
->intval
= battery
->wire_status
;
6667 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
6668 case POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
:
6670 case POWER_SUPPLY_PROP_POWER_NOW
:
6671 val
->intval
= battery
->charge_power
;
6673 case POWER_SUPPLY_PROP_CHARGE_COUNTER
:
6674 val
->intval
= battery
->charge_counter
;
6676 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6678 case POWER_SUPPLY_EXT_PROP_SUB_PBA_TEMP_REC
:
6679 val
->intval
= !battery
->vbus_limit
;
6691 static int sec_usb_get_property(struct power_supply
*psy
,
6692 enum power_supply_property psp
,
6693 union power_supply_propval
*val
)
6695 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6698 case POWER_SUPPLY_PROP_ONLINE
:
6700 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
6702 val
->intval
= battery
->input_voltage
* 1000000;
6704 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6706 val
->intval
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
* 1000;
6712 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
) ||
6713 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) {
6717 /* Set enable=1 only if the USB charger is connected */
6718 switch (battery
->wire_status
) {
6719 case SEC_BATTERY_CABLE_USB
:
6720 case SEC_BATTERY_CABLE_USB_CDP
:
6723 case SEC_BATTERY_CABLE_PDIC
:
6724 val
->intval
= (battery
->pd_usb_attached
) ? 1:0;
6731 if (battery
->slate_mode
)
6736 static int sec_ac_get_property(struct power_supply
*psy
,
6737 enum power_supply_property psp
,
6738 union power_supply_propval
*val
)
6740 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6741 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6744 case POWER_SUPPLY_PROP_ONLINE
:
6745 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
) ||
6746 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) {
6751 /* Set enable=1 only if the AC charger is connected */
6752 switch (battery
->cable_type
) {
6753 case SEC_BATTERY_CABLE_TA
:
6754 case SEC_BATTERY_CABLE_UARTOFF
:
6755 case SEC_BATTERY_CABLE_LAN_HUB
:
6756 case SEC_BATTERY_CABLE_UNKNOWN
:
6757 case SEC_BATTERY_CABLE_PREPARE_TA
:
6758 case SEC_BATTERY_CABLE_9V_ERR
:
6759 case SEC_BATTERY_CABLE_9V_UNKNOWN
:
6760 case SEC_BATTERY_CABLE_9V_TA
:
6761 case SEC_BATTERY_CABLE_12V_TA
:
6762 case SEC_BATTERY_CABLE_HMT_CONNECTED
:
6763 case SEC_BATTERY_CABLE_HMT_CHARGE
:
6764 case SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT
:
6765 case SEC_BATTERY_CABLE_QC20
:
6766 case SEC_BATTERY_CABLE_QC30
:
6767 case SEC_BATTERY_CABLE_TIMEOUT
:
6768 case SEC_BATTERY_CABLE_SMART_OTG
:
6769 case SEC_BATTERY_CABLE_SMART_NOTG
:
6772 case SEC_BATTERY_CABLE_PDIC
:
6773 val
->intval
= (battery
->pd_usb_attached
) ? 0:1;
6780 case POWER_SUPPLY_PROP_TEMP
:
6781 val
->intval
= battery
->chg_temp
;
6783 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
6785 val
->intval
= battery
->input_voltage
* 1000000;
6787 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6789 val
->intval
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
* 1000;
6791 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6793 case POWER_SUPPLY_EXT_PROP_WATER_DETECT
:
6794 if (battery
->misc_event
& (BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
|
6795 BATT_MISC_EVENT_HICCUP_TYPE
)) {
6797 pr_info("%s: Water Detect\n", __func__
);
6810 if (lpcharge
&& (battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
)) {
6817 static int sec_wireless_get_property(struct power_supply
*psy
,
6818 enum power_supply_property psp
,
6819 union power_supply_propval
*val
)
6821 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6824 case POWER_SUPPLY_PROP_ONLINE
:
6825 val
->intval
= is_wireless_type(battery
->cable_type
) ?
6828 case POWER_SUPPLY_PROP_PRESENT
:
6829 val
->intval
= (battery
->pdata
->wireless_charger_name
) ?
6832 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
6834 val
->intval
= battery
->input_voltage
* 1000000;
6836 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6838 val
->intval
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
* 1000;
6847 static int sec_wireless_set_property(struct power_supply
*psy
,
6848 enum power_supply_property psp
,
6849 const union power_supply_propval
*val
)
6851 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6852 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6855 case POWER_SUPPLY_PROP_ONLINE
:
6856 #if defined(CONFIG_BATTERY_CISD)
6857 if (val
->intval
!= SEC_WIRELESS_PAD_NONE
&& battery
->wc_status
== SEC_WIRELESS_PAD_NONE
) {
6858 battery
->cisd
.data
[CISD_DATA_WIRELESS_COUNT
]++;
6859 battery
->cisd
.data
[CISD_DATA_WIRELESS_COUNT_PER_DAY
]++;
6862 /* Clear the FOD State */
6863 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_WIRELESS_FOD
, 1);
6865 if (val
->intval
== SEC_WIRELESS_PAD_A4WP
)
6866 battery
->wc_status
= SEC_WIRELESS_PAD_WPC
;
6868 battery
->wc_status
= val
->intval
;
6870 if ((battery
->ext_event
& BATT_EXT_EVENT_CALL
) &&
6871 (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK
||
6872 battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK_HV
||
6873 battery
->wc_status
== SEC_WIRELESS_PAD_TX
)) {
6874 battery
->wc_rx_phm_mode
= true;
6877 wake_lock(&battery
->cable_wake_lock
);
6878 queue_delayed_work(battery
->monitor_wqueue
,
6879 &battery
->cable_work
, 0);
6881 case POWER_SUPPLY_PROP_AUTHENTIC
:
6882 #if defined(CONFIG_BATTERY_CISD)
6883 pr_info("%s : tx_type(0x%x)\n", __func__
, val
->intval
);
6884 count_cisd_pad_data(&battery
->cisd
, val
->intval
);
6887 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
6889 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
,
6890 SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
);
6892 sec_bat_set_current_event(battery
, 0,
6893 SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
);
6896 if (is_hv_wireless_type(battery
->cable_type
)) {
6897 union power_supply_propval value
= {0, };
6900 mutex_lock(&battery
->iolock
);
6901 value
.intval
= (val
->intval
) ? WIRELESS_VOUT_5V
:
6902 battery
->wpc_vout_level
;
6903 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
6904 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
6905 battery
->aicl_current
= 0; /* reset aicl current */
6906 mutex_unlock(&battery
->iolock
);
6908 for (cnt
= 0; cnt
< 5; cnt
++) {
6910 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
6911 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
6912 if (value
.intval
<= 6000) {
6913 pr_info("%s: wireless vout goes to 5V Vout(%d).\n",
6914 __func__
, value
.intval
);
6920 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6921 battery
->aicl_current
= 0; /* reset aicl current */
6922 pr_info("%s: reset aicl\n", __func__
);
6924 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6926 case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_CHG_ERR
:
6927 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_WIRELESS_FOD
, !val
->intval
);
6929 case POWER_SUPPLY_EXT_PROP_CALL_EVENT
:
6930 if(val
->intval
== 1) {
6931 pr_info("%s : PHM enabled\n",__func__
);
6932 battery
->wc_rx_phm_mode
= true;
6946 static int sec_ps_set_property(struct power_supply
*psy
,
6947 enum power_supply_property psp
,
6948 const union power_supply_propval
*val
)
6950 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6951 union power_supply_propval value
;
6954 case POWER_SUPPLY_PROP_STATUS
:
6955 if (val
->intval
== 0 && battery
->ps_enable
== true) {
6956 battery
->ps_enable
= false;
6957 value
.intval
= val
->intval
;
6958 psy_do_property(battery
->pdata
->charger_name
, set
,
6959 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6960 } else if ((val
->intval
== 1) && (battery
->ps_enable
== false) &&
6961 (battery
->ps_status
== true)) {
6962 battery
->ps_enable
= true;
6963 value
.intval
= val
->intval
;
6964 psy_do_property(battery
->pdata
->charger_name
, set
,
6965 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6967 dev_err(battery
->dev
,
6968 "%s: invalid setting (%d)\n", __func__
, val
->intval
);
6971 case POWER_SUPPLY_PROP_ONLINE
:
6972 if (val
->intval
== SEC_BATTERY_CABLE_POWER_SHARING
) {
6973 battery
->ps_status
= true;
6974 battery
->ps_enable
= true;
6975 value
.intval
= battery
->ps_enable
;
6976 psy_do_property(battery
->pdata
->charger_name
, set
,
6977 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6979 battery
->ps_status
= false;
6980 battery
->ps_enable
= false;
6981 value
.intval
= battery
->ps_enable
;
6982 psy_do_property(battery
->pdata
->charger_name
, set
,
6983 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6993 static int sec_ps_get_property(struct power_supply
*psy
,
6994 enum power_supply_property psp
,
6995 union power_supply_propval
*val
)
6997 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
7000 case POWER_SUPPLY_PROP_STATUS
:
7001 val
->intval
= (battery
->ps_enable
) ? 1 : 0;
7003 case POWER_SUPPLY_PROP_ONLINE
:
7004 val
->intval
= (battery
->ps_status
) ? 1 : 0;
7013 #if defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || defined(CONFIG_MUIC_NOTIFIER)
7014 static int sec_bat_cable_check(struct sec_battery_info
*battery
,
7015 muic_attached_dev_t attached_dev
)
7017 int current_cable_type
= -1;
7018 union power_supply_propval val
= {0, };
7020 pr_info("[%s]ATTACHED(%d)\n", __func__
, attached_dev
);
7022 switch (attached_dev
)
7024 case ATTACHED_DEV_JIG_UART_OFF_MUIC
:
7025 case ATTACHED_DEV_JIG_UART_ON_MUIC
:
7026 battery
->is_jig_on
= true;
7027 #if defined(CONFIG_BATTERY_CISD)
7028 battery
->skip_cisd
= true;
7030 case ATTACHED_DEV_SMARTDOCK_MUIC
:
7031 case ATTACHED_DEV_DESKDOCK_MUIC
:
7032 case ATTACHED_DEV_JIG_USB_ON_MUIC
:
7033 current_cable_type
= SEC_BATTERY_CABLE_NONE
;
7035 case ATTACHED_DEV_UNDEFINED_CHARGING_MUIC
:
7036 case ATTACHED_DEV_UNDEFINED_RANGE_MUIC
:
7037 current_cable_type
= SEC_BATTERY_CABLE_NONE
;
7038 #if defined(CONFIG_BATTERY_CISD)
7039 battery
->cisd
.data
[CISD_DATA_WATER_DETECT
]++;
7040 battery
->cisd
.data
[CISD_DATA_WATER_DETECT_PER_DAY
]++;
7042 #if defined(CONFIG_SEC_ABC)
7043 sec_abc_send_event("MODULE=battery@ERROR=water_detect");
7046 case ATTACHED_DEV_OTG_MUIC
:
7047 case ATTACHED_DEV_JIG_UART_OFF_VB_OTG_MUIC
:
7048 case ATTACHED_DEV_HMT_MUIC
:
7049 current_cable_type
= SEC_BATTERY_CABLE_OTG
;
7051 case ATTACHED_DEV_TIMEOUT_OPEN_MUIC
:
7052 current_cable_type
= SEC_BATTERY_CABLE_TIMEOUT
;
7054 case ATTACHED_DEV_USB_MUIC
:
7055 case ATTACHED_DEV_JIG_USB_OFF_MUIC
:
7056 case ATTACHED_DEV_SMARTDOCK_USB_MUIC
:
7057 case ATTACHED_DEV_UNOFFICIAL_ID_USB_MUIC
:
7058 current_cable_type
= SEC_BATTERY_CABLE_USB
;
7060 case ATTACHED_DEV_JIG_UART_ON_VB_MUIC
:
7061 case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC
:
7062 case ATTACHED_DEV_JIG_UART_OFF_VB_FG_MUIC
:
7063 current_cable_type
= SEC_BATTERY_CABLE_UARTOFF
;
7065 case ATTACHED_DEV_RDU_TA_MUIC
:
7066 battery
->store_mode
= true;
7067 wake_lock(&battery
->parse_mode_dt_wake_lock
);
7068 queue_delayed_work(battery
->monitor_wqueue
, &battery
->parse_mode_dt_work
, 0);
7069 case ATTACHED_DEV_TA_MUIC
:
7070 case ATTACHED_DEV_CARDOCK_MUIC
:
7071 case ATTACHED_DEV_DESKDOCK_VB_MUIC
:
7072 case ATTACHED_DEV_SMARTDOCK_TA_MUIC
:
7073 case ATTACHED_DEV_UNOFFICIAL_TA_MUIC
:
7074 case ATTACHED_DEV_UNOFFICIAL_ID_TA_MUIC
:
7075 case ATTACHED_DEV_UNOFFICIAL_ID_ANY_MUIC
:
7076 case ATTACHED_DEV_UNSUPPORTED_ID_VB_MUIC
:
7077 current_cable_type
= SEC_BATTERY_CABLE_TA
;
7079 case ATTACHED_DEV_AFC_CHARGER_5V_MUIC
:
7080 case ATTACHED_DEV_QC_CHARGER_5V_MUIC
:
7081 case ATTACHED_DEV_AFC_CHARGER_5V_DUPLI_MUIC
:
7082 if (is_hv_wire_type(battery
->cable_type
) &&
7083 (battery
->chg_limit
|| battery
->vbus_chg_by_siop
)) {
7084 current_cable_type
= SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT
;
7085 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
&&
7086 battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL_DEFAULT
) {
7087 current_cable_type
= SEC_BATTERY_CABLE_PREPARE_TA
;
7089 current_cable_type
= SEC_BATTERY_CABLE_TA
;
7092 case ATTACHED_DEV_CDP_MUIC
:
7093 case ATTACHED_DEV_UNOFFICIAL_ID_CDP_MUIC
:
7094 current_cable_type
= SEC_BATTERY_CABLE_USB_CDP
;
7096 case ATTACHED_DEV_USB_LANHUB_MUIC
:
7097 current_cable_type
= SEC_BATTERY_CABLE_LAN_HUB
;
7099 case ATTACHED_DEV_CHARGING_CABLE_MUIC
:
7100 current_cable_type
= SEC_BATTERY_CABLE_POWER_SHARING
;
7102 case ATTACHED_DEV_AFC_CHARGER_PREPARE_MUIC
:
7103 case ATTACHED_DEV_QC_CHARGER_PREPARE_MUIC
:
7104 current_cable_type
= SEC_BATTERY_CABLE_PREPARE_TA
;
7106 case ATTACHED_DEV_AFC_CHARGER_9V_MUIC
:
7107 case ATTACHED_DEV_QC_CHARGER_9V_MUIC
:
7108 case ATTACHED_DEV_AFC_CHARGER_9V_DUPLI_MUIC
:
7109 current_cable_type
= SEC_BATTERY_CABLE_9V_TA
;
7111 #if defined(CONFIG_MUIC_HV_12V)
7112 case ATTACHED_DEV_AFC_CHARGER_12V_MUIC
:
7113 case ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC
:
7114 current_cable_type
= SEC_BATTERY_CABLE_12V_TA
;
7117 case ATTACHED_DEV_AFC_CHARGER_ERR_V_MUIC
:
7118 case ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC
:
7119 case ATTACHED_DEV_QC_CHARGER_ERR_V_MUIC
:
7120 current_cable_type
= SEC_BATTERY_CABLE_9V_ERR
;
7121 #if defined(CONFIG_BATTERY_CISD)
7122 battery
->cisd
.data
[CISD_DATA_AFC_FAIL
]++;
7123 battery
->cisd
.data
[CISD_DATA_AFC_FAIL_PER_DAY
]++;
7125 #if defined(CONFIG_SEC_ABC)
7126 sec_abc_send_event("MODULE=battery@ERROR=afc_fail");
7129 case ATTACHED_DEV_HV_ID_ERR_UNDEFINED_MUIC
:
7130 case ATTACHED_DEV_HV_ID_ERR_UNSUPPORTED_MUIC
:
7131 case ATTACHED_DEV_HV_ID_ERR_SUPPORTED_MUIC
:
7132 current_cable_type
= SEC_BATTERY_CABLE_9V_UNKNOWN
;
7133 #if defined(CONFIG_BATTERY_CISD)
7134 battery
->cisd
.data
[CISD_DATA_AFC_FAIL
]++;
7135 battery
->cisd
.data
[CISD_DATA_AFC_FAIL_PER_DAY
]++;
7137 #if defined(CONFIG_SEC_ABC)
7138 sec_abc_send_event("MODULE=battery@ERROR=afc_fail");
7141 case ATTACHED_DEV_VZW_INCOMPATIBLE_MUIC
:
7142 current_cable_type
= SEC_BATTERY_CABLE_UNKNOWN
;
7145 pr_err("%s: invalid type for charger:%d\n",
7146 __func__
, attached_dev
);
7150 if (battery
->is_jig_on
&& !battery
->pdata
->support_fgsrc_change
)
7151 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
7152 POWER_SUPPLY_PROP_ENERGY_NOW
, val
);
7154 return current_cable_type
;
7158 #if defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
7159 #if defined(CONFIG_CCIC_NOTIFIER)
7160 static int sec_bat_get_pd_list_index(PDIC_SINK_STATUS
*sink_status
, struct sec_bat_pdic_list
*pd_list
)
7164 for (i
= 0; i
< pd_list
->max_pd_count
; i
++) {
7165 if (pd_list
->pd_info
[i
].pdo_index
== sink_status
->current_pdo_num
)
7172 static void sec_bat_set_rp_current(struct sec_battery_info
*battery
, int cable_type
)
7174 if (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL3
) {
7175 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_HV_DISABLE
)
7176 sec_bat_change_default_current(battery
, cable_type
,
7177 battery
->pdata
->default_input_current
, battery
->pdata
->default_charging_current
);
7179 sec_bat_change_default_current(battery
, cable_type
,
7180 RP_CURRENT_RP3
, battery
->pdata
->max_charging_current
);
7182 else if (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL2
)
7183 sec_bat_change_default_current(battery
, cable_type
,
7184 RP_CURRENT_RP2
, RP_CURRENT_RP2
);
7185 else if (cable_type
== SEC_BATTERY_CABLE_USB
) {
7186 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_USB_SUPER
)
7187 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
7188 USB_CURRENT_SUPER_SPEED
, USB_CURRENT_SUPER_SPEED
);
7190 sec_bat_change_default_current(battery
, cable_type
,
7191 RP_CURRENT_RP1
, RP_CURRENT_RP1
);
7194 pr_info("%s:(%d)\n", __func__
, battery
->pdic_info
.sink_status
.rp_currentlvl
);
7195 battery
->max_charge_power
= 0;
7196 sec_bat_set_charging_current(battery
);
7200 static int make_pd_list(struct sec_battery_info
*battery
)
7202 int i
= 0, j
= 0, min
= 0, temp_voltage
= 0, temp_current
= 0, temp_index
= 0;
7203 int base_charge_power
= 0, selected_pdo_voltage
= 0, selected_pdo_num
= 0;
7204 int pd_list_index
= 0;
7205 int pd_charging_charge_power
= battery
->current_event
& SEC_BAT_CURRENT_EVENT_HV_DISABLE
?
7206 battery
->pdata
->nv_charge_power
: battery
->pdata
->pd_charging_charge_power
;
7208 for (base_charge_power
= pd_charging_charge_power
* 1000;
7209 base_charge_power
>= 1000000; base_charge_power
-= 1000000)
7211 selected_pdo_voltage
= battery
->pdata
->max_input_voltage
+ 1;
7212 selected_pdo_num
= 0;
7213 for(i
=1; i
<= battery
->pdic_info
.sink_status
.available_pdo_num
; i
++)
7215 if (battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7216 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
> base_charge_power
- 1000000 &&
7217 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7218 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
<= base_charge_power
)
7220 if (battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
< selected_pdo_voltage
)
7222 selected_pdo_voltage
= battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
;
7223 selected_pdo_num
= i
;
7224 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
=
7225 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
>
7226 battery
->pdata
->max_input_current
?
7227 battery
->pdata
->max_input_current
: battery
->pdic_info
.sink_status
.power_list
[i
].max_current
;
7231 if (selected_pdo_num
)
7233 battery
->pd_list
.pd_info
[pd_list_index
].input_voltage
=
7234 battery
->pdic_info
.sink_status
.power_list
[selected_pdo_num
].max_voltage
;
7235 battery
->pd_list
.pd_info
[pd_list_index
].input_current
=
7236 battery
->pdic_info
.sink_status
.power_list
[selected_pdo_num
].max_current
;
7237 battery
->pd_list
.pd_info
[pd_list_index
].pdo_index
= selected_pdo_num
;
7241 pr_info("%s: total pd_list_index: %d\n", __func__
, pd_list_index
);
7242 if (pd_list_index
<= 0) {
7243 pr_info("%s : PDO list is empty!!\n", __func__
);
7247 for (i
= 0; i
< pd_list_index
- 1; i
++) {
7249 for (j
= i
+ 1; j
< pd_list_index
; j
++) {
7250 if (battery
->pd_list
.pd_info
[j
].input_voltage
<
7251 battery
->pd_list
.pd_info
[min
].input_voltage
)
7254 temp_voltage
= battery
->pd_list
.pd_info
[i
].input_voltage
;
7255 battery
->pd_list
.pd_info
[i
].input_voltage
=
7256 battery
->pd_list
.pd_info
[min
].input_voltage
;
7257 battery
->pd_list
.pd_info
[min
].input_voltage
= temp_voltage
;
7258 temp_current
= battery
->pd_list
.pd_info
[i
].input_current
;
7259 battery
->pd_list
.pd_info
[i
].input_current
=
7260 battery
->pd_list
.pd_info
[min
].input_current
;
7261 battery
->pd_list
.pd_info
[min
].input_current
= temp_current
;
7262 temp_index
= battery
->pd_list
.pd_info
[i
].pdo_index
;
7263 battery
->pd_list
.pd_info
[i
].pdo_index
=
7264 battery
->pd_list
.pd_info
[min
].pdo_index
;
7265 battery
->pd_list
.pd_info
[min
].pdo_index
= temp_index
;
7267 for(i
= 0; i
< pd_list_index
; i
++) {
7268 pr_info("%s: Made pd_list[%d], voltage : %d, current : %d, index : %d\n", __func__
, i
,
7269 battery
->pd_list
.pd_info
[i
].input_voltage
,
7270 battery
->pd_list
.pd_info
[i
].input_current
,
7271 battery
->pd_list
.pd_info
[i
].pdo_index
);
7273 battery
->pd_list
.max_pd_count
= pd_list_index
;
7274 battery
->max_charge_power
= battery
->pdic_info
.sink_status
.power_list
[ \
7275 battery
->pd_list
.pd_info
[pd_list_index
-1].pdo_index
].max_voltage
* \
7276 battery
->pdic_info
.sink_status
.power_list
[battery
->pd_list
.pd_info
[ \
7277 pd_list_index
-1].pdo_index
].max_current
/ 1000;
7278 battery
->pd_max_charge_power
= battery
->max_charge_power
;
7280 if (battery
->pdic_info
.sink_status
.selected_pdo_num
== battery
->pd_list
.pd_info
[pd_list_index
-1].pdo_index
) {
7281 battery
->pd_list
.now_pd_index
= pd_list_index
- 1;
7282 battery
->pdic_ps_rdy
= true;
7283 dev_info(battery
->dev
, "%s: battery->pdic_ps_rdy(%d)\n", __func__
, battery
->pdic_ps_rdy
);
7285 /* change input current before request new pdo if new pdo's input current is less than now */
7286 if (battery
->pd_list
.pd_info
[pd_list_index
-1].input_current
< battery
->input_current
) {
7287 union power_supply_propval value
= {0, };
7288 int input_current
= battery
->pd_list
.pd_info
[pd_list_index
-1].input_current
;
7290 value
.intval
= input_current
;
7291 battery
->input_current
= input_current
;
7292 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SELECT_PDO
,
7293 SEC_BAT_CURRENT_EVENT_SELECT_PDO
);
7294 psy_do_property(battery
->pdata
->charger_name
, set
,
7295 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
7297 battery
->pdic_ps_rdy
= false;
7298 select_pdo(battery
->pd_list
.pd_info
[pd_list_index
-1].pdo_index
);
7301 return battery
->pd_list
.max_pd_count
;
7304 static int usb_typec_handle_notification(struct notifier_block
*nb
,
7305 unsigned long action
, void *data
)
7308 struct sec_battery_info
*battery
=
7309 container_of(nb
, struct sec_battery_info
, usb_typec_nb
);
7310 int cable_type
= SEC_BATTERY_CABLE_NONE
, i
= 0, current_pdo
= 0;
7311 int pd_charging_charge_power
= battery
->current_event
& SEC_BAT_CURRENT_EVENT_HV_DISABLE
?
7312 battery
->pdata
->nv_charge_power
: battery
->pdata
->pd_charging_charge_power
;
7313 CC_NOTI_ATTACH_TYPEDEF usb_typec_info
= *(CC_NOTI_ATTACH_TYPEDEF
*)data
;
7315 dev_info(battery
->dev
, "%s: action (%ld) dump(0x%01x, 0x%01x, 0x%02x, 0x%04x, 0x%04x, 0x%04x)\n",
7316 __func__
, action
, usb_typec_info
.src
, usb_typec_info
.dest
, usb_typec_info
.id
,
7317 usb_typec_info
.attach
, usb_typec_info
.rprd
, usb_typec_info
.cable_type
);
7319 if (usb_typec_info
.dest
!= CCIC_NOTIFY_DEV_BATTERY
) {
7320 dev_info(battery
->dev
, "%s: skip handler dest(%d)\n",
7321 __func__
, usb_typec_info
.dest
);
7325 mutex_lock(&battery
->typec_notylock
);
7326 switch (usb_typec_info
.id
) {
7327 case CCIC_NOTIFY_ID_WATER
:
7328 case CCIC_NOTIFY_ID_ATTACH
:
7329 switch (usb_typec_info
.attach
) {
7330 case MUIC_NOTIFY_CMD_DETACH
:
7331 case MUIC_NOTIFY_CMD_LOGICALLY_DETACH
:
7333 battery
->is_jig_on
= false;
7334 battery
->pd_usb_attached
= false;
7335 cable_type
= SEC_BATTERY_CABLE_NONE
;
7336 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7337 battery
->pdic_info
.sink_status
.rp_currentlvl
= RP_CURRENT_LEVEL_NONE
;
7339 case MUIC_NOTIFY_CMD_ATTACH
:
7340 case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH
:
7341 /* Skip notify from MUIC if PDIC is attached already */
7342 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
7343 mutex_unlock(&battery
->typec_notylock
);
7347 battery
->muic_cable_type
= usb_typec_info
.cable_type
;
7348 cable_type
= sec_bat_cable_check(battery
, battery
->muic_cable_type
);
7349 if (battery
->cable_type
!= cable_type
&&
7350 battery
->pdic_info
.sink_status
.rp_currentlvl
>= RP_CURRENT_LEVEL_DEFAULT
&&
7351 (cable_type
== SEC_BATTERY_CABLE_USB
|| cable_type
== SEC_BATTERY_CABLE_TA
)) {
7352 sec_bat_set_rp_current(battery
, cable_type
);
7353 } else if ((struct pdic_notifier_struct
*)usb_typec_info
.pd
!= NULL
&&
7354 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_CCIC_ATTACH
&&
7355 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.rp_currentlvl
>= RP_CURRENT_LEVEL_DEFAULT
&&
7356 (cable_type
== SEC_BATTERY_CABLE_USB
|| cable_type
== SEC_BATTERY_CABLE_TA
)) {
7357 battery
->pdic_info
.sink_status
.rp_currentlvl
=
7358 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.rp_currentlvl
;
7359 sec_bat_set_rp_current(battery
, cable_type
);
7365 battery
->muic_cable_type
= usb_typec_info
.cable_type
;
7368 battery
->pdic_attach
= false;
7369 battery
->pdic_ps_rdy
= false;
7370 #if defined(CONFIG_AFC_CHARGER_MODE)
7371 if (battery
->muic_cable_type
== ATTACHED_DEV_QC_CHARGER_9V_MUIC
||
7372 battery
->muic_cable_type
== ATTACHED_DEV_QC_CHARGER_ERR_V_MUIC
)
7373 battery
->hv_chg_name
= "QC";
7374 else if (battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_9V_MUIC
||
7375 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_9V_DUPLI_MUIC
||
7376 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_ERR_V_MUIC
||
7377 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC
)
7378 battery
->hv_chg_name
= "AFC";
7379 #if defined(CONFIG_MUIC_HV_12V)
7380 else if (battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_MUIC
||
7381 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC
)
7382 battery
->hv_chg_name
= "12V";
7385 battery
->hv_chg_name
= "NONE";
7388 case CCIC_NOTIFY_ID_POWER_STATUS
:
7389 #ifdef CONFIG_SEC_FACTORY
7390 dev_info(battery
->dev
, "%s: pd_event(%d)\n", __func__
,
7391 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
);
7393 if ((*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_DETACH
){
7394 dev_info(battery
->dev
, "%s: skip pd operation - attach(%d)\n", __func__
, usb_typec_info
.attach
);
7395 battery
->pdic_attach
= false;
7396 battery
->pdic_ps_rdy
= false;
7397 battery
->pd_list
.now_pd_index
= 0;
7398 mutex_unlock(&battery
->typec_notylock
);
7403 if ((*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_CCIC_ATTACH
) {
7404 battery
->pdic_info
.sink_status
.rp_currentlvl
=
7405 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.rp_currentlvl
;
7406 dev_info(battery
->dev
, "%s: battery->rp_currentlvl(%d)\n", __func__
, battery
->pdic_info
.sink_status
.rp_currentlvl
);
7407 if (battery
->wire_status
== SEC_BATTERY_CABLE_USB
|| battery
->wire_status
== SEC_BATTERY_CABLE_TA
) {
7408 cable_type
= battery
->wire_status
;
7409 battery
->chg_limit
= false;
7410 sec_bat_set_rp_current(battery
, cable_type
);
7411 goto skip_cable_check
;
7413 mutex_unlock(&battery
->typec_notylock
);
7416 if ((*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_PD_SINK_CAP
)
7417 battery
->pdic_attach
= false;
7418 if (!battery
->pdic_attach
) {
7419 battery
->pdic_info
= *(struct pdic_notifier_struct
*)usb_typec_info
.pd
;
7420 battery
->pd_list
.now_pd_index
= 0;
7422 battery
->pdic_info
.sink_status
.selected_pdo_num
=
7423 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.selected_pdo_num
;
7424 battery
->pdic_info
.sink_status
.current_pdo_num
=
7425 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.current_pdo_num
;
7426 battery
->pd_list
.now_pd_index
= sec_bat_get_pd_list_index(&battery
->pdic_info
.sink_status
,
7428 battery
->pdic_ps_rdy
= true;
7429 dev_info(battery
->dev
, "%s: battery->pdic_ps_rdy(%d)\n", __func__
, battery
->pdic_ps_rdy
);
7431 current_pdo
= battery
->pdic_info
.sink_status
.current_pdo_num
;
7432 cable_type
= SEC_BATTERY_CABLE_PDIC
;
7433 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7434 #if defined(CONFIG_AFC_CHARGER_MODE)
7435 battery
->hv_chg_name
= "PDIC";
7437 battery
->input_voltage
=
7438 battery
->pdic_info
.sink_status
.power_list
[current_pdo
].max_voltage
/ 1000;
7439 dev_info(battery
->dev
, "%s: available pdo : %d, current pdo : %d\n", __func__
,
7440 battery
->pdic_info
.sink_status
.available_pdo_num
, current_pdo
);
7442 for(i
=1; i
<= battery
->pdic_info
.sink_status
.available_pdo_num
; i
++) {
7443 pr_info("%s: power_list[%d], voltage : %d, current : %d, power : %d\n", __func__
, i
,
7444 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
,
7445 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
,
7446 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7447 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
);
7449 if ((battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7450 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
) >
7451 (pd_charging_charge_power
* 1000)) {
7452 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
=
7453 (pd_charging_charge_power
* 1000) /
7454 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
;
7456 pr_info("%s: ->updated [%d], voltage : %d, current : %d, power : %d\n", __func__
, i
,
7457 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
,
7458 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
,
7459 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7460 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
);
7464 if (!battery
->pdic_attach
) {
7465 if (make_pd_list(battery
) <= 0)
7466 goto skip_cable_work
;
7468 battery
->pdic_attach
= true;
7470 case CCIC_NOTIFY_ID_USB
:
7471 if(usb_typec_info
.cable_type
== PD_USB_TYPE
)
7472 battery
->pd_usb_attached
= true;
7473 dev_info(battery
->dev
, "%s: CCIC_NOTIFY_ID_USB: %d\n",__func__
, battery
->pd_usb_attached
);
7474 wake_lock(&battery
->monitor_wake_lock
);
7475 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7476 mutex_unlock(&battery
->typec_notylock
);
7481 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7482 #if defined(CONFIG_AFC_CHARGER_MODE)
7483 battery
->hv_chg_name
= "NONE";
7489 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
,
7490 (battery
->muic_cable_type
!= ATTACHED_DEV_UNDEFINED_CHARGING_MUIC
) &&
7491 (battery
->muic_cable_type
!= ATTACHED_DEV_UNDEFINED_RANGE_MUIC
));
7493 /* showing charging icon and noti(no sound, vi, haptic) only
7494 if slow insertion is detected by MUIC */
7495 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
,
7496 (battery
->muic_cable_type
!= ATTACHED_DEV_TIMEOUT_OPEN_MUIC
));
7498 if (cable_type
< 0 || cable_type
> SEC_BATTERY_CABLE_MAX
) {
7499 dev_info(battery
->dev
, "%s: ignore event(%d)\n",
7500 __func__
, battery
->muic_cable_type
);
7501 goto skip_cable_work
;
7502 } else if ((cable_type
== SEC_BATTERY_CABLE_UNKNOWN
) &&
7503 (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
)) {
7504 battery
->cable_type
= cable_type
;
7505 wake_lock(&battery
->monitor_wake_lock
);
7506 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7507 dev_info(battery
->dev
, "%s: UNKNOWN cable plugin\n", __func__
);
7508 goto skip_cable_work
;
7510 battery
->wire_status
= cable_type
;
7512 cancel_delayed_work(&battery
->cable_work
);
7513 wake_unlock(&battery
->cable_wake_lock
);
7515 if (cable_type
== SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT
) {
7516 /* set current event */
7517 cancel_delayed_work(&battery
->afc_work
);
7518 wake_unlock(&battery
->afc_wake_lock
);
7519 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_CHG_LIMIT
,
7520 (SEC_BAT_CURRENT_EVENT_CHG_LIMIT
| SEC_BAT_CURRENT_EVENT_AFC
));
7521 wake_lock(&battery
->monitor_wake_lock
);
7522 battery
->polling_count
= 1; /* initial value = 1 */
7523 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7524 } else if ((battery
->wire_status
== battery
->cable_type
) &&
7525 (((battery
->wire_status
== SEC_BATTERY_CABLE_USB
|| battery
->wire_status
== SEC_BATTERY_CABLE_TA
) &&
7526 battery
->pdic_info
.sink_status
.rp_currentlvl
> RP_CURRENT_LEVEL_DEFAULT
) ||
7527 is_hv_wire_type(battery
->wire_status
))) {
7528 cancel_delayed_work(&battery
->afc_work
);
7529 wake_unlock(&battery
->afc_wake_lock
);
7530 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AFC
);
7532 wake_lock(&battery
->monitor_wake_lock
);
7533 battery
->polling_count
= 1; /* initial value = 1 */
7534 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7535 } else if (cable_type
== SEC_BATTERY_CABLE_PREPARE_TA
) {
7536 wake_lock(&battery
->cable_wake_lock
);
7537 queue_delayed_work(battery
->monitor_wqueue
,
7538 &battery
->cable_work
, msecs_to_jiffies(500));
7540 wake_lock(&battery
->cable_wake_lock
);
7541 queue_delayed_work(battery
->monitor_wqueue
,
7542 &battery
->cable_work
, 0);
7546 dev_info(battery
->dev
, "%s: CMD[%s], CABLE_TYPE[%d]\n", __func__
, cmd
, cable_type
);
7547 mutex_unlock(&battery
->typec_notylock
);
7551 #if defined(CONFIG_CCIC_NOTIFIER)
7552 static int batt_pdic_handle_notification(struct notifier_block
*nb
,
7553 unsigned long action
, void *data
)
7556 struct sec_battery_info
*battery
=
7557 container_of(nb
, struct sec_battery_info
,
7559 battery
->pdic_info
= *(struct pdic_notifier_struct
*)data
;
7561 mutex_lock(&battery
->batt_handlelock
);
7562 pr_info("%s: pdic_event: %d\n", __func__
, battery
->pdic_info
.event
);
7564 switch (battery
->pdic_info
.event
) {
7565 int i
, selected_pdo
;
7567 case PDIC_NOTIFY_EVENT_DETACH
:
7569 battery
->pdic_attach
= false;
7570 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
7571 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
7572 wake_lock(&battery
->cable_wake_lock
);
7573 queue_delayed_work(battery
->monitor_wqueue
,
7574 &battery
->cable_work
, 0);
7577 case PDIC_NOTIFY_EVENT_CCIC_ATTACH
:
7580 case PDIC_NOTIFY_EVENT_PD_SINK
:
7581 selected_pdo
= battery
->pdic_info
.sink_status
.selected_pdo_num
;
7583 battery
->wire_status
= SEC_BATTERY_CABLE_PDIC
;
7584 battery
->pdic_attach
= true;
7585 battery
->input_voltage
=
7586 battery
->pdic_info
.sink_status
.power_list
[selected_pdo
].max_voltage
/ 1000;
7588 pr_info("%s: total pdo : %d, selected pdo : %d\n", __func__
,
7589 battery
->pdic_info
.sink_status
.available_pdo_num
, selected_pdo
);
7590 for(i
=1; i
<= battery
->pdic_info
.sink_status
.available_pdo_num
; i
++)
7592 pr_info("%s: power_list[%d], voltage : %d, current : %d, power : %d\n", __func__
, i
,
7593 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
,
7594 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
,
7595 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7596 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
);
7598 wake_lock(&battery
->cable_wake_lock
);
7599 queue_delayed_work(battery
->monitor_wqueue
,
7600 &battery
->cable_work
, 0);
7602 case PDIC_NOTIFY_EVENT_PD_SOURCE
:
7609 pr_info("%s: CMD=%s, cable_type : %d\n", __func__
, cmd
, battery
->cable_type
);
7610 mutex_unlock(&battery
->batt_handlelock
);
7615 #if defined(CONFIG_MUIC_NOTIFIER)
7616 static int batt_handle_notification(struct notifier_block
*nb
,
7617 unsigned long action
, void *data
)
7620 int cable_type
= SEC_BATTERY_CABLE_NONE
;
7621 struct sec_battery_info
*battery
=
7622 container_of(nb
, struct sec_battery_info
,
7624 union power_supply_propval value
= {0, };
7626 #if defined(CONFIG_CCIC_NOTIFIER)
7627 CC_NOTI_ATTACH_TYPEDEF
*p_noti
= (CC_NOTI_ATTACH_TYPEDEF
*)data
;
7628 muic_attached_dev_t attached_dev
= p_noti
->cable_type
;
7630 muic_attached_dev_t attached_dev
= *(muic_attached_dev_t
*)data
;
7633 mutex_lock(&battery
->batt_handlelock
);
7635 case MUIC_NOTIFY_CMD_DETACH
:
7636 case MUIC_NOTIFY_CMD_LOGICALLY_DETACH
:
7638 battery
->is_jig_on
= false;
7639 cable_type
= SEC_BATTERY_CABLE_NONE
;
7640 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7642 case MUIC_NOTIFY_CMD_ATTACH
:
7643 case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH
:
7645 cable_type
= sec_bat_cable_check(battery
, attached_dev
);
7646 battery
->muic_cable_type
= attached_dev
;
7651 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7655 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
,
7656 #if !defined(CONFIG_ENG_BATTERY_CONCEPT) && !defined(CONFIG_SEC_FACTORY)
7657 (battery
->muic_cable_type
!= ATTACHED_DEV_JIG_UART_ON_MUIC
) &&
7658 (battery
->muic_cable_type
!= ATTACHED_DEV_JIG_USB_ON_MUIC
) &&
7660 (battery
->muic_cable_type
!= ATTACHED_DEV_UNDEFINED_RANGE_MUIC
));
7662 #if defined(CONFIG_CCIC_NOTIFIER)
7663 /* If PD cable is already attached, return this function */
7664 if(battery
->pdic_attach
) {
7665 dev_info(battery
->dev
, "%s: ignore event pdic attached(%d)\n",
7666 __func__
, battery
->pdic_attach
);
7667 mutex_unlock(&battery
->batt_handlelock
);
7672 if (attached_dev
== ATTACHED_DEV_MHL_MUIC
) {
7673 mutex_unlock(&battery
->batt_handlelock
);
7677 if (cable_type
< 0) {
7678 dev_info(battery
->dev
, "%s: ignore event(%d)\n",
7679 __func__
, cable_type
);
7680 } else if (cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
7681 battery
->ps_status
= true;
7682 battery
->ps_enable
= true;
7683 battery
->wire_status
= cable_type
;
7684 dev_info(battery
->dev
, "%s: power sharing cable plugin\n", __func__
);
7685 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS
) {
7686 battery
->wc_status
= SEC_WIRELESS_PAD_WPC
;
7687 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
) {
7688 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_PACK
;
7689 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_PACK
) {
7690 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_PACK_HV
;
7691 } else if (cable_type
== SEC_BATTERY_CABLE_HV_WIRELESS
) {
7692 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_HV
;
7693 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
) {
7694 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_STAND
;
7695 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_STAND
) {
7696 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_STAND_HV
;
7697 } else if (cable_type
== SEC_BATTERY_CABLE_PMA_WIRELESS
) {
7698 battery
->wc_status
= SEC_WIRELESS_PAD_PMA
;
7699 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_VEHICLE
) {
7700 battery
->wc_status
= SEC_WIRELESS_PAD_VEHICLE
;
7701 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE
) {
7702 battery
->wc_status
= SEC_WIRELESS_PAD_VEHICLE_HV
;
7703 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
7704 battery
->wc_status
= SEC_WIRELESS_PAD_TX
;
7705 } else if ((cable_type
== SEC_BATTERY_CABLE_UNKNOWN
) &&
7706 (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
)) {
7707 battery
->cable_type
= cable_type
;
7708 wake_lock(&battery
->monitor_wake_lock
);
7709 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7710 dev_info(battery
->dev
,
7711 "%s: UNKNOWN cable plugin\n", __func__
);
7712 mutex_unlock(&battery
->batt_handlelock
);
7715 battery
->wire_status
= cable_type
;
7716 if ((battery
->wire_status
== SEC_BATTERY_CABLE_NONE
) &&
7717 (battery
->wc_status
) && (!battery
->ps_status
))
7718 cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
7720 dev_info(battery
->dev
,
7721 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
7722 __func__
, cable_type
, battery
->wc_status
,
7723 battery
->wire_status
);
7725 mutex_unlock(&battery
->batt_handlelock
);
7726 if (attached_dev
== ATTACHED_DEV_USB_LANHUB_MUIC
) {
7727 if (!strcmp(cmd
, "ATTACH")) {
7728 value
.intval
= true;
7729 psy_do_property(battery
->pdata
->charger_name
, set
,
7730 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
,
7732 dev_info(battery
->dev
,
7733 "%s: Powered OTG cable attached\n", __func__
);
7735 value
.intval
= false;
7736 psy_do_property(battery
->pdata
->charger_name
, set
,
7737 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
,
7739 dev_info(battery
->dev
,
7740 "%s: Powered OTG cable detached\n", __func__
);
7744 #if defined(CONFIG_AFC_CHARGER_MODE)
7745 if (!strcmp(cmd
, "ATTACH")) {
7746 if ((battery
->muic_cable_type
>= ATTACHED_DEV_QC_CHARGER_PREPARE_MUIC
) &&
7747 (battery
->muic_cable_type
<= ATTACHED_DEV_QC_CHARGER_9V_MUIC
)) {
7748 battery
->hv_chg_name
= "QC";
7749 } else if ((battery
->muic_cable_type
>= ATTACHED_DEV_AFC_CHARGER_PREPARE_MUIC
) &&
7750 (battery
->muic_cable_type
<= ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC
)) {
7751 battery
->hv_chg_name
= "AFC";
7752 #if defined(CONFIG_MUIC_HV_12V)
7753 } else if (battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_MUIC
||
7754 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC
) {
7755 battery
->hv_chg_name
= "12V";
7758 battery
->hv_chg_name
= "NONE";
7760 battery
->hv_chg_name
= "NONE";
7763 pr_info("%s : HV_CHARGER_NAME(%s)\n",
7764 __func__
, battery
->hv_chg_name
);
7767 if ((cable_type
>= 0) &&
7768 cable_type
<= SEC_BATTERY_CABLE_MAX
) {
7769 if (cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
7770 value
.intval
= battery
->ps_enable
;
7771 psy_do_property(battery
->pdata
->charger_name
, set
,
7772 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
7773 wake_lock(&battery
->monitor_wake_lock
);
7774 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7775 } else if((cable_type
== SEC_BATTERY_CABLE_NONE
) && (battery
->ps_status
)) {
7776 if (battery
->ps_enable
) {
7777 battery
->ps_enable
= false;
7778 value
.intval
= battery
->ps_enable
;
7779 psy_do_property(battery
->pdata
->charger_name
, set
,
7780 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
7782 battery
->ps_status
= false;
7783 wake_lock(&battery
->monitor_wake_lock
);
7784 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7785 } else if(cable_type
!= battery
->cable_type
) {
7786 wake_lock(&battery
->cable_wake_lock
);
7787 queue_delayed_work(battery
->monitor_wqueue
,
7788 &battery
->cable_work
, 0);
7790 dev_info(battery
->dev
,
7791 "%s: Cable is Not Changed(%d)\n",
7792 __func__
, battery
->cable_type
);
7796 pr_info("%s: CMD=%s, attached_dev=%d\n", __func__
, cmd
, attached_dev
);
7800 #endif /* CONFIG_MUIC_NOTIFIER */
7803 #if defined(CONFIG_VBUS_NOTIFIER)
7804 static int vbus_handle_notification(struct notifier_block
*nb
,
7805 unsigned long action
, void *data
)
7807 vbus_status_t vbus_status
= *(vbus_status_t
*)data
;
7808 struct sec_battery_info
*battery
=
7809 container_of(nb
, struct sec_battery_info
,
7811 union power_supply_propval value
= {0, };
7813 mutex_lock(&battery
->batt_handlelock
);
7814 if (battery
->muic_cable_type
== ATTACHED_DEV_HMT_MUIC
&&
7815 battery
->muic_vbus_status
!= vbus_status
&&
7816 battery
->muic_vbus_status
== STATUS_VBUS_HIGH
&&
7817 vbus_status
== STATUS_VBUS_LOW
) {
7819 value
.intval
= true;
7820 psy_do_property(battery
->pdata
->charger_name
, set
,
7821 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
7823 dev_info(battery
->dev
,
7824 "%s: changed to OTG cable attached\n", __func__
);
7826 battery
->wire_status
= SEC_BATTERY_CABLE_OTG
;
7827 wake_lock(&battery
->cable_wake_lock
);
7828 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
7830 pr_info("%s: action=%d, vbus_status=%d\n", __func__
, (int)action
, vbus_status
);
7831 mutex_unlock(&battery
->batt_handlelock
);
7832 battery
->muic_vbus_status
= vbus_status
;
7839 static int sec_bat_parse_dt(struct device
*dev
,
7840 struct sec_battery_info
*battery
)
7842 struct device_node
*np
;
7843 sec_battery_platform_data_t
*pdata
= battery
->pdata
;
7844 int ret
= 0, len
= 0;
7849 np
= of_find_node_by_name(NULL
, "cable-info");
7851 pr_err ("%s : np NULL\n", __func__
);
7853 struct device_node
*child
;
7854 u32 input_current
= 0, charging_current
= 0;
7856 ret
= of_property_read_u32(np
, "default_input_current", &input_current
);
7857 ret
= of_property_read_u32(np
, "default_charging_current", &charging_current
);
7858 ret
= of_property_read_u32(np
, "full_check_current_1st", &pdata
->full_check_current_1st
);
7859 ret
= of_property_read_u32(np
, "full_check_current_2nd", &pdata
->full_check_current_2nd
);
7861 pdata
->default_input_current
= input_current
;
7862 pdata
->default_charging_current
= charging_current
;
7864 pdata
->charging_current
=
7865 kzalloc(sizeof(sec_charging_current_t
) * SEC_BATTERY_CABLE_MAX
,
7868 for (i
= 0; i
< SEC_BATTERY_CABLE_MAX
; i
++) {
7869 pdata
->charging_current
[i
].input_current_limit
= (unsigned int)input_current
;
7870 pdata
->charging_current
[i
].fast_charging_current
= (unsigned int)charging_current
;
7873 for_each_child_of_node(np
, child
) {
7874 ret
= of_property_read_u32(child
, "input_current", &input_current
);
7875 ret
= of_property_read_u32(child
, "charging_current", &charging_current
);
7877 p
= of_get_property(child
, "cable_number", &len
);
7881 len
= len
/ sizeof(u32
);
7883 for (i
= 0; i
<= len
; i
++) {
7884 ret
= of_property_read_u32_index(child
, "cable_number", i
, &temp
);
7885 pdata
->charging_current
[temp
].input_current_limit
= (unsigned int)input_current
;
7886 pdata
->charging_current
[temp
].fast_charging_current
= (unsigned int)charging_current
;
7892 for (i
= 0; i
< SEC_BATTERY_CABLE_MAX
; i
++) {
7893 pr_info("%s : CABLE_NUM(%d) INPUT(%d) CHARGING(%d)\n",
7895 pdata
->charging_current
[i
].input_current_limit
,
7896 pdata
->charging_current
[i
].fast_charging_current
);
7899 pr_info("%s : TOPOFF_1ST(%d), TOPOFF_2ND(%d)\n",
7900 __func__
, pdata
->full_check_current_1st
, pdata
->full_check_current_2nd
);
7901 #ifdef CONFIG_SEC_FACTORY
7902 pdata
->default_charging_current
= 1500;
7903 pdata
->charging_current
[SEC_BATTERY_CABLE_TA
].fast_charging_current
= 1500;
7905 np
= of_find_node_by_name(NULL
, "battery");
7907 pr_info("%s: np NULL\n", __func__
);
7911 #if defined(CONFIG_BATTERY_CISD)
7912 ret
= of_property_read_u32(np
, "battery,battery_full_capacity",
7913 &pdata
->battery_full_capacity
);
7915 pr_info("%s : battery_full_capacity is Empty\n", __func__
);
7917 pr_info("%s : battery_full_capacity : %d\n", __func__
, pdata
->battery_full_capacity
);
7918 pdata
->cisd_cap_high_thr
= pdata
->battery_full_capacity
+ 1000;
7919 pdata
->cisd_cap_low_thr
= pdata
->battery_full_capacity
+ 500;
7920 pdata
->cisd_cap_limit
= (pdata
->battery_full_capacity
* 11) / 10;
7923 ret
= of_property_read_u32(np
, "battery,cisd_max_voltage_thr",
7924 &pdata
->max_voltage_thr
);
7926 pr_info("%s : cisd_max_voltage_thr is Empty\n", __func__
);
7927 pdata
->max_voltage_thr
= 4400;
7930 ret
= of_property_read_u32(np
, "battery,cisd_alg_index",
7931 &pdata
->cisd_alg_index
);
7933 pr_info("%s : cisd_alg_index is Empty. Defalut set to six\n", __func__
);
7934 pdata
->cisd_alg_index
= 6;
7936 pr_info("%s : set cisd_alg_index : %d\n", __func__
, pdata
->cisd_alg_index
);
7940 ret
= of_property_read_u32(np
,
7941 "battery,expired_time", &temp
);
7943 pr_info("expired time is empty\n");
7944 pdata
->expired_time
= 3 * 60 * 60;
7946 pdata
->expired_time
= (unsigned int) temp
;
7948 pdata
->expired_time
*= 1000;
7949 battery
->expired_time
= pdata
->expired_time
;
7951 ret
= of_property_read_u32(np
,
7952 "battery,recharging_expired_time", &temp
);
7954 pr_info("expired time is empty\n");
7955 pdata
->recharging_expired_time
= 90 * 60;
7957 pdata
->recharging_expired_time
= (unsigned int) temp
;
7959 pdata
->recharging_expired_time
*= 1000;
7961 ret
= of_property_read_u32(np
,
7962 "battery,standard_curr", &pdata
->standard_curr
);
7964 pr_info("standard_curr is empty\n");
7965 pdata
->standard_curr
= 2150;
7968 ret
= of_property_read_string(np
,
7969 "battery,vendor", (char const **)&pdata
->vendor
);
7971 pr_info("%s: Vendor is Empty\n", __func__
);
7973 ret
= of_property_read_string(np
,
7974 "battery,charger_name", (char const **)&pdata
->charger_name
);
7976 pr_info("%s: Charger name is Empty\n", __func__
);
7978 ret
= of_property_read_string(np
,
7979 "battery,fuelgauge_name", (char const **)&pdata
->fuelgauge_name
);
7981 pr_info("%s: Fuelgauge name is Empty\n", __func__
);
7983 ret
= of_property_read_string(np
,
7984 "battery,wireless_charger_name", (char const **)&pdata
->wireless_charger_name
);
7986 pr_info("%s: Wireless charger name is Empty\n", __func__
);
7988 ret
= of_property_read_string(np
,
7989 "battery,fgsrc_switch_name", (char const **)&pdata
->fgsrc_switch_name
);
7991 pdata
->support_fgsrc_change
= false;
7992 pr_info("%s: fgsrc_switch_name is Empty\n", __func__
);
7995 pdata
->support_fgsrc_change
= true;
7997 ret
= of_property_read_string(np
,
7998 "battery,wireless_charger_name", (char const **)&pdata
->wireless_charger_name
);
8000 pr_info("%s: Wireless charger name is Empty\n", __func__
);
8002 ret
= of_property_read_string(np
,
8003 "battery,chip_vendor", (char const **)&pdata
->chip_vendor
);
8005 pr_info("%s: Chip vendor is Empty\n", __func__
);
8007 ret
= of_property_read_u32(np
, "battery,technology",
8008 &pdata
->technology
);
8010 pr_info("%s : technology is Empty\n", __func__
);
8012 ret
= of_property_read_u32(np
,
8013 "battery,wireless_cc_cv", &pdata
->wireless_cc_cv
);
8015 ret
= of_property_read_u32(np
,
8016 "battery,set_cv_vout_in_low_capacity", &pdata
->set_cv_vout_in_low_capacity
);
8018 pdata
->fake_capacity
= of_property_read_bool(np
,
8019 "battery,fake_capacity");
8021 p
= of_get_property(np
, "battery,polling_time", &len
);
8025 len
= len
/ sizeof(u32
);
8026 pdata
->polling_time
= kzalloc(sizeof(*pdata
->polling_time
) * len
, GFP_KERNEL
);
8027 ret
= of_property_read_u32_array(np
, "battery,polling_time",
8028 pdata
->polling_time
, len
);
8030 pr_info("%s : battery,polling_time is Empty\n", __func__
);
8032 ret
= of_property_read_u32(np
, "battery,thermal_source",
8033 &pdata
->thermal_source
);
8035 pr_info("%s : Thermal source is Empty\n", __func__
);
8037 if (pdata
->thermal_source
== SEC_BATTERY_THERMAL_SOURCE_ADC
) {
8038 p
= of_get_property(np
, "battery,temp_table_adc", &len
);
8042 len
= len
/ sizeof(u32
);
8044 pdata
->temp_adc_table_size
= len
;
8045 pdata
->temp_amb_adc_table_size
= len
;
8047 pdata
->temp_adc_table
=
8048 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8049 pdata
->temp_adc_table_size
, GFP_KERNEL
);
8050 pdata
->temp_amb_adc_table
=
8051 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8052 pdata
->temp_adc_table_size
, GFP_KERNEL
);
8054 for(i
= 0; i
< pdata
->temp_adc_table_size
; i
++) {
8055 ret
= of_property_read_u32_index(np
,
8056 "battery,temp_table_adc", i
, &temp
);
8057 pdata
->temp_adc_table
[i
].adc
= (int)temp
;
8059 pr_info("%s : Temp_adc_table(adc) is Empty\n",
8062 ret
= of_property_read_u32_index(np
,
8063 "battery,temp_table_data", i
, &temp
);
8064 pdata
->temp_adc_table
[i
].data
= (int)temp
;
8066 pr_info("%s : Temp_adc_table(data) is Empty\n",
8069 ret
= of_property_read_u32_index(np
,
8070 "battery,temp_table_adc", i
, &temp
);
8071 pdata
->temp_amb_adc_table
[i
].adc
= (int)temp
;
8073 pr_info("%s : Temp_amb_adc_table(adc) is Empty\n",
8076 ret
= of_property_read_u32_index(np
,
8077 "battery,temp_table_data", i
, &temp
);
8078 pdata
->temp_amb_adc_table
[i
].data
= (int)temp
;
8080 pr_info("%s : Temp_amb_adc_table(data) is Empty\n",
8084 ret
= of_property_read_u32(np
, "battery,usb_thermal_source",
8085 &pdata
->usb_thermal_source
);
8087 pr_info("%s : usb_thermal_source is Empty\n", __func__
);
8089 if(pdata
->usb_thermal_source
) {
8090 p
= of_get_property(np
, "battery,usb_temp_table_adc", &len
);
8094 len
= len
/ sizeof(u32
);
8096 pdata
->usb_temp_adc_table_size
= len
;
8098 pdata
->usb_temp_adc_table
=
8099 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8100 pdata
->usb_temp_adc_table_size
, GFP_KERNEL
);
8102 for(i
= 0; i
< pdata
->usb_temp_adc_table_size
; i
++) {
8103 ret
= of_property_read_u32_index(np
,
8104 "battery,usb_temp_table_adc", i
, &temp
);
8105 pdata
->usb_temp_adc_table
[i
].adc
= (int)temp
;
8107 pr_info("%s : Usb_Temp_adc_table(adc) is Empty\n",
8110 ret
= of_property_read_u32_index(np
,
8111 "battery,usb_temp_table_data", i
, &temp
);
8112 pdata
->usb_temp_adc_table
[i
].data
= (int)temp
;
8114 pr_info("%s : Usb_Temp_adc_table(data) is Empty\n",
8119 ret
= of_property_read_u32(np
, "battery,chg_thermal_source",
8120 &pdata
->chg_thermal_source
);
8122 pr_info("%s : chg_thermal_source is Empty\n", __func__
);
8124 if(pdata
->chg_thermal_source
) {
8125 p
= of_get_property(np
, "battery,chg_temp_table_adc", &len
);
8129 len
= len
/ sizeof(u32
);
8131 pdata
->chg_temp_adc_table_size
= len
;
8133 pdata
->chg_temp_adc_table
=
8134 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8135 pdata
->chg_temp_adc_table_size
, GFP_KERNEL
);
8137 for(i
= 0; i
< pdata
->chg_temp_adc_table_size
; i
++) {
8138 ret
= of_property_read_u32_index(np
,
8139 "battery,chg_temp_table_adc", i
, &temp
);
8140 pdata
->chg_temp_adc_table
[i
].adc
= (int)temp
;
8142 pr_info("%s : CHG_Temp_adc_table(adc) is Empty\n",
8145 ret
= of_property_read_u32_index(np
,
8146 "battery,chg_temp_table_data", i
, &temp
);
8147 pdata
->chg_temp_adc_table
[i
].data
= (int)temp
;
8149 pr_info("%s : CHG_Temp_adc_table(data) is Empty\n",
8154 ret
= of_property_read_u32(np
, "battery,wpc_thermal_source",
8155 &pdata
->wpc_thermal_source
);
8157 pr_info("%s : wpc_thermal_source is Empty\n", __func__
);
8159 if(pdata
->wpc_thermal_source
) {
8160 p
= of_get_property(np
, "battery,wpc_temp_table_adc", &len
);
8162 pr_info("%s : wpc_temp_table_adc(adc) is Empty\n",__func__
);
8164 len
= len
/ sizeof(u32
);
8166 pdata
->wpc_temp_adc_table_size
= len
;
8168 pdata
->wpc_temp_adc_table
=
8169 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8170 pdata
->wpc_temp_adc_table_size
, GFP_KERNEL
);
8172 for(i
= 0; i
< pdata
->wpc_temp_adc_table_size
; i
++) {
8173 ret
= of_property_read_u32_index(np
,
8174 "battery,wpc_temp_table_adc", i
, &temp
);
8175 pdata
->wpc_temp_adc_table
[i
].adc
= (int)temp
;
8177 pr_info("%s : WPC_Temp_adc_table(adc) is Empty\n",
8180 ret
= of_property_read_u32_index(np
,
8181 "battery,wpc_temp_table_data", i
, &temp
);
8182 pdata
->wpc_temp_adc_table
[i
].data
= (int)temp
;
8184 pr_info("%s : WPC_Temp_adc_table(data) is Empty\n",
8190 ret
= of_property_read_u32(np
, "battery,coil_thermal_source",
8191 &pdata
->coil_thermal_source
);
8193 pr_info("%s : coil_thermal_source is Empty\n", __func__
);
8195 pr_info("%s : coil_thermal_source exists\n", __func__
);
8197 ret
= of_property_read_u32(np
, "battery,slave_thermal_source",
8198 &pdata
->slave_thermal_source
);
8200 pr_info("%s : slave_thermal_source is Empty\n", __func__
);
8202 if(pdata
->slave_thermal_source
) {
8203 p
= of_get_property(np
, "battery,slave_chg_temp_table_adc", &len
);
8207 len
= len
/ sizeof(u32
);
8209 pdata
->slave_chg_temp_adc_table_size
= len
;
8211 pdata
->slave_chg_temp_adc_table
=
8212 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8213 pdata
->slave_chg_temp_adc_table_size
, GFP_KERNEL
);
8215 for(i
= 0; i
< pdata
->slave_chg_temp_adc_table_size
; i
++) {
8216 ret
= of_property_read_u32_index(np
,
8217 "battery,slave_chg_temp_table_adc", i
, &temp
);
8218 pdata
->slave_chg_temp_adc_table
[i
].adc
= (int)temp
;
8220 pr_info("%s : slave_chg_temp_adc_table(adc) is Empty\n",
8223 ret
= of_property_read_u32_index(np
,
8224 "battery,slave_chg_temp_table_data", i
, &temp
);
8225 pdata
->slave_chg_temp_adc_table
[i
].data
= (int)temp
;
8227 pr_info("%s : slave_chg_temp_adc_table(data) is Empty\n",
8231 ret
= of_property_read_u32(np
, "battery,slave_chg_temp_check",
8232 &pdata
->slave_chg_temp_check
);
8234 pr_info("%s : slave_chg_temp_check is Empty\n", __func__
);
8236 ret
= of_property_read_u32(np
, "battery,chg_temp_check",
8237 &pdata
->chg_temp_check
);
8239 pr_info("%s : chg_temp_check is Empty\n", __func__
);
8241 if (pdata
->chg_temp_check
) {
8242 ret
= of_property_read_u32(np
, "battery,chg_12v_high_temp",
8244 pdata
->chg_12v_high_temp
= (int)temp
;
8246 pr_info("%s : chg_12v_high_temp is Empty\n", __func__
);
8248 ret
= of_property_read_u32(np
, "battery,chg_high_temp",
8250 pdata
->chg_high_temp
= (int)temp
;
8252 pr_info("%s : chg_high_temp is Empty\n", __func__
);
8254 ret
= of_property_read_u32(np
, "battery,chg_high_temp_recovery",
8256 pdata
->chg_high_temp_recovery
= (int)temp
;
8258 pr_info("%s : chg_temp_recovery is Empty\n", __func__
);
8260 ret
= of_property_read_u32(np
, "battery,chg_charging_limit_current",
8261 &pdata
->chg_charging_limit_current
);
8263 pr_info("%s : chg_charging_limit_current is Empty\n", __func__
);
8265 ret
= of_property_read_u32(np
, "battery,chg_input_limit_current",
8266 &pdata
->chg_input_limit_current
);
8268 pr_info("%s : chg_input_limit_current is Empty\n", __func__
);
8270 ret
= of_property_read_u32(np
, "battery,mix_high_temp",
8272 pdata
->mix_high_temp
= (int)temp
;
8274 pr_info("%s : mix_high_temp is Empty\n", __func__
);
8276 ret
= of_property_read_u32(np
, "battery,mix_high_chg_temp",
8278 pdata
->mix_high_chg_temp
= (int)temp
;
8280 pr_info("%s : mix_high_chg_temp is Empty\n", __func__
);
8282 ret
= of_property_read_u32(np
, "battery,mix_high_temp_recovery",
8284 pdata
->mix_high_temp_recovery
= (int)temp
;
8286 pr_info("%s : mix_high_temp_recovery is Empty\n", __func__
);
8289 ret
= of_property_read_u32(np
, "battery,wpc_temp_check",
8290 &pdata
->wpc_temp_check
);
8292 pr_info("%s : wpc_temp_check is Empty\n", __func__
);
8294 if (pdata
->wpc_temp_check
) {
8295 ret
= of_property_read_u32(np
, "battery,wpc_temp_control_source",
8296 &pdata
->wpc_temp_control_source
);
8298 pr_info("%s : wpc_temp_control_source is Empty\n", __func__
);
8299 pdata
->wpc_temp_control_source
= TEMP_CONTROL_SOURCE_CHG_THM
;
8302 ret
= of_property_read_u32(np
, "battery,wpc_temp_lcd_on_control_source",
8303 &pdata
->wpc_temp_lcd_on_control_source
);
8305 pr_info("%s : wpc_temp_lcd_on_control_source is Empty\n", __func__
);
8306 pdata
->wpc_temp_lcd_on_control_source
= TEMP_CONTROL_SOURCE_CHG_THM
;
8309 ret
= of_property_read_u32(np
, "battery,wpc_high_temp",
8310 &pdata
->wpc_high_temp
);
8312 pr_info("%s : wpc_high_temp is Empty\n", __func__
);
8314 ret
= of_property_read_u32(np
, "battery,wpc_high_temp_recovery",
8315 &pdata
->wpc_high_temp_recovery
);
8317 pr_info("%s : wpc_high_temp_recovery is Empty\n", __func__
);
8319 ret
= of_property_read_u32(np
, "battery,wpc_charging_limit_current",
8320 &pdata
->wpc_charging_limit_current
);
8322 pr_info("%s : wpc_charging_limit_current is Empty\n", __func__
);
8324 ret
= of_property_read_u32(np
, "battery,wpc_lcd_on_high_temp",
8325 &pdata
->wpc_lcd_on_high_temp
);
8327 pr_info("%s : wpc_lcd_on_high_temp is Empty\n", __func__
);
8329 ret
= of_property_read_u32(np
, "battery,wpc_lcd_on_high_temp_rec",
8330 &pdata
->wpc_lcd_on_high_temp_rec
);
8332 pr_info("%s : wpc_lcd_on_high_temp_rec is Empty\n", __func__
);
8334 ret
= of_property_read_u32(np
, "battery,wpc_lcd_on_charging_limit_current",
8335 &pdata
->wpc_lcd_on_charging_limit_current
);
8337 pr_info("%s : wpc_lcd_on_charging_limit_current is Empty\n", __func__
);
8338 pdata
->wpc_lcd_on_charging_limit_current
=
8339 pdata
->wpc_charging_limit_current
;
8343 ret
= of_property_read_u32(np
, "battery,wc_full_input_limit_current",
8344 &pdata
->wc_full_input_limit_current
);
8346 pr_info("%s : wc_full_input_limit_current is Empty\n", __func__
);
8348 ret
= of_property_read_u32(np
, "battery,wc_cv_current",
8349 &pdata
->wc_cv_current
);
8351 pr_info("%s : wc_cv_current is Empty\n", __func__
);
8352 pdata
->wc_cv_current
= 820;
8355 ret
= of_property_read_u32(np
, "battery,wc_cv_pack_current",
8356 &pdata
->wc_cv_pack_current
);
8358 pr_info("%s : wc_cv_pack_current is Empty\n", __func__
);
8359 pdata
->wc_cv_pack_current
= 500;
8362 ret
= of_property_read_u32(np
, "battery,wc_hero_stand_cc_cv",
8363 &pdata
->wc_hero_stand_cc_cv
);
8365 pr_info("%s : wc_hero_stand_cc_cv is Empty\n", __func__
);
8366 pdata
->wc_hero_stand_cc_cv
= 70;
8368 ret
= of_property_read_u32(np
, "battery,wc_hero_stand_cv_current",
8369 &pdata
->wc_hero_stand_cv_current
);
8371 pr_info("%s : wc_hero_stand_cv_current is Empty\n", __func__
);
8372 pdata
->wc_hero_stand_cv_current
= 600;
8374 ret
= of_property_read_u32(np
, "battery,wc_hero_stand_hv_cv_current",
8375 &pdata
->wc_hero_stand_hv_cv_current
);
8377 pr_info("%s : wc_hero_stand_hv_cv_current is Empty\n", __func__
);
8378 pdata
->wc_hero_stand_hv_cv_current
= 450;
8381 ret
= of_property_read_u32(np
, "battery,sleep_mode_limit_current",
8382 &pdata
->sleep_mode_limit_current
);
8384 pr_info("%s : sleep_mode_limit_current is Empty\n", __func__
);
8386 ret
= of_property_read_u32(np
, "battery,inbat_voltage",
8387 &pdata
->inbat_voltage
);
8389 pr_info("%s : inbat_voltage is Empty\n", __func__
);
8391 if (pdata
->inbat_voltage
) {
8392 p
= of_get_property(np
, "battery,inbat_voltage_table_adc", &len
);
8396 len
= len
/ sizeof(u32
);
8398 pdata
->inbat_adc_table_size
= len
;
8400 pdata
->inbat_adc_table
=
8401 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8402 pdata
->inbat_adc_table_size
, GFP_KERNEL
);
8404 for(i
= 0; i
< pdata
->inbat_adc_table_size
; i
++) {
8405 ret
= of_property_read_u32_index(np
,
8406 "battery,inbat_voltage_table_adc", i
, &temp
);
8407 pdata
->inbat_adc_table
[i
].adc
= (int)temp
;
8409 pr_info("%s : inbat_adc_table(adc) is Empty\n",
8412 ret
= of_property_read_u32_index(np
,
8413 "battery,inbat_voltage_table_data", i
, &temp
);
8414 pdata
->inbat_adc_table
[i
].data
= (int)temp
;
8416 pr_info("%s : inbat_adc_table(data) is Empty\n",
8421 ret
= of_property_read_u32(np
, "battery,pre_afc_input_current",
8422 &pdata
->pre_afc_input_current
);
8424 pr_info("%s : pre_afc_input_current is Empty\n", __func__
);
8425 pdata
->pre_afc_input_current
= 1000;
8428 ret
= of_property_read_u32(np
, "battery,pre_afc_work_delay",
8429 &pdata
->pre_afc_work_delay
);
8431 pr_info("%s : pre_afc_work_delay is Empty\n", __func__
);
8432 pdata
->pre_afc_work_delay
= 2000;
8435 ret
= of_property_read_u32(np
, "battery,pre_wc_afc_input_current",
8436 &pdata
->pre_wc_afc_input_current
);
8438 pr_info("%s : pre_wc_afc_input_current is Empty\n", __func__
);
8439 pdata
->pre_wc_afc_input_current
= 500; /* wc input default */
8442 ret
= of_property_read_u32(np
, "battery,pre_wc_afc_work_delay",
8443 &pdata
->pre_wc_afc_work_delay
);
8445 pr_info("%s : pre_wc_afc_work_delay is Empty\n", __func__
);
8446 pdata
->pre_wc_afc_work_delay
= 4000;
8449 ret
= of_property_read_u32(np
, "battery,adc_check_count",
8450 &pdata
->adc_check_count
);
8452 pr_info("%s : Adc check count is Empty\n", __func__
);
8454 ret
= of_property_read_u32(np
, "battery,temp_adc_type",
8455 &pdata
->temp_adc_type
);
8457 pr_info("%s : Temp adc type is Empty\n", __func__
);
8459 ret
= of_property_read_u32(np
, "battery,cable_check_type",
8460 &pdata
->cable_check_type
);
8462 pr_info("%s : Cable check type is Empty\n", __func__
);
8464 ret
= of_property_read_u32(np
, "battery,cable_source_type",
8465 &pdata
->cable_source_type
);
8467 pr_info("%s: Cable_source_type is Empty\n", __func__
);
8468 ret
= of_property_read_u32(np
, "battery,polling_type",
8469 &pdata
->polling_type
);
8471 pr_info("%s : Polling type is Empty\n", __func__
);
8473 ret
= of_property_read_u32(np
, "battery,monitor_initial_count",
8474 &pdata
->monitor_initial_count
);
8476 pr_info("%s : Monitor initial count is Empty\n", __func__
);
8478 ret
= of_property_read_u32(np
, "battery,battery_check_type",
8479 &pdata
->battery_check_type
);
8481 pr_info("%s : Battery check type is Empty\n", __func__
);
8483 ret
= of_property_read_u32(np
, "battery,check_count",
8484 &pdata
->check_count
);
8486 pr_info("%s : Check count is Empty\n", __func__
);
8488 ret
= of_property_read_u32(np
, "battery,check_adc_max",
8489 &pdata
->check_adc_max
);
8491 pr_info("%s : Check adc max is Empty\n", __func__
);
8493 ret
= of_property_read_u32(np
, "battery,check_adc_min",
8494 &pdata
->check_adc_min
);
8496 pr_info("%s : Check adc min is Empty\n", __func__
);
8498 ret
= of_property_read_u32(np
, "battery,ovp_uvlo_check_type",
8499 &pdata
->ovp_uvlo_check_type
);
8501 pr_info("%s : Ovp Uvlo check type is Empty\n", __func__
);
8503 ret
= of_property_read_u32(np
, "battery,temp_check_type",
8504 &pdata
->temp_check_type
);
8506 pr_info("%s : Temp check type is Empty\n", __func__
);
8508 ret
= of_property_read_u32(np
, "battery,temp_check_count",
8509 &pdata
->temp_check_count
);
8511 pr_info("%s : Temp check count is Empty\n", __func__
);
8513 ret
= of_property_read_u32(np
, "battery,temp_highlimit_threshold_normal",
8515 pdata
->temp_highlimit_threshold_normal
= (int)temp
;
8517 pr_info("%s : Temp highlimit threshold normal is Empty\n", __func__
);
8519 ret
= of_property_read_u32(np
, "battery,temp_highlimit_recovery_normal",
8521 pdata
->temp_highlimit_recovery_normal
= (int)temp
;
8523 pr_info("%s : Temp highlimit recovery normal is Empty\n", __func__
);
8525 ret
= of_property_read_u32(np
, "battery,temp_high_threshold_normal",
8527 pdata
->temp_high_threshold_normal
= (int)temp
;
8529 pr_info("%s : Temp high threshold normal is Empty\n", __func__
);
8531 ret
= of_property_read_u32(np
, "battery,temp_high_recovery_normal",
8533 pdata
->temp_high_recovery_normal
= (int)temp
;
8535 pr_info("%s : Temp high recovery normal is Empty\n", __func__
);
8537 ret
= of_property_read_u32(np
, "battery,temp_low_threshold_normal",
8539 pdata
->temp_low_threshold_normal
= (int)temp
;
8541 pr_info("%s : Temp low threshold normal is Empty\n", __func__
);
8543 ret
= of_property_read_u32(np
, "battery,temp_low_recovery_normal",
8545 pdata
->temp_low_recovery_normal
= (int)temp
;
8547 pr_info("%s : Temp low recovery normal is Empty\n", __func__
);
8549 ret
= of_property_read_u32(np
, "battery,temp_highlimit_threshold_lpm",
8551 pdata
->temp_highlimit_threshold_lpm
= (int)temp
;
8553 pr_info("%s : Temp highlimit threshold lpm is Empty\n", __func__
);
8555 ret
= of_property_read_u32(np
, "battery,temp_highlimit_recovery_lpm",
8557 pdata
->temp_highlimit_recovery_lpm
= (int)temp
;
8559 pr_info("%s : Temp highlimit recovery lpm is Empty\n", __func__
);
8561 ret
= of_property_read_u32(np
, "battery,temp_high_threshold_lpm",
8563 pdata
->temp_high_threshold_lpm
= (int)temp
;
8565 pr_info("%s : Temp high threshold lpm is Empty\n", __func__
);
8567 ret
= of_property_read_u32(np
, "battery,temp_high_recovery_lpm",
8569 pdata
->temp_high_recovery_lpm
= (int)temp
;
8571 pr_info("%s : Temp high recovery lpm is Empty\n", __func__
);
8573 ret
= of_property_read_u32(np
, "battery,temp_low_threshold_lpm",
8575 pdata
->temp_low_threshold_lpm
= (int)temp
;
8577 pr_info("%s : Temp low threshold lpm is Empty\n", __func__
);
8579 ret
= of_property_read_u32(np
, "battery,temp_low_recovery_lpm",
8581 pdata
->temp_low_recovery_lpm
= (int)temp
;
8583 pr_info("%s : Temp low recovery lpm is Empty\n", __func__
);
8585 pr_info("%s : HIGHLIMIT_THRESHOLD_NOLMAL(%d), HIGHLIMIT_RECOVERY_NORMAL(%d)\n"
8586 "HIGH_THRESHOLD_NORMAL(%d), HIGH_RECOVERY_NORMAL(%d) LOW_THRESHOLD_NORMAL(%d), LOW_RECOVERY_NORMAL(%d)\n"
8587 "HIGHLIMIT_THRESHOLD_LPM(%d), HIGHLIMIT_RECOVERY_LPM(%d)\n"
8588 "HIGH_THRESHOLD_LPM(%d), HIGH_RECOVERY_LPM(%d) LOW_THRESHOLD_LPM(%d), LOW_RECOVERY_LPM(%d)\n",
8590 pdata
->temp_highlimit_threshold_normal
, pdata
->temp_highlimit_recovery_normal
,
8591 pdata
->temp_high_threshold_normal
, pdata
->temp_high_recovery_normal
,
8592 pdata
->temp_low_threshold_normal
, pdata
->temp_low_recovery_normal
,
8593 pdata
->temp_highlimit_threshold_lpm
, pdata
->temp_highlimit_recovery_lpm
,
8594 pdata
->temp_high_threshold_lpm
, pdata
->temp_high_recovery_lpm
,
8595 pdata
->temp_low_threshold_lpm
, pdata
->temp_low_recovery_lpm
);
8597 ret
= of_property_read_u32(np
, "battery,wpc_high_threshold_normal",
8599 pdata
->wpc_high_threshold_normal
= (int)temp
;
8601 pr_info("%s : wpc_high_threshold_normal is Empty\n", __func__
);
8603 ret
= of_property_read_u32(np
, "battery,wpc_high_recovery_normal",
8605 pdata
->wpc_high_recovery_normal
= (int)temp
;
8607 pr_info("%s : wpc_high_recovery_normal is Empty\n", __func__
);
8609 ret
= of_property_read_u32(np
, "battery,wpc_low_threshold_normal",
8611 pdata
->wpc_low_threshold_normal
= (int)temp
;
8613 pr_info("%s : wpc_low_threshold_normal is Empty\n", __func__
);
8615 ret
= of_property_read_u32(np
, "battery,wpc_low_recovery_normal",
8617 pdata
->wpc_low_recovery_normal
= (int)temp
;
8619 pr_info("%s : wpc_low_recovery_normal is Empty\n", __func__
);
8621 ret
= of_property_read_u32(np
, "battery,full_check_type",
8622 &pdata
->full_check_type
);
8624 pr_info("%s : Full check type is Empty\n", __func__
);
8626 ret
= of_property_read_u32(np
, "battery,full_check_type_2nd",
8627 &pdata
->full_check_type_2nd
);
8629 pr_info("%s : Full check type 2nd is Empty\n", __func__
);
8631 ret
= of_property_read_u32(np
, "battery,full_check_count",
8632 &pdata
->full_check_count
);
8634 pr_info("%s : Full check count is Empty\n", __func__
);
8636 ret
= of_property_read_u32(np
, "battery,chg_gpio_full_check",
8637 &pdata
->chg_gpio_full_check
);
8639 pr_info("%s : Chg gpio full check is Empty\n", __func__
);
8641 ret
= of_property_read_u32(np
, "battery,chg_polarity_full_check",
8642 &pdata
->chg_polarity_full_check
);
8644 pr_info("%s : Chg polarity full check is Empty\n", __func__
);
8646 ret
= of_property_read_u32(np
, "battery,full_condition_type",
8647 &pdata
->full_condition_type
);
8649 pr_info("%s : Full condition type is Empty\n", __func__
);
8651 ret
= of_property_read_u32(np
, "battery,full_condition_soc",
8652 &pdata
->full_condition_soc
);
8654 pr_info("%s : Full condition soc is Empty\n", __func__
);
8656 ret
= of_property_read_u32(np
, "battery,full_condition_vcell",
8657 &pdata
->full_condition_vcell
);
8659 pr_info("%s : Full condition vcell is Empty\n", __func__
);
8661 ret
= of_property_read_u32(np
, "battery,recharge_check_count",
8662 &pdata
->recharge_check_count
);
8664 pr_info("%s : Recharge check count is Empty\n", __func__
);
8666 ret
= of_property_read_u32(np
, "battery,recharge_condition_type",
8667 &pdata
->recharge_condition_type
);
8669 pr_info("%s : Recharge condition type is Empty\n", __func__
);
8671 ret
= of_property_read_u32(np
, "battery,recharge_condition_soc",
8672 &pdata
->recharge_condition_soc
);
8674 pr_info("%s : Recharge condition soc is Empty\n", __func__
);
8676 ret
= of_property_read_u32(np
, "battery,recharge_condition_vcell",
8677 &pdata
->recharge_condition_vcell
);
8679 pr_info("%s : Recharge condition vcell is Empty\n", __func__
);
8681 ret
= of_property_read_u32(np
, "battery,charging_total_time",
8682 (unsigned int *)&pdata
->charging_total_time
);
8684 pr_info("%s : Charging total time is Empty\n", __func__
);
8686 ret
= of_property_read_u32(np
, "battery,hv_charging_total_time",
8687 &pdata
->hv_charging_total_time
);
8689 pdata
->hv_charging_total_time
= 3 * 60 * 60;
8690 pr_info("%s : HV Charging total time is %d\n",
8691 __func__
, pdata
->hv_charging_total_time
);
8694 ret
= of_property_read_u32(np
, "battery,normal_charging_total_time",
8695 &pdata
->normal_charging_total_time
);
8697 pdata
->normal_charging_total_time
= 5 * 60 * 60;
8698 pr_info("%s : Normal(WC) Charging total time is %d\n",
8699 __func__
, pdata
->normal_charging_total_time
);
8702 ret
= of_property_read_u32(np
, "battery,usb_charging_total_time",
8703 &pdata
->usb_charging_total_time
);
8705 pdata
->usb_charging_total_time
= 10 * 60 * 60;
8706 pr_info("%s : USB Charging total time is %d\n",
8707 __func__
, pdata
->usb_charging_total_time
);
8710 ret
= of_property_read_u32(np
, "battery,recharging_total_time",
8711 (unsigned int *)&pdata
->recharging_total_time
);
8713 pr_info("%s : Recharging total time is Empty\n", __func__
);
8715 ret
= of_property_read_u32(np
, "battery,charging_reset_time",
8716 (unsigned int *)&pdata
->charging_reset_time
);
8718 pr_info("%s : Charging reset time is Empty\n", __func__
);
8720 ret
= of_property_read_u32(np
, "battery,charging_reset_time",
8721 (unsigned int *)&pdata
->charging_reset_time
);
8723 pr_info("%s : Charging reset time is Empty\n", __func__
);
8725 ret
= of_property_read_u32(np
, "battery,chg_float_voltage",
8726 (unsigned int *)&pdata
->chg_float_voltage
);
8728 pr_info("%s: chg_float_voltage is Empty\n", __func__
);
8729 pdata
->chg_float_voltage
= 43500;
8732 ret
= of_property_read_u32(np
, "battery,chg_float_voltage_conv",
8733 &pdata
->chg_float_voltage_conv
);
8735 pr_info("%s: chg_float_voltage_conv is Empty\n", __func__
);
8736 pdata
->chg_float_voltage_conv
= 1;
8739 ret
= of_property_read_u32(np
, "battery,wa_volt_recov",
8740 (unsigned int *)&pdata
->wa_volt_recov
);
8742 pdata
->wa_volt_recov
= 4090;
8743 pr_info("%s: wa volt recov is Empty\n", __func__
);
8746 ret
= of_property_read_u32(np
, "battery,wa_volt_thr",
8747 (unsigned int *)&pdata
->wa_volt_thr
);
8749 pdata
->wa_volt_thr
= 4100;
8750 pr_info("%s: wa volt thr is Empty\n", __func__
);
8753 ret
= of_property_read_u32(np
, "battery,wa_float_voltage",
8754 (unsigned int *)&pdata
->wa_float_voltage
);
8756 pdata
->wa_float_voltage
= 40500;
8757 pr_info("%s: wa float voltage is Empty\n", __func__
);
8760 ret
= of_property_read_u32(np
, "battery,wa_fl_check_count",
8761 &pdata
->wa_fl_check_count
);
8763 pdata
->wa_fl_check_count
= 3;
8764 pr_info("%s : swelling fl check count is Empty\n", __func__
);
8767 #if defined(CONFIG_BATTERY_SWELLING)
8768 ret
= of_property_read_u32(np
, "battery,chg_float_voltage",
8769 (unsigned int *)&pdata
->swelling_normal_float_voltage
);
8771 pr_info("%s: chg_float_voltage is Empty\n", __func__
);
8773 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_block",
8775 pdata
->swelling_high_temp_block
= (int)temp
;
8777 pr_info("%s: swelling high temp block is Empty\n", __func__
);
8779 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_recov",
8781 pdata
->swelling_high_temp_recov
= (int)temp
;
8783 pr_info("%s: swelling high temp recovery is Empty\n", __func__
);
8785 ret
= of_property_read_u32(np
, "battery,swelling_wc_high_temp_recov",
8787 pdata
->swelling_wc_high_temp_recov
= (int)temp
;
8789 pdata
->swelling_wc_high_temp_recov
= pdata
->swelling_high_temp_recov
;
8790 pr_info("%s: swelling wireless high temp recovery is %d\n", __func__
, pdata
->swelling_wc_high_temp_recov
);
8793 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_block_1st",
8795 pdata
->swelling_low_temp_block_1st
= (int)temp
;
8797 pr_info("%s: swelling low temp block is Empty\n", __func__
);
8799 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_recov_1st",
8801 pdata
->swelling_low_temp_recov_1st
= (int)temp
;
8803 pr_info("%s: swelling low temp recovery is Empty\n", __func__
);
8805 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_block_2nd",
8807 pdata
->swelling_low_temp_block_2nd
= (int)temp
;
8809 pr_info("%s: swelling low temp block is Empty\n", __func__
);
8811 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_recov_2nd",
8813 pdata
->swelling_low_temp_recov_2nd
= (int)temp
;
8815 pr_info("%s: swelling low temp recovery 2nd is Empty\n", __func__
);
8817 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_current",
8818 &pdata
->swelling_low_temp_current
);
8820 pr_info("%s: swelling_low_temp_current is Empty, Defualt value 600mA \n", __func__
);
8821 pdata
->swelling_low_temp_current
= 600;
8824 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_topoff",
8825 &pdata
->swelling_low_temp_topoff
);
8827 pr_info("%s: swelling_low_temp_topoff is Empty, Defualt value 200mA \n", __func__
);
8828 pdata
->swelling_low_temp_topoff
= 200;
8831 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_current",
8832 &pdata
->swelling_high_temp_current
);
8834 pr_info("%s: swelling_low_temp_current is Empty, Defualt value 1300mA \n", __func__
);
8835 pdata
->swelling_high_temp_current
= 1300;
8838 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_topoff",
8839 &pdata
->swelling_high_temp_topoff
);
8841 pr_info("%s: swelling_high_temp_topoff is Empty, Defualt value 200mA \n", __func__
);
8842 pdata
->swelling_high_temp_topoff
= 200;
8845 ret
= of_property_read_u32(np
, "battery,swelling_wc_high_temp_current",
8846 &pdata
->swelling_wc_high_temp_current
);
8848 pr_info("%s: swelling_wc_high_temp_current is Empty, Defualt value 600mA \n", __func__
);
8849 pdata
->swelling_low_temp_current
= 600;
8852 ret
= of_property_read_u32(np
, "battery,swelling_wc_low_temp_current",
8853 &pdata
->swelling_wc_low_temp_current
);
8855 pr_info("%s: swelling_wc_low_temp_current is Empty, Defualt value 600mA \n", __func__
);
8856 pdata
->swelling_low_temp_current
= 600;
8859 ret
= of_property_read_u32(np
, "battery,swelling_drop_float_voltage",
8860 (unsigned int *)&pdata
->swelling_drop_float_voltage
);
8862 pr_info("%s: swelling drop float voltage is Empty, Default value 4250mV \n", __func__
);
8863 pdata
->swelling_drop_float_voltage
= 4250;
8864 pdata
->swelling_drop_voltage_condition
= 4250;
8866 pdata
->swelling_drop_voltage_condition
= (pdata
->swelling_drop_float_voltage
> 10000) ?
8867 (pdata
->swelling_drop_float_voltage
/ 10) : (pdata
->swelling_drop_float_voltage
);
8868 pr_info("%s : swelling drop voltage(set : %d, condition : %d)\n", __func__
,
8869 pdata
->swelling_drop_float_voltage
, pdata
->swelling_drop_voltage_condition
);
8872 ret
= of_property_read_u32(np
, "battery,swelling_high_rechg_voltage",
8873 (unsigned int *)&pdata
->swelling_high_rechg_voltage
);
8875 pr_info("%s: swelling_high_rechg_voltage is Empty\n", __func__
);
8876 pdata
->swelling_high_rechg_voltage
= 4150;
8879 ret
= of_property_read_u32(np
, "battery,swelling_low_rechg_voltage",
8880 (unsigned int *)&pdata
->swelling_low_rechg_voltage
);
8882 pr_info("%s: swelling_low_rechg_voltage is Empty\n", __func__
);
8883 pdata
->swelling_low_rechg_voltage
= 4000;
8886 pr_info("%s : SWELLING_HIGH_TEMP(%d) SWELLING_HIGH_TEMP_RECOVERY(%d)\n"
8887 "SWELLING_LOW_TEMP_1st(%d) SWELLING_LOW_TEMP_RECOVERY_1st(%d) "
8888 "SWELLING_LOW_TEMP_2nd(%d) SWELLING_LOW_TEMP_RECOVERY_2nd(%d) "
8889 "SWELLING_LOW_CURRENT(%d, %d), SWELLING_HIGH_CURRENT(%d, %d)\n"
8890 "SWELLING_LOW_RCHG_VOL(%d), SWELLING_HIGH_RCHG_VOL(%d)\n",
8891 __func__
, pdata
->swelling_high_temp_block
, pdata
->swelling_high_temp_recov
,
8892 pdata
->swelling_low_temp_block_1st
, pdata
->swelling_low_temp_recov_1st
,
8893 pdata
->swelling_low_temp_block_2nd
, pdata
->swelling_low_temp_recov_2nd
,
8894 pdata
->swelling_low_temp_current
, pdata
->swelling_low_temp_topoff
,
8895 pdata
->swelling_high_temp_current
, pdata
->swelling_high_temp_topoff
,
8896 pdata
->swelling_low_rechg_voltage
, pdata
->swelling_high_rechg_voltage
);
8899 #if defined(CONFIG_CALC_TIME_TO_FULL)
8900 ret
= of_property_read_u32(np
, "battery,ttf_hv_12v_charge_current",
8901 &pdata
->ttf_hv_12v_charge_current
);
8903 pdata
->ttf_hv_12v_charge_current
=
8904 pdata
->charging_current
[SEC_BATTERY_CABLE_12V_TA
].fast_charging_current
;
8905 pr_info("%s: ttf_hv_12v_charge_current is Empty, Defualt value %d \n",
8906 __func__
, pdata
->ttf_hv_12v_charge_current
);
8908 ret
= of_property_read_u32(np
, "battery,ttf_hv_charge_current",
8909 &pdata
->ttf_hv_charge_current
);
8911 pdata
->ttf_hv_charge_current
=
8912 pdata
->charging_current
[SEC_BATTERY_CABLE_9V_TA
].fast_charging_current
;
8913 pr_info("%s: ttf_hv_charge_current is Empty, Defualt value %d \n",
8914 __func__
, pdata
->ttf_hv_charge_current
);
8917 ret
= of_property_read_u32(np
, "battery,ttf_hv_wireless_charge_current",
8918 &pdata
->ttf_hv_wireless_charge_current
);
8920 pr_info("%s: ttf_hv_wireless_charge_current is Empty, Defualt value 0 \n", __func__
);
8921 pdata
->ttf_hv_wireless_charge_current
=
8922 pdata
->charging_current
[SEC_BATTERY_CABLE_HV_WIRELESS
].fast_charging_current
- 300;
8925 ret
= of_property_read_u32(np
, "battery,ttf_wireless_charge_current",
8926 &pdata
->ttf_wireless_charge_current
);
8928 pr_info("%s: ttf_wireless_charge_current is Empty, Defualt value 0 \n", __func__
);
8929 pdata
->ttf_wireless_charge_current
=
8930 pdata
->charging_current
[SEC_BATTERY_CABLE_WIRELESS
].input_current_limit
;
8934 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
8936 ret
= pdata
->wpc_det
= of_get_named_gpio(np
, "battery,wpc_det", 0);
8938 pr_info("%s : can't get wpc_det\n", __func__
);
8943 ret
= pdata
->wpc_en
= of_get_named_gpio(np
, "battery,wpc_en", 0);
8945 pr_info("%s : can't get wpc_en\n", __func__
);
8948 #if defined(CONFIG_BATTERY_AGE_FORECAST)
8949 p
= of_get_property(np
, "battery,age_data", &len
);
8951 battery
->pdata
->num_age_step
= len
/ sizeof(sec_age_data_t
);
8952 battery
->pdata
->age_data
= kzalloc(len
, GFP_KERNEL
);
8953 ret
= of_property_read_u32_array(np
, "battery,age_data",
8954 (u32
*)battery
->pdata
->age_data
, len
/sizeof(u32
));
8956 pr_err("%s failed to read battery->pdata->age_data: %d\n",
8958 kfree(battery
->pdata
->age_data
);
8959 battery
->pdata
->age_data
= NULL
;
8960 battery
->pdata
->num_age_step
= 0;
8962 pr_err("%s num_age_step : %d\n", __func__
, battery
->pdata
->num_age_step
);
8963 for (len
= 0; len
< battery
->pdata
->num_age_step
; ++len
) {
8964 pr_err("[%d/%d]cycle:%d, float:%d, full_v:%d, recharge_v:%d, soc:%d\n",
8965 len
, battery
->pdata
->num_age_step
-1,
8966 battery
->pdata
->age_data
[len
].cycle
,
8967 battery
->pdata
->age_data
[len
].float_voltage
,
8968 battery
->pdata
->age_data
[len
].full_condition_vcell
,
8969 battery
->pdata
->age_data
[len
].recharge_condition_vcell
,
8970 battery
->pdata
->age_data
[len
].full_condition_soc
);
8973 battery
->pdata
->num_age_step
= 0;
8974 pr_err("%s there is not age_data\n", __func__
);
8978 ret
= of_property_read_u32(np
, "battery,siop_input_limit_current",
8979 &pdata
->siop_input_limit_current
);
8981 pdata
->siop_input_limit_current
= SIOP_INPUT_LIMIT_CURRENT
;
8983 ret
= of_property_read_u32(np
, "battery,siop_charging_limit_current",
8984 &pdata
->siop_charging_limit_current
);
8986 pdata
->siop_charging_limit_current
= SIOP_CHARGING_LIMIT_CURRENT
;
8988 ret
= of_property_read_u32(np
, "battery,siop_hv_12v_input_limit_current",
8989 &pdata
->siop_hv_12v_input_limit_current
);
8991 pdata
->siop_hv_12v_input_limit_current
= SIOP_HV_12V_INPUT_LIMIT_CURRENT
;
8993 ret
= of_property_read_u32(np
, "battery,siop_hv_12v_charging_limit_current",
8994 &pdata
->siop_hv_12v_charging_limit_current
);
8996 pdata
->siop_hv_12v_charging_limit_current
= SIOP_HV_12V_CHARGING_LIMIT_CURRENT
;
8998 ret
= of_property_read_u32(np
, "battery,siop_hv_input_limit_current",
8999 &pdata
->siop_hv_input_limit_current
);
9001 pdata
->siop_hv_input_limit_current
= SIOP_HV_INPUT_LIMIT_CURRENT
;
9003 ret
= of_property_read_u32(np
, "battery,siop_hv_charging_limit_current",
9004 &pdata
->siop_hv_charging_limit_current
);
9006 pdata
->siop_hv_charging_limit_current
= SIOP_HV_CHARGING_LIMIT_CURRENT
;
9008 ret
= of_property_read_u32(np
, "battery,siop_wireless_input_limit_current",
9009 &pdata
->siop_wireless_input_limit_current
);
9011 pdata
->siop_wireless_input_limit_current
= SIOP_WIRELESS_INPUT_LIMIT_CURRENT
;
9013 ret
= of_property_read_u32(np
, "battery,siop_wireless_charging_limit_current",
9014 &pdata
->siop_wireless_charging_limit_current
);
9016 pdata
->siop_wireless_charging_limit_current
= SIOP_WIRELESS_CHARGING_LIMIT_CURRENT
;
9018 ret
= of_property_read_u32(np
, "battery,siop_hv_wireless_input_limit_current",
9019 &pdata
->siop_hv_wireless_input_limit_current
);
9021 pdata
->siop_hv_wireless_input_limit_current
= SIOP_HV_WIRELESS_INPUT_LIMIT_CURRENT
;
9023 ret
= of_property_read_u32(np
, "battery,siop_hv_wireless_charging_limit_current",
9024 &pdata
->siop_hv_wireless_charging_limit_current
);
9026 pdata
->siop_hv_wireless_charging_limit_current
= SIOP_HV_WIRELESS_CHARGING_LIMIT_CURRENT
;
9028 ret
= of_property_read_u32(np
, "battery,max_input_voltage",
9029 &pdata
->max_input_voltage
);
9031 pdata
->max_input_voltage
= 12000;
9033 ret
= of_property_read_u32(np
, "battery,max_input_current",
9034 &pdata
->max_input_current
);
9036 pdata
->max_input_current
= 3000;
9038 ret
= of_property_read_u32(np
, "battery,pd_charging_charge_power",
9039 &pdata
->pd_charging_charge_power
);
9041 pr_err("%s: pd_charging_charge_power is Empty\n", __func__
);
9042 pdata
->pd_charging_charge_power
= 15000;
9045 ret
= of_property_read_u32(np
, "battery,nv_charge_power",
9046 &pdata
->nv_charge_power
);
9048 pr_err("%s: nv_charge_power is Empty\n", __func__
);
9049 pdata
->nv_charge_power
=
9050 SEC_INPUT_VOLTAGE_5V
* pdata
->default_input_current
;
9053 pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
9054 "cable_source_type : %d, event_waiting_time : %d\n"
9055 "polling_type : %d, initial_count : %d, check_count : %d\n"
9056 "check_adc_max : %d, check_adc_min : %d\n"
9057 "ovp_uvlo_check_type : %d, thermal_source : %d\n"
9058 "temp_check_type : %d, temp_check_count : %d, nv_charge_power : %d\n",
9060 pdata
->vendor
, pdata
->technology
,pdata
->cable_check_type
,
9061 pdata
->cable_source_type
, pdata
->event_waiting_time
,
9062 pdata
->polling_type
, pdata
->monitor_initial_count
,
9063 pdata
->check_count
, pdata
->check_adc_max
, pdata
->check_adc_min
,
9064 pdata
->ovp_uvlo_check_type
, pdata
->thermal_source
,
9065 pdata
->temp_check_type
, pdata
->temp_check_count
, pdata
->nv_charge_power
);
9067 #if defined(CONFIG_STEP_CHARGING)
9068 sec_step_charging_init(battery
, dev
);
9070 ret
= of_property_read_u32(np
, "battery,max_charging_current",
9071 &pdata
->max_charging_current
);
9073 pr_err("%s: max_charging_current is Empty\n", __func__
);
9074 pdata
->max_charging_current
= 3000;
9081 static void sec_bat_parse_mode_dt(struct sec_battery_info
*battery
)
9083 struct device_node
*np
;
9084 sec_battery_platform_data_t
*pdata
= battery
->pdata
;
9088 np
= of_find_node_by_name(NULL
, "battery");
9090 pr_err("%s np NULL\n", __func__
);
9094 if (battery
->store_mode
) {
9095 ret
= of_property_read_u32(np
, "battery,store_mode_afc_input_current",
9096 &pdata
->store_mode_afc_input_current
);
9098 pr_info("%s : store_mode_afc_input_current is Empty\n", __func__
);
9099 pdata
->store_mode_afc_input_current
= 440;
9102 ret
= of_property_read_u32(np
, "battery,store_mode_hv_wireless_input_current",
9103 &pdata
->store_mode_hv_wireless_input_current
);
9105 pr_info("%s : store_mode_hv_wireless_input_current is Empty\n", __func__
);
9106 pdata
->store_mode_hv_wireless_input_current
= 400;
9109 if (pdata
->wpc_temp_check
) {
9110 ret
= of_property_read_u32(np
, "battery,wpc_store_high_temp",
9113 pdata
->wpc_high_temp
= temp
;
9115 ret
= of_property_read_u32(np
, "battery,wpc_store_high_temp_recovery",
9118 pdata
->wpc_high_temp_recovery
= temp
;
9120 ret
= of_property_read_u32(np
, "battery,wpc_store_charging_limit_current",
9123 pdata
->wpc_charging_limit_current
= temp
;
9125 ret
= of_property_read_u32(np
, "battery,wpc_store_lcd_on_high_temp",
9128 pdata
->wpc_lcd_on_high_temp
= (int)temp
;
9130 ret
= of_property_read_u32(np
, "battery,wpc_store_lcd_on_high_temp_rec",
9133 pdata
->wpc_lcd_on_high_temp_rec
= (int)temp
;
9135 pr_info("%s: update store_mode - wpc high_temp(t:%d, r:%d), lcd_on_high_temp(t:%d, r:%d), curr(%d)\n",
9137 pdata
->wpc_high_temp
, pdata
->wpc_high_temp_recovery
,
9138 pdata
->wpc_lcd_on_high_temp
, pdata
->wpc_lcd_on_high_temp_rec
,
9139 pdata
->wpc_charging_limit_current
);
9142 ret
= of_property_read_u32(np
, "battery,siop_store_hv_wireless_input_limit_current",
9145 pdata
->siop_hv_wireless_input_limit_current
= temp
;
9147 pdata
->siop_hv_wireless_input_limit_current
= SIOP_STORE_HV_WIRELESS_CHARGING_LIMIT_CURRENT
;
9148 pr_info("%s: update siop_hv_wireless_input_limit_current(%d)\n",
9149 __func__
, pdata
->siop_hv_wireless_input_limit_current
);
9153 static void sec_bat_parse_mode_dt_work(struct work_struct
*work
)
9155 struct sec_battery_info
*battery
= container_of(work
,
9156 struct sec_battery_info
, parse_mode_dt_work
.work
);
9158 sec_bat_parse_mode_dt(battery
);
9160 if (is_hv_wire_type(battery
->cable_type
) ||
9161 is_hv_wireless_type(battery
->cable_type
)) {
9162 sec_bat_set_charging_current(battery
);
9165 wake_unlock(&battery
->parse_mode_dt_wake_lock
);
9170 extern sec_battery_platform_data_t sec_battery_pdata
;
9173 #if !defined(CONFIG_MUIC_NOTIFIER)
9174 static void cable_initial_check(struct sec_battery_info
*battery
)
9176 union power_supply_propval value
;
9178 pr_info("%s : current_cable_type : (%d)\n", __func__
, battery
->cable_type
);
9180 if (SEC_BATTERY_CABLE_NONE
!= battery
->cable_type
) {
9181 if (battery
->cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
9182 value
.intval
= battery
->cable_type
;
9183 psy_do_property("ps", set
,
9184 POWER_SUPPLY_PROP_ONLINE
, value
);
9186 value
.intval
= battery
->cable_type
;
9187 psy_do_property("battery", set
,
9188 POWER_SUPPLY_PROP_ONLINE
, value
);
9191 psy_do_property(battery
->pdata
->charger_name
, get
,
9192 POWER_SUPPLY_PROP_ONLINE
, value
);
9193 if (value
.intval
== SEC_BATTERY_CABLE_WIRELESS
) {
9195 psy_do_property("wireless", set
,
9196 POWER_SUPPLY_PROP_ONLINE
, value
);
9202 static void sec_bat_init_chg_work(struct work_struct
*work
)
9204 struct sec_battery_info
*battery
= container_of(work
,
9205 struct sec_battery_info
, init_chg_work
.work
);
9207 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
&&
9208 !(battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
)) {
9209 pr_info("%s: disable charging\n", __func__
);
9210 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
9214 static const struct power_supply_desc battery_power_supply_desc
= {
9216 .type
= POWER_SUPPLY_TYPE_BATTERY
,
9217 .properties
= sec_battery_props
,
9218 .num_properties
= ARRAY_SIZE(sec_battery_props
),
9219 .get_property
= sec_bat_get_property
,
9220 .set_property
= sec_bat_set_property
,
9223 static const struct power_supply_desc usb_power_supply_desc
= {
9225 .type
= POWER_SUPPLY_TYPE_USB
,
9226 .properties
= sec_power_props
,
9227 .num_properties
= ARRAY_SIZE(sec_power_props
),
9228 .get_property
= sec_usb_get_property
,
9231 static const struct power_supply_desc ac_power_supply_desc
= {
9233 .type
= POWER_SUPPLY_TYPE_MAINS
,
9234 .properties
= sec_ac_props
,
9235 .num_properties
= ARRAY_SIZE(sec_ac_props
),
9236 .get_property
= sec_ac_get_property
,
9239 static const struct power_supply_desc wireless_power_supply_desc
= {
9241 .type
= POWER_SUPPLY_TYPE_WIRELESS
,
9242 .properties
= sec_wireless_props
,
9243 .num_properties
= ARRAY_SIZE(sec_wireless_props
),
9244 .get_property
= sec_wireless_get_property
,
9245 .set_property
= sec_wireless_set_property
,
9248 static const struct power_supply_desc ps_power_supply_desc
= {
9250 .type
= POWER_SUPPLY_TYPE_POWER_SHARING
,
9251 .properties
= sec_ps_props
,
9252 .num_properties
= ARRAY_SIZE(sec_ps_props
),
9253 .get_property
= sec_ps_get_property
,
9254 .set_property
= sec_ps_set_property
,
9257 static int sec_battery_probe(struct platform_device
*pdev
)
9259 sec_battery_platform_data_t
*pdata
= NULL
;
9260 struct sec_battery_info
*battery
;
9261 struct power_supply_config battery_cfg
= {};
9268 union power_supply_propval value
= {0, };
9270 dev_info(&pdev
->dev
,
9271 "%s: SEC Battery Driver Loading\n", __func__
);
9273 battery
= kzalloc(sizeof(*battery
), GFP_KERNEL
);
9277 if (pdev
->dev
.of_node
) {
9278 pdata
= devm_kzalloc(&pdev
->dev
,
9279 sizeof(sec_battery_platform_data_t
),
9282 dev_err(&pdev
->dev
, "Failed to allocate memory\n");
9287 battery
->pdata
= pdata
;
9289 if (sec_bat_parse_dt(&pdev
->dev
, battery
)) {
9291 "%s: Failed to get battery dt\n", __func__
);
9296 pdata
= dev_get_platdata(&pdev
->dev
);
9297 battery
->pdata
= pdata
;
9300 platform_set_drvdata(pdev
, battery
);
9302 battery
->dev
= &pdev
->dev
;
9304 mutex_init(&battery
->adclock
);
9305 mutex_init(&battery
->iolock
);
9306 mutex_init(&battery
->misclock
);
9307 mutex_init(&battery
->batt_handlelock
);
9308 mutex_init(&battery
->current_eventlock
);
9309 mutex_init(&battery
->typec_notylock
);
9310 mutex_init(&battery
->wclock
);
9311 #if defined(CONFIG_BATTERY_SBM_DATA)
9312 mutex_init(&battery
->sbmlock
);
9313 sec_bat_init_sbm(battery
);
9316 dev_dbg(battery
->dev
, "%s: ADC init\n", __func__
);
9319 adc_init(pdev
, battery
);
9321 for (i
= 0; i
< SEC_BAT_ADC_CHANNEL_NUM
; i
++)
9322 adc_init(pdev
, pdata
, i
);
9324 wake_lock_init(&battery
->monitor_wake_lock
, WAKE_LOCK_SUSPEND
,
9325 "sec-battery-monitor");
9326 wake_lock_init(&battery
->cable_wake_lock
, WAKE_LOCK_SUSPEND
,
9327 "sec-battery-cable");
9328 wake_lock_init(&battery
->vbus_wake_lock
, WAKE_LOCK_SUSPEND
,
9329 "sec-battery-vbus");
9330 wake_lock_init(&battery
->afc_wake_lock
, WAKE_LOCK_SUSPEND
,
9332 wake_lock_init(&battery
->siop_level_wake_lock
, WAKE_LOCK_SUSPEND
,
9333 "sec-battery-siop_level");
9334 wake_lock_init(&battery
->ext_event_wake_lock
, WAKE_LOCK_SUSPEND
,
9335 "sec-battery-ext_event");
9336 wake_lock_init(&battery
->wc_headroom_wake_lock
, WAKE_LOCK_SUSPEND
,
9337 "sec-battery-wc_headroom");
9338 #if defined(CONFIG_UPDATE_BATTERY_DATA)
9339 wake_lock_init(&battery
->batt_data_wake_lock
, WAKE_LOCK_SUSPEND
,
9340 "sec-battery-update-data");
9342 wake_lock_init(&battery
->misc_event_wake_lock
, WAKE_LOCK_SUSPEND
,
9343 "sec-battery-misc-event");
9345 wake_lock_init(&battery
->parse_mode_dt_wake_lock
, WAKE_LOCK_SUSPEND
,
9346 "sec-battery-parse_mode_dt");
9349 /* initialization of battery info */
9350 sec_bat_set_charging_status(battery
,
9351 POWER_SUPPLY_STATUS_DISCHARGING
);
9352 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
9353 battery
->present
= true;
9354 battery
->is_jig_on
= false;
9355 battery
->wdt_kick_disable
= 0;
9357 battery
->polling_count
= 1; /* initial value = 1 */
9358 battery
->polling_time
= pdata
->polling_time
[
9359 SEC_BATTERY_POLLING_TIME_DISCHARGING
];
9360 battery
->polling_in_sleep
= false;
9361 battery
->polling_short
= false;
9363 battery
->check_count
= 0;
9364 battery
->check_adc_count
= 0;
9365 battery
->check_adc_value
= 0;
9367 battery
->input_current
= 0;
9368 battery
->charging_current
= 0;
9369 battery
->topoff_current
= 0;
9370 battery
->wpc_vout_level
= WIRELESS_VOUT_10V
;
9371 battery
->charging_start_time
= 0;
9372 battery
->charging_passed_time
= 0;
9373 battery
->wc_heating_start_time
= 0;
9374 battery
->wc_heating_passed_time
= 0;
9375 battery
->charging_next_time
= 0;
9376 battery
->charging_fullcharged_time
= 0;
9377 battery
->siop_level
= 100;
9378 battery
->ext_event
= BATT_EXT_EVENT_NONE
;
9379 battery
->wc_enable
= 1;
9380 battery
->wc_enable_cnt
= 0;
9381 battery
->wc_enable_cnt_value
= 3;
9382 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
9383 battery
->stability_test
= 0;
9384 battery
->eng_not_full_status
= 0;
9385 battery
->temperature_test_battery
= 0x7FFF;
9386 battery
->temperature_test_usb
= 0x7FFF;
9387 battery
->temperature_test_wpc
= 0x7FFF;
9388 battery
->temperature_test_chg
= 0x7FFF;
9390 battery
->ps_enable
= false;
9391 battery
->wc_status
= SEC_WIRELESS_PAD_NONE
;
9392 battery
->wc_cv_mode
= false;
9393 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
9395 #if defined(CONFIG_BATTERY_SWELLING)
9396 battery
->swelling_mode
= SWELLING_MODE_NONE
;
9398 battery
->charging_block
= false;
9399 battery
->chg_limit
= false;
9400 battery
->mix_limit
= false;
9401 battery
->vbus_limit
= false;
9402 battery
->usb_temp
= 0;
9403 #if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
9404 battery
->cooldown_mode
= true;
9406 battery
->skip_swelling
= false;
9407 battery
->led_cover
= 0;
9408 battery
->wa_float_cnt
= 0;
9409 battery
->wc_rx_phm_mode
= false;
9411 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_100MA
, SEC_BAT_CURRENT_EVENT_USB_100MA
);
9414 battery
->temp_highlimit_threshold
=
9415 battery
->pdata
->temp_highlimit_threshold_lpm
;
9416 battery
->temp_highlimit_recovery
=
9417 battery
->pdata
->temp_highlimit_recovery_lpm
;
9418 battery
->temp_high_threshold
=
9419 battery
->pdata
->temp_high_threshold_lpm
;
9420 battery
->temp_high_recovery
=
9421 battery
->pdata
->temp_high_recovery_lpm
;
9422 battery
->temp_low_recovery
=
9423 battery
->pdata
->temp_low_recovery_lpm
;
9424 battery
->temp_low_threshold
=
9425 battery
->pdata
->temp_low_threshold_lpm
;
9427 battery
->temp_highlimit_threshold
=
9428 battery
->pdata
->temp_highlimit_threshold_normal
;
9429 battery
->temp_highlimit_recovery
=
9430 battery
->pdata
->temp_highlimit_recovery_normal
;
9431 battery
->temp_high_threshold
=
9432 battery
->pdata
->temp_high_threshold_normal
;
9433 battery
->temp_high_recovery
=
9434 battery
->pdata
->temp_high_recovery_normal
;
9435 battery
->temp_low_recovery
=
9436 battery
->pdata
->temp_low_recovery_normal
;
9437 battery
->temp_low_threshold
=
9438 battery
->pdata
->temp_low_threshold_normal
;
9441 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
9442 battery
->is_recharging
= false;
9443 battery
->cable_type
= SEC_BATTERY_CABLE_NONE
;
9444 battery
->test_mode
= 0;
9445 battery
->factory_mode
= false;
9446 battery
->store_mode
= false;
9447 battery
->slate_mode
= false;
9448 battery
->is_hc_usb
= false;
9449 battery
->is_sysovlo
= false;
9450 battery
->is_vbatovlo
= false;
9451 battery
->is_abnormal_temp
= false;
9453 battery
->safety_timer_set
= true;
9454 battery
->stop_timer
= false;
9455 battery
->prev_safety_time
= 0;
9456 battery
->lcd_status
= false;
9458 #if defined(CONFIG_BATTERY_CISD)
9459 battery
->usb_overheat_check
= false;
9460 battery
->skip_cisd
= false;
9463 #if defined(CONFIG_BATTERY_AGE_FORECAST)
9464 battery
->batt_cycle
= -1;
9465 battery
->pdata
->age_step
= 0;
9468 battery
->health_change
= false;
9470 /* Check High Voltage charging option for wireless charging */
9471 /* '1' means disabling High Voltage charging */
9472 if (charging_night_mode
== '1')
9477 /* Check High Voltage charging option for wired charging */
9478 if (get_afc_mode() == CH_MODE_AFC_DISABLE_VAL
) {
9479 pr_info("HV wired charging mode is disabled\n");
9480 sec_bat_set_current_event(battery
,
9481 SEC_BAT_CURRENT_EVENT_HV_DISABLE
, SEC_BAT_CURRENT_EVENT_HV_DISABLE
);
9484 #if defined(CONFIG_BATTERY_SBM_DATA)
9485 battery
->sbm_data
= false;
9488 #if defined(CONFIG_CALC_TIME_TO_FULL)
9489 battery
->timetofull
= -1;
9492 if (battery
->pdata
->charger_name
== NULL
)
9493 battery
->pdata
->charger_name
= "sec-charger";
9494 if (battery
->pdata
->fuelgauge_name
== NULL
)
9495 battery
->pdata
->fuelgauge_name
= "sec-fuelgauge";
9497 /* create work queue */
9498 battery
->monitor_wqueue
=
9499 create_singlethread_workqueue(dev_name(&pdev
->dev
));
9500 if (!battery
->monitor_wqueue
) {
9501 dev_err(battery
->dev
,
9502 "%s: Fail to Create Workqueue\n", __func__
);
9506 INIT_DELAYED_WORK(&battery
->monitor_work
, sec_bat_monitor_work
);
9507 INIT_DELAYED_WORK(&battery
->cable_work
, sec_bat_cable_work
);
9508 #if defined(CONFIG_CALC_TIME_TO_FULL)
9509 INIT_DELAYED_WORK(&battery
->timetofull_work
, sec_bat_time_to_full_work
);
9511 INIT_DELAYED_WORK(&battery
->slowcharging_work
, sec_bat_check_slowcharging_work
);
9512 INIT_DELAYED_WORK(&battery
->afc_work
, sec_bat_afc_work
);
9513 INIT_DELAYED_WORK(&battery
->ext_event_work
, sec_bat_ext_event_work
);
9514 INIT_DELAYED_WORK(&battery
->siop_level_work
, sec_bat_siop_level_work
);
9515 INIT_DELAYED_WORK(&battery
->wc_headroom_work
, sec_bat_wc_headroom_work
);
9516 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
9517 INIT_DELAYED_WORK(&battery
->fw_init_work
, sec_bat_fw_init_work
);
9519 #if defined(CONFIG_UPDATE_BATTERY_DATA)
9520 INIT_DELAYED_WORK(&battery
->batt_data_work
, sec_bat_update_data_work
);
9522 INIT_DELAYED_WORK(&battery
->misc_event_work
, sec_bat_misc_event_work
);
9524 INIT_DELAYED_WORK(&battery
->parse_mode_dt_work
, sec_bat_parse_mode_dt_work
);
9526 INIT_DELAYED_WORK(&battery
->init_chg_work
, sec_bat_init_chg_work
);
9528 switch (pdata
->polling_type
) {
9529 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9530 INIT_DELAYED_WORK(&battery
->polling_work
,
9531 sec_bat_polling_work
);
9533 case SEC_BATTERY_MONITOR_ALARM
:
9534 battery
->last_poll_time
= ktime_get_boottime();
9535 alarm_init(&battery
->polling_alarm
, ALARM_BOOTTIME
,
9542 #if defined(CONFIG_BATTERY_CISD)
9543 sec_battery_cisd_init(battery
);
9546 battery_cfg
.drv_data
= battery
;
9548 /* init power supplier framework */
9549 battery
->psy_ps
= power_supply_register(&pdev
->dev
, &ps_power_supply_desc
, &battery_cfg
);
9550 if (!battery
->psy_ps
) {
9551 dev_err(battery
->dev
,
9552 "%s: Failed to Register psy_ps\n", __func__
);
9555 battery
->psy_ps
->supplied_to
= supply_list
;
9556 battery
->psy_ps
->num_supplicants
= ARRAY_SIZE(supply_list
);
9558 battery
->psy_wireless
= power_supply_register(&pdev
->dev
, &wireless_power_supply_desc
, &battery_cfg
);
9559 if (!battery
->psy_wireless
) {
9560 dev_err(battery
->dev
,
9561 "%s: Failed to Register psy_wireless\n", __func__
);
9562 goto err_supply_unreg_ps
;
9564 battery
->psy_wireless
->supplied_to
= supply_list
;
9565 battery
->psy_wireless
->num_supplicants
= ARRAY_SIZE(supply_list
);
9567 battery
->psy_usb
= power_supply_register(&pdev
->dev
, &usb_power_supply_desc
, &battery_cfg
);
9568 if (!battery
->psy_usb
) {
9569 dev_err(battery
->dev
,
9570 "%s: Failed to Register psy_usb\n", __func__
);
9571 goto err_supply_unreg_wireless
;
9573 battery
->psy_usb
->supplied_to
= supply_list
;
9574 battery
->psy_usb
->num_supplicants
= ARRAY_SIZE(supply_list
);
9576 battery
->psy_ac
= power_supply_register(&pdev
->dev
, &ac_power_supply_desc
, &battery_cfg
);
9577 if (!battery
->psy_ac
) {
9578 dev_err(battery
->dev
,
9579 "%s: Failed to Register psy_ac\n", __func__
);
9580 goto err_supply_unreg_usb
;
9582 battery
->psy_ac
->supplied_to
= supply_list
;
9583 battery
->psy_ac
->num_supplicants
= ARRAY_SIZE(supply_list
);
9585 battery
->psy_bat
= power_supply_register(&pdev
->dev
, &battery_power_supply_desc
, &battery_cfg
);
9586 if (!battery
->psy_bat
) {
9587 dev_err(battery
->dev
,
9588 "%s: Failed to Register psy_bat\n", __func__
);
9589 goto err_supply_unreg_ac
;
9592 ret
= sec_bat_create_attrs(&battery
->psy_bat
->dev
);
9594 dev_err(battery
->dev
,
9595 "%s : Failed to create_attrs\n", __func__
);
9599 /* initialize battery level*/
9601 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
9602 POWER_SUPPLY_PROP_CAPACITY
, value
);
9603 battery
->capacity
= value
.intval
;
9605 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
9606 /* queue_delayed_work(battery->monitor_wqueue, &battery->fw_init_work, 0); */
9609 /* notify wireless charger driver when sec_battery probe is done,
9610 if wireless charging is possible, POWER_SUPPLY_PROP_ONLINE of wireless property will be called. */
9612 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
9613 POWER_SUPPLY_PROP_CHARGE_TYPE
, value
);
9615 #if defined(CONFIG_STORE_MODE) && !defined(CONFIG_SEC_FACTORY)
9616 battery
->store_mode
= true;
9617 sec_bat_parse_mode_dt(battery
);
9620 #if defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
9621 battery
->pdic_info
.sink_status
.rp_currentlvl
= RP_CURRENT_LEVEL_NONE
;
9622 manager_notifier_register(&battery
->usb_typec_nb
,
9623 usb_typec_handle_notification
, MANAGER_NOTIFY_CCIC_BATTERY
);
9625 #if defined(CONFIG_MUIC_NOTIFIER)
9626 muic_notifier_register(&battery
->batt_nb
,
9627 batt_handle_notification
, MUIC_NOTIFY_DEV_CHARGER
);
9629 cable_initial_check(battery
);
9631 #if defined(CONFIG_CCIC_NOTIFIER)
9632 pr_info("%s: Registering PDIC_NOTIFY.\n", __func__
);
9633 pdic_notifier_register(&battery
->pdic_nb
,
9634 batt_pdic_handle_notification
, PDIC_NOTIFY_DEV_BATTERY
);
9637 #if defined(CONFIG_VBUS_NOTIFIER)
9638 vbus_notifier_register(&battery
->vbus_nb
,
9639 vbus_handle_notification
, VBUS_NOTIFY_DEV_CHARGER
);
9642 value
.intval
= true;
9643 psy_do_property(battery
->pdata
->charger_name
, set
,
9644 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX
, value
);
9646 /* make fg_reset true again for actual normal booting after recovery kernel is done */
9647 if (fg_reset
&& (bootmode
== 2)) {
9648 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
9649 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
9650 pr_info("%s: make fg_reset true again for actual normal booting\n", __func__
);
9653 if ((battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) ||
9654 (battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_TA
)) {
9655 queue_delayed_work(battery
->monitor_wqueue
, &battery
->init_chg_work
, 0);
9657 dev_info(&pdev
->dev
,
9658 "%s: SEC Battery Driver Monitorwork\n", __func__
);
9659 wake_lock(&battery
->monitor_wake_lock
);
9660 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
9663 if (battery
->pdata
->check_battery_callback
)
9664 battery
->present
= battery
->pdata
->check_battery_callback();
9666 dev_info(battery
->dev
,
9667 "%s: SEC Battery Driver Loaded\n", __func__
);
9671 if (battery
->pdata
->bat_irq
)
9672 free_irq(battery
->pdata
->bat_irq
, battery
);
9673 power_supply_unregister(battery
->psy_bat
);
9674 err_supply_unreg_ac
:
9675 power_supply_unregister(battery
->psy_ac
);
9676 err_supply_unreg_usb
:
9677 power_supply_unregister(battery
->psy_usb
);
9678 err_supply_unreg_wireless
:
9679 power_supply_unregister(battery
->psy_wireless
);
9680 err_supply_unreg_ps
:
9681 power_supply_unregister(battery
->psy_ps
);
9683 destroy_workqueue(battery
->monitor_wqueue
);
9685 wake_lock_destroy(&battery
->monitor_wake_lock
);
9686 wake_lock_destroy(&battery
->cable_wake_lock
);
9687 wake_lock_destroy(&battery
->vbus_wake_lock
);
9688 wake_lock_destroy(&battery
->afc_wake_lock
);
9689 wake_lock_destroy(&battery
->siop_level_wake_lock
);
9690 wake_lock_destroy(&battery
->ext_event_wake_lock
);
9691 wake_lock_destroy(&battery
->wc_headroom_wake_lock
);
9692 #if defined(CONFIG_UPDATE_BATTERY_DATA)
9693 wake_lock_destroy(&battery
->batt_data_wake_lock
);
9695 wake_lock_destroy(&battery
->misc_event_wake_lock
);
9697 wake_lock_destroy(&battery
->parse_mode_dt_wake_lock
);
9699 mutex_destroy(&battery
->adclock
);
9700 mutex_destroy(&battery
->iolock
);
9701 mutex_destroy(&battery
->misclock
);
9702 mutex_destroy(&battery
->batt_handlelock
);
9703 mutex_destroy(&battery
->current_eventlock
);
9704 mutex_destroy(&battery
->typec_notylock
);
9705 mutex_destroy(&battery
->wclock
);
9706 #if defined(CONFIG_BATTERY_SBM_DATA)
9707 mutex_destroy(&battery
->sbmlock
);
9708 sec_bat_exit_sbm(battery
);
9717 static int sec_battery_remove(struct platform_device
*pdev
)
9719 struct sec_battery_info
*battery
= platform_get_drvdata(pdev
);
9724 dev_dbg(battery
->dev
, "%s: Start\n", __func__
);
9726 switch (battery
->pdata
->polling_type
) {
9727 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9728 cancel_delayed_work(&battery
->polling_work
);
9730 case SEC_BATTERY_MONITOR_ALARM
:
9731 alarm_cancel(&battery
->polling_alarm
);
9737 flush_workqueue(battery
->monitor_wqueue
);
9738 destroy_workqueue(battery
->monitor_wqueue
);
9739 wake_lock_destroy(&battery
->monitor_wake_lock
);
9740 wake_lock_destroy(&battery
->cable_wake_lock
);
9741 wake_lock_destroy(&battery
->vbus_wake_lock
);
9742 wake_lock_destroy(&battery
->afc_wake_lock
);
9743 wake_lock_destroy(&battery
->siop_level_wake_lock
);
9744 wake_lock_destroy(&battery
->ext_event_wake_lock
);
9745 wake_lock_destroy(&battery
->misc_event_wake_lock
);
9746 mutex_destroy(&battery
->adclock
);
9747 mutex_destroy(&battery
->iolock
);
9748 mutex_destroy(&battery
->misclock
);
9749 mutex_destroy(&battery
->batt_handlelock
);
9750 mutex_destroy(&battery
->current_eventlock
);
9751 mutex_destroy(&battery
->typec_notylock
);
9752 mutex_destroy(&battery
->wclock
);
9754 #if defined(CONFIG_BATTERY_SBM_DATA)
9755 mutex_destroy(&battery
->sbmlock
);
9756 sec_bat_exit_sbm(battery
);
9762 for (i
= 0; i
< SEC_BAT_ADC_CHANNEL_NUM
; i
++)
9763 adc_exit(battery
->pdata
, i
);
9765 power_supply_unregister(battery
->psy_ps
);
9766 power_supply_unregister(battery
->psy_wireless
);
9767 power_supply_unregister(battery
->psy_ac
);
9768 power_supply_unregister(battery
->psy_usb
);
9769 power_supply_unregister(battery
->psy_bat
);
9771 dev_dbg(battery
->dev
, "%s: End\n", __func__
);
9777 static int sec_battery_prepare(struct device
*dev
)
9779 struct sec_battery_info
*battery
9780 = dev_get_drvdata(dev
);
9782 dev_info(battery
->dev
, "%s: Start\n", __func__
);
9784 switch (battery
->pdata
->polling_type
) {
9785 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9786 cancel_delayed_work(&battery
->polling_work
);
9788 case SEC_BATTERY_MONITOR_ALARM
:
9789 alarm_cancel(&battery
->polling_alarm
);
9795 /* monitor_wake_lock should be unlocked before cancle monitor_work */
9796 wake_unlock(&battery
->monitor_wake_lock
);
9797 cancel_delayed_work_sync(&battery
->monitor_work
);
9799 battery
->polling_in_sleep
= true;
9801 sec_bat_set_polling(battery
);
9803 /* cancel work for polling
9804 * that is set in sec_bat_set_polling()
9805 * no need for polling in sleep
9807 if (battery
->pdata
->polling_type
==
9808 SEC_BATTERY_MONITOR_WORKQUEUE
)
9809 cancel_delayed_work(&battery
->polling_work
);
9811 dev_info(battery
->dev
, "%s: End\n", __func__
);
9816 static int sec_battery_suspend(struct device
*dev
)
9821 static int sec_battery_resume(struct device
*dev
)
9826 static void sec_battery_complete(struct device
*dev
)
9828 struct sec_battery_info
*battery
9829 = dev_get_drvdata(dev
);
9831 dev_info(battery
->dev
, "%s: Start\n", __func__
);
9833 /* cancel current alarm and reset after monitor work */
9834 if (battery
->pdata
->polling_type
== SEC_BATTERY_MONITOR_ALARM
)
9835 alarm_cancel(&battery
->polling_alarm
);
9837 wake_lock(&battery
->monitor_wake_lock
);
9838 queue_delayed_work(battery
->monitor_wqueue
,
9839 &battery
->monitor_work
, 0);
9841 dev_info(battery
->dev
, "%s: End\n", __func__
);
9846 static void sec_battery_shutdown(struct platform_device
*pdev
)
9848 struct sec_battery_info
*battery
9849 = platform_get_drvdata(pdev
);
9851 switch (battery
->pdata
->polling_type
) {
9852 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9853 cancel_delayed_work(&battery
->polling_work
);
9855 case SEC_BATTERY_MONITOR_ALARM
:
9856 alarm_cancel(&battery
->polling_alarm
);
9864 static struct of_device_id sec_battery_dt_ids
[] = {
9865 { .compatible
= "samsung,sec-battery" },
9868 MODULE_DEVICE_TABLE(of
, sec_battery_dt_ids
);
9869 #endif /* CONFIG_OF */
9871 static const struct dev_pm_ops sec_battery_pm_ops
= {
9872 .prepare
= sec_battery_prepare
,
9873 .suspend
= sec_battery_suspend
,
9874 .resume
= sec_battery_resume
,
9875 .complete
= sec_battery_complete
,
9878 static struct platform_driver sec_battery_driver
= {
9880 .name
= "sec-battery",
9881 .owner
= THIS_MODULE
,
9882 .pm
= &sec_battery_pm_ops
,
9884 .of_match_table
= sec_battery_dt_ids
,
9887 .probe
= sec_battery_probe
,
9888 .remove
= sec_battery_remove
,
9889 .shutdown
= sec_battery_shutdown
,
9892 static int __init
sec_battery_init(void)
9894 return platform_driver_register(&sec_battery_driver
);
9897 static void __exit
sec_battery_exit(void)
9899 platform_driver_unregister(&sec_battery_driver
);
9902 late_initcall(sec_battery_init
);
9903 module_exit(sec_battery_exit
);
9905 MODULE_DESCRIPTION("Samsung Battery Driver");
9906 MODULE_AUTHOR("Samsung Electronics");
9907 MODULE_LICENSE("GPL");