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 (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
405 if (incurr
> battery
->pdata
->wc_cv_tx_current
)
406 incurr
= battery
->pdata
->wc_cv_tx_current
;
407 } else if (incurr
> battery
->pdata
->wc_cv_current
) {
408 incurr
= battery
->pdata
->wc_cv_current
;
413 /* 5. Full-Additional state */
414 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
) {
415 if (incurr
> battery
->pdata
->siop_hv_wireless_input_limit_current
)
416 incurr
= battery
->pdata
->siop_hv_wireless_input_limit_current
;
419 /* 6. Hero Stand Pad CV */
420 if (battery
->capacity
>= battery
->pdata
->wc_hero_stand_cc_cv
) {
421 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
) {
422 if (incurr
> battery
->pdata
->wc_hero_stand_cv_current
)
423 incurr
= battery
->pdata
->wc_hero_stand_cv_current
;
424 } else if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_STAND
) {
425 if (battery
->chg_limit
&&
426 incurr
> battery
->pdata
->wc_hero_stand_cv_current
) {
427 incurr
= battery
->pdata
->wc_hero_stand_cv_current
;
428 } else if (!battery
->chg_limit
&&
429 incurr
> battery
->pdata
->wc_hero_stand_hv_cv_current
) {
430 incurr
= battery
->pdata
->wc_hero_stand_hv_cv_current
;
435 /* 7. Full-None state && SIOP_LEVEL 100 */
436 if (battery
->siop_level
== 100 &&
437 battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
) {
438 incurr
= battery
->pdata
->wc_full_input_limit_current
;
444 static void sec_bat_get_charging_current_by_siop(struct sec_battery_info
*battery
,
445 int *input_current
, int *charging_current
) {
446 int usb_charging_current
= 500;
448 if (battery
->siop_level
< 100) {
449 int max_charging_current
;
451 if (is_wireless_type(battery
->cable_type
)) {
452 /* decrease the charging current according to siop level */
453 *charging_current
= *charging_current
* battery
->siop_level
/ 100;
455 /* do forced set charging current */
456 if (*charging_current
> 0 && *charging_current
< usb_charging_current
)
457 *charging_current
= usb_charging_current
;
459 max_charging_current
= 1800; /* 1 step(70) */
461 /* do forced set charging current */
462 if (*charging_current
> max_charging_current
)
463 *charging_current
= max_charging_current
;
466 if (is_nv_wireless_type(battery
->cable_type
)) {
467 if (*input_current
> battery
->pdata
->siop_wireless_input_limit_current
)
468 *input_current
= battery
->pdata
->siop_wireless_input_limit_current
;
469 if (*charging_current
> battery
->pdata
->siop_wireless_charging_limit_current
)
470 *charging_current
= battery
->pdata
->siop_wireless_charging_limit_current
;
471 } else if (is_hv_wireless_type(battery
->cable_type
)) {
472 if (*input_current
> battery
->pdata
->siop_hv_wireless_input_limit_current
)
473 *input_current
= battery
->pdata
->siop_hv_wireless_input_limit_current
;
474 if (*charging_current
> battery
->pdata
->siop_hv_wireless_charging_limit_current
)
475 *charging_current
= battery
->pdata
->siop_hv_wireless_charging_limit_current
;
476 } else if (is_hv_wire_type(battery
->cable_type
) && is_hv_wire_type(battery
->wire_status
)) {
477 if (is_hv_wire_12v_type(battery
->cable_type
)) {
478 if (*input_current
> battery
->pdata
->siop_hv_12v_input_limit_current
)
479 *input_current
= battery
->pdata
->siop_hv_12v_input_limit_current
;
481 if (*input_current
> battery
->pdata
->siop_hv_input_limit_current
)
482 *input_current
= battery
->pdata
->siop_hv_input_limit_current
;
484 #if defined(CONFIG_CCIC_NOTIFIER)
485 } else if (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
) {
486 if (*input_current
> (6000 / battery
->input_voltage
))
487 *input_current
= 6000 / battery
->input_voltage
;
490 if (*input_current
> battery
->pdata
->siop_input_limit_current
)
491 *input_current
= battery
->pdata
->siop_input_limit_current
;
495 pr_info("%s: incurr(%d), chgcurr(%d)\n", __func__
, *input_current
, *charging_current
);
498 #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_QC30)
499 extern int muic_afc_set_voltage(int vol
);
501 #if !defined(CONFIG_SEC_FACTORY)
502 static int sec_bat_get_temp_by_temp_control_source(struct sec_battery_info
*battery
,
503 enum sec_battery_temp_control_source tcs
)
506 case TEMP_CONTROL_SOURCE_CHG_THM
:
507 return battery
->chg_temp
;
508 case TEMP_CONTROL_SOURCE_USB_THM
:
509 return battery
->usb_temp
;
510 case TEMP_CONTROL_SOURCE_WPC_THM
:
511 return battery
->wpc_temp
;
512 case TEMP_CONTROL_SOURCE_NONE
:
513 case TEMP_CONTROL_SOURCE_BAT_THM
:
515 return battery
->temperature
;
519 static int sec_bat_check_mix_temp(struct sec_battery_info
*battery
, int input_current
)
521 if (battery
->pdata
->chg_temp_check
&& battery
->siop_level
>= 100 && is_not_wireless_type(battery
->cable_type
)) {
522 if ((!battery
->mix_limit
&&
523 (battery
->temperature
>= battery
->pdata
->mix_high_temp
) &&
524 (battery
->chg_temp
>= battery
->pdata
->mix_high_chg_temp
)) ||
525 (battery
->mix_limit
&&
526 (battery
->temperature
> battery
->pdata
->mix_high_temp_recovery
))) {
527 int max_input_current
=
528 battery
->pdata
->full_check_current_1st
+ 50;
530 /* inpu current = float voltage * (topoff_current_1st + 50mA(margin)) / (vbus_level * 0.9) */
531 input_current
= ((battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
) * max_input_current
) /
532 (battery
->input_voltage
* 90) / 10;
533 if (input_current
> max_input_current
)
534 input_current
= max_input_current
;
536 battery
->mix_limit
= true;
537 /* skip other heating control */
538 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
,
539 SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
);
540 } else if (battery
->mix_limit
) {
541 battery
->mix_limit
= false;
544 pr_info("%s: mix_limit(%d), temp(%d), chg_temp(%d), input_current(%d)\n",
545 __func__
, battery
->mix_limit
, battery
->temperature
, battery
->chg_temp
, input_current
);
547 battery
->mix_limit
= false;
549 return input_current
;
552 static int sec_bat_check_wpc_temp(struct sec_battery_info
*battery
, int input_current
)
554 if (is_wireless_type(battery
->cable_type
)) {
555 int wpc_vout_level
= WIRELESS_VOUT_10V
;
557 if (battery
->siop_level
>= 100) {
558 int temp_val
= sec_bat_get_temp_by_temp_control_source(battery
,
559 battery
->pdata
->wpc_temp_control_source
);
561 if ((!battery
->chg_limit
&& temp_val
>= battery
->pdata
->wpc_high_temp
) ||
562 (battery
->chg_limit
&& temp_val
> battery
->pdata
->wpc_high_temp_recovery
)) {
563 battery
->chg_limit
= true;
564 input_current
= battery
->pdata
->wpc_charging_limit_current
;
565 wpc_vout_level
= WIRELESS_VOUT_5V_STEP
;
566 } else if (battery
->chg_limit
) {
567 battery
->chg_limit
= false;
570 if ((is_hv_wireless_type(battery
->cable_type
) &&
571 battery
->cable_type
!= SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE
) ||
572 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
) {
573 int temp_val
= sec_bat_get_temp_by_temp_control_source(battery
,
574 battery
->pdata
->wpc_temp_lcd_on_control_source
);
576 if ((!battery
->chg_limit
&&
577 temp_val
>= battery
->pdata
->wpc_lcd_on_high_temp
) ||
578 (battery
->chg_limit
&&
579 temp_val
> battery
->pdata
->wpc_lcd_on_high_temp_rec
)) {
580 input_current
= battery
->pdata
->wpc_lcd_on_charging_limit_current
;
581 battery
->chg_limit
= true;
582 wpc_vout_level
= (battery
->capacity
< 95) ?
583 WIRELESS_VOUT_5V_STEP
: WIRELESS_VOUT_10V
;
584 } else if (battery
->chg_limit
) {
585 battery
->chg_limit
= false;
587 } else if (battery
->chg_limit
) {
588 battery
->chg_limit
= false;
592 if (is_hv_wireless_type(battery
->cable_type
)) {
593 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_SWELLING_MODE
)
594 wpc_vout_level
= WIRELESS_VOUT_5V_STEP
;
596 if (wpc_vout_level
!= battery
->wpc_vout_level
) {
597 battery
->wpc_vout_level
= wpc_vout_level
;
598 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
) {
599 pr_info("%s: block to set wpc vout level(%d) because otg on\n",
600 __func__
, wpc_vout_level
);
602 union power_supply_propval value
= {0, };
604 value
.intval
= wpc_vout_level
;
605 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
606 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
607 pr_info("%s: change vout level(%d)",
608 __func__
, battery
->wpc_vout_level
);
609 battery
->aicl_current
= 0; /* reset aicl current */
611 } else if (battery
->wpc_vout_level
== WIRELESS_VOUT_10V
&& !battery
->chg_limit
)
612 /* reset aicl current to recover current for unexpected aicl during before vout boosting completion */
613 battery
->aicl_current
= 0;
615 pr_info("%s: change input_current(%d), vout_level(%d), chg_limit(%d)\n",
616 __func__
, input_current
, battery
->wpc_vout_level
, battery
->chg_limit
);
619 return input_current
;
622 static void sec_bat_check_afc_temp(struct sec_battery_info
*battery
, int *input_current
, int *charging_current
)
624 #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_QC30)
625 if (battery
->siop_level
>= 100) {
626 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_CHG_LIMIT
) {
627 battery
->chg_limit
= battery
->vbus_chg_by_siop
= false;
628 *input_current
= battery
->pdata
->pre_afc_input_current
;
630 /* change input current */
631 union power_supply_propval value
;
632 battery
->charge_power
= battery
->input_voltage
* (*input_current
);
633 value
.intval
= *input_current
;
634 psy_do_property(battery
->pdata
->charger_name
, set
,
635 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
636 battery
->input_current
= *input_current
;
638 /* set current event */
639 cancel_delayed_work(&battery
->afc_work
);
640 wake_unlock(&battery
->afc_wake_lock
);
641 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_AFC
,
642 (SEC_BAT_CURRENT_EVENT_CHG_LIMIT
| SEC_BAT_CURRENT_EVENT_AFC
));
643 /* vbus level : 5V --> 9V */
644 if (battery
->chg_limit_recovery_cable
== SEC_BATTERY_CABLE_12V_TA
) {
645 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_12V
);
646 } else if (battery
->chg_limit_recovery_cable
== SEC_BATTERY_CABLE_9V_TA
) {
647 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_9V
);
649 pr_info("%s: cable_type(%d), chg_limit_recovery_cable(%d) vbus_by_siop(%d)\n", __func__
,
650 battery
->cable_type
, battery
->chg_limit_recovery_cable
, battery
->vbus_chg_by_siop
);
651 } else if (!battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
) && (battery
->chg_temp
> battery
->pdata
->chg_high_temp
)) {
652 *input_current
= battery
->pdata
->chg_input_limit_current
;
653 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
654 battery
->chg_limit
= true;
655 } else if (!battery
->chg_limit
&& battery
->max_charge_power
>= (battery
->pdata
->pd_charging_charge_power
- 500) && (battery
->chg_temp
> battery
->pdata
->chg_high_temp
)) {
656 *input_current
= battery
->pdata
->default_input_current
;
657 *charging_current
= battery
->pdata
->default_charging_current
;
658 battery
->chg_limit
= true;
659 } else if (battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
)) {
660 if (battery
->chg_temp
< battery
->pdata
->chg_high_temp_recovery
) {
661 *input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
662 *charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
;
663 battery
->chg_limit
= false;
665 *input_current
= battery
->pdata
->chg_input_limit_current
;
666 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
667 battery
->chg_limit
= true;
669 } else if (battery
->chg_limit
&& battery
->max_charge_power
>= (battery
->pdata
->pd_charging_charge_power
- 500)) {
670 if (battery
->chg_temp
< battery
->pdata
->chg_high_temp_recovery
) {
671 *input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
672 *charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
;
673 battery
->chg_limit
= false;
675 *input_current
= battery
->pdata
->chg_input_limit_current
;
676 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
677 battery
->chg_limit
= true;
680 pr_info("%s: cable_type(%d), chg_limit(%d) vbus_by_siop(%d)\n", __func__
,
681 battery
->cable_type
, battery
->chg_limit
, battery
->vbus_chg_by_siop
);
682 } else if (is_hv_wire_type(battery
->cable_type
) && is_hv_wire_type(battery
->wire_status
) &&
683 !battery
->store_mode
&& (battery
->cable_type
!= SEC_BATTERY_CABLE_QC30
) &&
684 (battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) && !battery
->vbus_chg_by_siop
) {
685 battery
->chg_limit_recovery_cable
= battery
->cable_type
;
686 battery
->vbus_chg_by_siop
= true;
687 battery
->chg_limit
= false;
688 /* vbus level : 9V --> 5V */
689 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_5V
);
690 pr_info("%s: vbus set 5V by siop(recovery cable: %d)\n", __func__
,battery
->chg_limit_recovery_cable
);
693 if (!battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
) && (battery
->chg_temp
> battery
->pdata
->chg_high_temp
)) {
694 *input_current
= battery
->pdata
->chg_input_limit_current
;
695 *charging_current
= battery
->pdata
->chg_charging_limit_current
;
696 battery
->chg_limit
= true;
697 } else if (battery
->chg_limit
&& is_hv_wire_type(battery
->cable_type
) && (battery
->chg_temp
< battery
->pdata
->chg_high_temp_recovery
)) {
698 *input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
699 *charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
;
700 battery
->chg_limit
= false;
705 #if defined(CONFIG_CCIC_NOTIFIER)
706 extern void select_pdo(int num
);
707 static int sec_bat_check_pdic_temp(struct sec_battery_info
*battery
, int input_current
)
709 if (battery
->pdic_ps_rdy
&& battery
->siop_level
>= 100) {
711 struct sec_bat_pdic_list
*pd_list
= &battery
->pd_list
;
712 int pd_index
= pd_list
->now_pd_index
;
714 if (!battery
->chg_limit
) {
715 if (battery
->chg_temp
>= battery
->pdata
->chg_high_temp
) {
716 battery
->chg_limit
= true;
721 if (battery
->chg_temp
<= battery
->pdata
->chg_high_temp_recovery
)
722 battery
->chg_limit
= false;
723 else if (battery
->chg_temp
>= battery
->pdata
->chg_high_temp
)
728 if (battery
->chg_limit
) {
729 input_current
= (input_current
> (battery
->pdata
->nv_charge_power
/ (pd_list
->pd_info
[0].input_voltage
/ 1000))) ?
730 (battery
->pdata
->nv_charge_power
/ (pd_list
->pd_info
[0].input_voltage
/ 1000)) : input_current
;
735 pd_list
->now_pd_index
= pd_index
;
738 (pd_index
>= pd_list
->max_pd_count
) ? (pd_list
->max_pd_count
- 1) : pd_index
;
740 if (pd_list
->now_pd_index
!= pd_index
) {
741 /* change input current before request new pdo
742 * if new pdo's input current is less than now
744 if (pd_list
->pd_info
[pd_index
].input_current
< input_current
) {
745 union power_supply_propval value
= {0, };
747 input_current
= pd_list
->pd_info
[pd_index
].input_current
;
748 value
.intval
= input_current
;
749 battery
->input_current
= input_current
;
750 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SELECT_PDO
,
751 SEC_BAT_CURRENT_EVENT_SELECT_PDO
);
752 psy_do_property(battery
->pdata
->charger_name
, set
,
753 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
755 /* select next pdo */
756 battery
->pdic_ps_rdy
= false;
757 select_pdo(pd_list
->pd_info
[pd_index
].pdo_index
);
758 pr_info("%s: change pd_list - index: %d, pdo_index: %d\n",
759 __func__
, pd_index
, pd_list
->pd_info
[pd_index
].pdo_index
);
762 pr_info("%s: pd_index(%d), input_current(%d), chg_limit(%d)\n",
763 __func__
, pd_index
, input_current
, battery
->chg_limit
);
766 return input_current
;
769 static int sec_bat_check_pd_input_current(struct sec_battery_info
*battery
, int input_current
)
771 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_SELECT_PDO
) {
772 input_current
= battery
->input_current
;
773 pr_info("%s: change input_current(%d), cable_type(%d)\n", __func__
, input_current
, battery
->cable_type
);
776 return input_current
;
781 static int sec_bat_check_afc_input_current(struct sec_battery_info
*battery
, int input_current
)
783 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
) {
786 if (!is_wireless_type(battery
->cable_type
)) {
787 input_current
= battery
->pdata
->pre_afc_input_current
; // 1000mA
788 work_delay
= battery
->pdata
->pre_afc_work_delay
;
790 input_current
= battery
->pdata
->pre_wc_afc_input_current
;
791 /* do not reduce this time, this is for noble pad */
792 work_delay
= battery
->pdata
->pre_wc_afc_work_delay
;
795 wake_lock(&battery
->afc_wake_lock
);
796 if (!delayed_work_pending(&battery
->afc_work
))
797 queue_delayed_work(battery
->monitor_wqueue
,
798 &battery
->afc_work
, msecs_to_jiffies(work_delay
));
800 pr_info("%s: change input_current(%d), cable_type(%d)\n", __func__
, input_current
, battery
->cable_type
);
803 return input_current
;
806 #if defined(CONFIG_CCIC_NOTIFIER)
807 static void sec_bat_get_input_current_in_power_list(struct sec_battery_info
*battery
)
809 int pdo_num
= battery
->pdic_info
.sink_status
.current_pdo_num
;
810 int max_input_current
= 0;
812 max_input_current
= battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_PDIC
].input_current_limit
=
813 battery
->pdic_info
.sink_status
.power_list
[pdo_num
].max_current
;
815 pr_info("%s:max_input_current : %dmA\n", __func__
, max_input_current
);
818 static void sec_bat_get_charging_current_in_power_list(struct sec_battery_info
*battery
)
820 int max_charging_current
= 0;
821 int pdo_num
= battery
->pdic_info
.sink_status
.current_pdo_num
;
822 int pd_power
= (battery
->pdic_info
.sink_status
.power_list
[pdo_num
].max_voltage
*
823 battery
->pdic_info
.sink_status
.power_list
[pdo_num
].max_current
);
825 /* We assume that output voltage to float voltage */
826 max_charging_current
= pd_power
/ (battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
);
827 max_charging_current
= max_charging_current
> battery
->pdata
->max_charging_current
?
828 battery
->pdata
->max_charging_current
: max_charging_current
;
829 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_PDIC
].fast_charging_current
= max_charging_current
;
830 battery
->charge_power
= pd_power
;
832 pr_info("%s:pd_charge_power : %dmW, max_charging_current : %dmA\n", __func__
,
833 battery
->charge_power
, max_charging_current
);
837 static int sec_bat_set_charging_current(struct sec_battery_info
*battery
)
839 static int afc_init
= false;
840 union power_supply_propval value
= {0, };
841 int input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
,
842 charging_current
= battery
->pdata
->charging_current
[battery
->cable_type
].fast_charging_current
,
843 topoff_current
= battery
->pdata
->full_check_current_1st
;
844 #if !defined(CONFIG_SEC_FACTORY)
848 if (battery
->aicl_current
)
849 input_current
= battery
->aicl_current
;
850 mutex_lock(&battery
->iolock
);
851 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) {
853 #if !defined(CONFIG_SEC_FACTORY)
854 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
)) {
855 input_current
= sec_bat_check_mix_temp(battery
, input_current
);
859 /* check input current */
860 #if !defined(CONFIG_SEC_FACTORY)
861 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
)) {
862 if (is_wireless_type(battery
->cable_type
) && battery
->pdata
->wpc_temp_check
) {
863 temp
= sec_bat_check_wpc_temp(battery
, input_current
);
864 if (input_current
> temp
)
865 input_current
= temp
;
867 #if defined(CONFIG_CCIC_NOTIFIER)
868 else if (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
&& battery
->pdata
->chg_temp_check
) {
869 input_current
= sec_bat_check_pdic_temp(battery
, input_current
);
870 input_current
= sec_bat_check_pd_input_current(battery
, input_current
);
873 else if (battery
->pdata
->chg_temp_check
)
874 sec_bat_check_afc_temp(battery
, &input_current
, &charging_current
);
878 input_current
= sec_bat_check_afc_input_current(battery
, input_current
);
879 /* Set limited max current with hv wire cable when store mode is set and LDU
880 Limited max current should be set with over 5% capacity since target could be turned off during boot up */
881 if (battery
->store_mode
&& is_hv_wire_type(battery
->wire_status
) && (battery
->capacity
>= 5)) {
882 input_current
= battery
->pdata
->store_mode_afc_input_current
;
885 sec_bat_get_charging_current_by_siop(battery
, &input_current
, &charging_current
);
887 /* Calculate wireless input current under the specific conditions (wpc_sleep_mode, chg_limit)*/
888 if (battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
) {
889 input_current
= sec_bat_get_wireless_current(battery
, input_current
);
892 /* check topoff current */
893 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
&&
894 battery
->pdata
->full_check_type_2nd
== SEC_BATTERY_FULLCHARGED_CHGPSY
) {
896 battery
->pdata
->full_check_current_2nd
;
899 /* check swelling state */
900 if (is_wireless_type(battery
->cable_type
)) {
901 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
) {
902 charging_current
= (charging_current
> battery
->pdata
->swelling_wc_low_temp_current
) ?
903 battery
->pdata
->swelling_wc_low_temp_current
: charging_current
;
904 topoff_current
= (topoff_current
> battery
->pdata
->swelling_low_temp_topoff
) ?
905 battery
->pdata
->swelling_low_temp_topoff
: topoff_current
;
906 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
) {
907 charging_current
= (charging_current
> battery
->pdata
->swelling_wc_high_temp_current
) ?
908 battery
->pdata
->swelling_wc_high_temp_current
: charging_current
;
909 topoff_current
= (topoff_current
> battery
->pdata
->swelling_high_temp_topoff
) ?
910 battery
->pdata
->swelling_high_temp_topoff
: topoff_current
;
911 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
) {
912 charging_current
= (charging_current
> battery
->pdata
->swelling_wc_low_temp_current
) ?
913 battery
->pdata
->swelling_wc_low_temp_current
: charging_current
;
916 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
) {
917 charging_current
= (charging_current
> battery
->pdata
->swelling_low_temp_current
) ?
918 battery
->pdata
->swelling_low_temp_current
: charging_current
;
919 topoff_current
= (topoff_current
> battery
->pdata
->swelling_low_temp_topoff
) ?
920 battery
->pdata
->swelling_low_temp_topoff
: topoff_current
;
921 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
) {
922 charging_current
= (charging_current
> battery
->pdata
->swelling_high_temp_current
) ?
923 battery
->pdata
->swelling_high_temp_current
: charging_current
;
924 topoff_current
= (topoff_current
> battery
->pdata
->swelling_high_temp_topoff
) ?
925 battery
->pdata
->swelling_high_temp_topoff
: topoff_current
;
926 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
) {
927 charging_current
= (charging_current
> battery
->pdata
->swelling_low_temp_current
) ?
928 battery
->pdata
->swelling_low_temp_current
: charging_current
;
931 /* usb unconfigured or suspend*/
932 if ((battery
->cable_type
== SEC_BATTERY_CABLE_USB
) && !lpcharge
&&
933 (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL_DEFAULT
)) {
934 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_USB_100MA
) {
935 pr_info("%s: usb unconfigured\n", __func__
);
936 input_current
= USB_CURRENT_UNCONFIGURED
;
937 charging_current
= USB_CURRENT_UNCONFIGURED
;
943 /* In wireless charging, must be set charging current before input current. */
944 if (is_wireless_type(battery
->cable_type
) &&
945 battery
->charging_current
!= charging_current
) {
946 value
.intval
= charging_current
;
947 psy_do_property(battery
->pdata
->charger_name
, set
,
948 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
949 battery
->charging_current
= charging_current
;
951 /* set input current, charging current */
952 if ((battery
->input_current
!= input_current
) ||
953 (battery
->charging_current
!= charging_current
)) {
954 /* update charge power */
955 battery
->charge_power
= battery
->input_voltage
* input_current
;
956 if (battery
->charge_power
> battery
->max_charge_power
)
957 battery
->max_charge_power
= battery
->charge_power
;
959 value
.intval
= input_current
;
960 psy_do_property(battery
->pdata
->charger_name
, set
,
961 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
962 battery
->input_current
= input_current
;
964 value
.intval
= charging_current
;
965 psy_do_property(battery
->pdata
->charger_name
, set
,
966 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
968 if (charging_current
<= 100)
969 battery
->charging_current
= 100;
971 battery
->charging_current
= charging_current
;
972 pr_info("%s: power(%d), input(%d), charge(%d)\n", __func__
,
973 battery
->charge_power
, battery
->input_current
, battery
->charging_current
);
976 /* set topoff current */
977 if (battery
->topoff_current
!= topoff_current
) {
978 value
.intval
= topoff_current
;
979 psy_do_property(battery
->pdata
->charger_name
, set
,
980 POWER_SUPPLY_PROP_CURRENT_FULL
, value
);
981 battery
->topoff_current
= topoff_current
;
985 #if defined(CONFIG_AFC_CHARGER_MODE)
987 psy_do_property(battery
->pdata
->charger_name
, set
,
988 POWER_SUPPLY_PROP_AFC_CHARGER_MODE
,
992 mutex_unlock(&battery
->iolock
);
996 static int sec_bat_set_charge(
997 struct sec_battery_info
*battery
,
1000 union power_supply_propval val
= {0, };
1001 ktime_t current_time
= {0, };
1002 struct timespec ts
= {0, };
1004 if (battery
->cable_type
== SEC_BATTERY_CABLE_HMT_CONNECTED
)
1007 if ((battery
->current_event
& SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
) &&
1008 (chg_mode
== SEC_BAT_CHG_MODE_CHARGING
)) {
1009 dev_info(battery
->dev
, "%s: charge disable by HMT\n", __func__
);
1010 chg_mode
= SEC_BAT_CHG_MODE_CHARGING_OFF
;
1013 battery
->charger_mode
= chg_mode
;
1014 pr_info("%s set %s mode\n", __func__
, sec_bat_charge_mode_str
[chg_mode
]);
1016 val
.intval
= battery
->status
;
1017 psy_do_property(battery
->pdata
->charger_name
, set
,
1018 POWER_SUPPLY_PROP_STATUS
, val
);
1019 current_time
= ktime_get_boottime();
1020 ts
= ktime_to_timespec(current_time
);
1022 if (chg_mode
== SEC_BAT_CHG_MODE_CHARGING
) {
1023 /*Reset charging start time only in initial charging start */
1024 if (battery
->charging_start_time
== 0) {
1027 battery
->charging_start_time
= ts
.tv_sec
;
1028 battery
->charging_next_time
=
1029 battery
->pdata
->charging_reset_time
;
1031 battery
->charging_block
= false;
1033 #if defined(CONFIG_BATTERY_SBM_DATA)
1034 sec_bat_add_sbm_data(battery
, SBM_DATA_SET_CHARGE
);
1037 battery
->charging_start_time
= 0;
1038 battery
->charging_passed_time
= 0;
1039 battery
->charging_next_time
= 0;
1040 battery
->charging_fullcharged_time
= 0;
1041 battery
->full_check_cnt
= 0;
1042 battery
->charging_block
= true;
1043 #if defined(CONFIG_STEP_CHARGING)
1044 sec_bat_reset_step_charging(battery
);
1046 #if defined(CONFIG_BATTERY_CISD)
1047 battery
->usb_overheat_check
= false;
1048 battery
->cisd
.ab_vbat_check_count
= 0;
1049 if (chg_mode
== SEC_BAT_CHG_MODE_BUCK_OFF
) {
1050 battery
->cisd
.data
[CISD_DATA_BUCK_OFF
]++;
1051 battery
->cisd
.data
[CISD_DATA_BUCK_OFF_PER_DAY
]++;
1056 battery
->temp_highlimit_cnt
= 0;
1057 battery
->temp_high_cnt
= 0;
1058 battery
->temp_low_cnt
= 0;
1059 battery
->temp_recover_cnt
= 0;
1061 val
.intval
= chg_mode
;
1062 psy_do_property(battery
->pdata
->charger_name
, set
,
1063 POWER_SUPPLY_PROP_CHARGING_ENABLED
, val
);
1068 static bool sec_bat_check_by_psy(struct sec_battery_info
*battery
)
1070 char *psy_name
= NULL
;
1071 union power_supply_propval value
= {0, };
1074 switch (battery
->pdata
->battery_check_type
) {
1075 case SEC_BATTERY_CHECK_PMIC
:
1076 psy_name
= battery
->pdata
->pmic_name
;
1078 case SEC_BATTERY_CHECK_FUELGAUGE
:
1079 psy_name
= battery
->pdata
->fuelgauge_name
;
1081 case SEC_BATTERY_CHECK_CHARGER
:
1082 psy_name
= battery
->pdata
->charger_name
;
1085 dev_err(battery
->dev
,
1086 "%s: Invalid Battery Check Type\n", __func__
);
1088 goto battery_check_error
;
1092 psy_do_property(psy_name
, get
,
1093 POWER_SUPPLY_PROP_PRESENT
, value
);
1094 ret
= (bool)value
.intval
;
1096 battery_check_error
:
1100 static bool sec_bat_check(struct sec_battery_info
*battery
)
1104 if (battery
->factory_mode
|| battery
->is_jig_on
) {
1105 dev_dbg(battery
->dev
, "%s: No need to check in factory mode\n",
1110 if (battery
->health
!= POWER_SUPPLY_HEALTH_GOOD
&&
1111 battery
->health
!= POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
) {
1112 dev_dbg(battery
->dev
, "%s: No need to check\n", __func__
);
1116 switch (battery
->pdata
->battery_check_type
) {
1117 case SEC_BATTERY_CHECK_ADC
:
1118 if(battery
->cable_type
== SEC_BATTERY_CABLE_NONE
)
1119 ret
= battery
->present
;
1121 ret
= sec_bat_check_vf_adc(battery
);
1123 case SEC_BATTERY_CHECK_INT
:
1124 case SEC_BATTERY_CHECK_CALLBACK
:
1125 if(battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) {
1126 ret
= battery
->present
;
1128 if (battery
->pdata
->check_battery_callback
)
1129 ret
= battery
->pdata
->check_battery_callback();
1132 case SEC_BATTERY_CHECK_PMIC
:
1133 case SEC_BATTERY_CHECK_FUELGAUGE
:
1134 case SEC_BATTERY_CHECK_CHARGER
:
1135 ret
= sec_bat_check_by_psy(battery
);
1137 case SEC_BATTERY_CHECK_NONE
:
1138 dev_dbg(battery
->dev
, "%s: No Check\n", __func__
);
1146 static bool sec_bat_get_cable_type(
1147 struct sec_battery_info
*battery
,
1148 int cable_source_type
)
1151 int cable_type
= battery
->cable_type
;
1153 if (cable_source_type
& SEC_BATTERY_CABLE_SOURCE_CALLBACK
) {
1154 if (battery
->pdata
->check_cable_callback
)
1156 battery
->pdata
->check_cable_callback();
1159 if (cable_source_type
& SEC_BATTERY_CABLE_SOURCE_ADC
) {
1160 if (gpio_get_value_cansleep(
1161 battery
->pdata
->bat_gpio_ta_nconnected
) ^
1162 battery
->pdata
->bat_polarity_ta_nconnected
)
1163 cable_type
= SEC_BATTERY_CABLE_NONE
;
1166 sec_bat_get_charger_type_adc(battery
);
1169 if (battery
->cable_type
== cable_type
) {
1170 dev_dbg(battery
->dev
,
1171 "%s: No need to change cable status\n", __func__
);
1173 if (cable_type
< SEC_BATTERY_CABLE_NONE
||
1174 cable_type
>= SEC_BATTERY_CABLE_MAX
) {
1175 dev_err(battery
->dev
,
1176 "%s: Invalid cable type\n", __func__
);
1178 battery
->cable_type
= cable_type
;
1179 if (battery
->pdata
->check_cable_result_callback
)
1180 battery
->pdata
->check_cable_result_callback(
1181 battery
->cable_type
);
1185 dev_dbg(battery
->dev
, "%s: Cable Changed (%d)\n",
1186 __func__
, battery
->cable_type
);
1193 static void sec_bat_set_charging_status(struct sec_battery_info
*battery
,
1195 union power_supply_propval value
= {0, };
1198 case POWER_SUPPLY_STATUS_CHARGING
:
1199 if (battery
->siop_level
!= 100)
1200 battery
->stop_timer
= true;
1202 case POWER_SUPPLY_STATUS_NOT_CHARGING
:
1203 case POWER_SUPPLY_STATUS_DISCHARGING
:
1204 if ((battery
->status
== POWER_SUPPLY_STATUS_FULL
||
1205 (battery
->capacity
== 100 && !battery
->slate_mode
)) &&
1206 !battery
->store_mode
) {
1208 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
1209 POWER_SUPPLY_PROP_CHARGE_FULL
, value
);
1210 /* To get SOC value (NOT raw SOC), need to reset value */
1212 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
1213 POWER_SUPPLY_PROP_CAPACITY
, value
);
1214 battery
->capacity
= value
.intval
;
1216 battery
->expired_time
= battery
->pdata
->expired_time
;
1217 battery
->prev_safety_time
= 0;
1219 case POWER_SUPPLY_STATUS_FULL
:
1220 if (is_wireless_type(battery
->cable_type
)) {
1221 bool send_cs100_cmd
= true;
1223 #ifdef CONFIG_CS100_JPNCONCEPT
1224 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
1225 POWER_SUPPLY_EXT_PROP_WIRELESS_TX_ID
, value
);
1227 /* In case of the JPN PAD, this pad blocks the charge after give the cs100 command. */
1228 send_cs100_cmd
= (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
|| value
.intval
);
1230 if (send_cs100_cmd
) {
1231 value
.intval
= POWER_SUPPLY_STATUS_FULL
;
1232 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
1233 POWER_SUPPLY_PROP_STATUS
, value
);
1240 battery
->status
= status
;
1243 static bool sec_bat_battery_cable_check(struct sec_battery_info
*battery
)
1245 if (!sec_bat_check(battery
)) {
1246 if (battery
->check_count
< battery
->pdata
->check_count
)
1247 battery
->check_count
++;
1249 dev_err(battery
->dev
,
1250 "%s: Battery Disconnected\n", __func__
);
1251 battery
->present
= false;
1252 battery
->health
= POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
;
1254 if (battery
->status
!=
1255 POWER_SUPPLY_STATUS_DISCHARGING
) {
1256 sec_bat_set_charging_status(battery
,
1257 POWER_SUPPLY_STATUS_NOT_CHARGING
);
1258 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
1261 if (battery
->pdata
->check_battery_result_callback
)
1263 check_battery_result_callback();
1267 battery
->check_count
= 0;
1269 battery
->present
= true;
1271 if (battery
->health
== POWER_SUPPLY_HEALTH_UNSPEC_FAILURE
) {
1272 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
1274 if (battery
->status
== POWER_SUPPLY_STATUS_NOT_CHARGING
) {
1275 sec_bat_set_charging_status(battery
,
1276 POWER_SUPPLY_STATUS_CHARGING
);
1277 #if defined(CONFIG_BATTERY_SWELLING)
1278 if (!battery
->swelling_mode
)
1280 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1284 dev_dbg(battery
->dev
, "%s: Battery Connected\n", __func__
);
1286 if (battery
->pdata
->cable_check_type
&
1287 SEC_BATTERY_CABLE_CHECK_POLLING
) {
1288 if (sec_bat_get_cable_type(battery
,
1289 battery
->pdata
->cable_source_type
)) {
1290 wake_lock(&battery
->cable_wake_lock
);
1291 queue_delayed_work(battery
->monitor_wqueue
,
1292 &battery
->cable_work
, 0);
1298 static int sec_bat_ovp_uvlo_by_psy(struct sec_battery_info
*battery
)
1300 char *psy_name
= NULL
;
1301 union power_supply_propval value
= {0, };
1303 value
.intval
= POWER_SUPPLY_HEALTH_GOOD
;
1305 switch (battery
->pdata
->ovp_uvlo_check_type
) {
1306 case SEC_BATTERY_OVP_UVLO_PMICPOLLING
:
1307 psy_name
= battery
->pdata
->pmic_name
;
1309 case SEC_BATTERY_OVP_UVLO_CHGPOLLING
:
1310 psy_name
= battery
->pdata
->charger_name
;
1313 dev_err(battery
->dev
,
1314 "%s: Invalid OVP/UVLO Check Type\n", __func__
);
1315 goto ovp_uvlo_check_error
;
1319 psy_do_property(psy_name
, get
,
1320 POWER_SUPPLY_PROP_HEALTH
, value
);
1322 ovp_uvlo_check_error
:
1323 return value
.intval
;
1326 static bool sec_bat_ovp_uvlo_result(
1327 struct sec_battery_info
*battery
, int health
)
1329 if (battery
->health
!= health
) {
1330 battery
->health
= health
;
1332 case POWER_SUPPLY_HEALTH_GOOD
:
1333 dev_info(battery
->dev
, "%s: Safe voltage\n", __func__
);
1334 dev_info(battery
->dev
, "%s: is_recharging : %d\n", __func__
, battery
->is_recharging
);
1335 sec_bat_set_charging_status(battery
,
1336 POWER_SUPPLY_STATUS_CHARGING
);
1337 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1338 #if defined(CONFIG_BATTERY_SWELLING)
1339 if (!battery
->swelling_mode
)
1341 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1342 battery
->health_check_count
= 0;
1344 case POWER_SUPPLY_HEALTH_OVERVOLTAGE
:
1345 case POWER_SUPPLY_HEALTH_UNDERVOLTAGE
:
1346 dev_info(battery
->dev
,
1347 "%s: Unsafe voltage (%d)\n",
1349 sec_bat_set_charging_status(battery
,
1350 POWER_SUPPLY_STATUS_NOT_CHARGING
);
1351 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
1352 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
1353 battery
->is_recharging
= false;
1354 battery
->health_check_count
= DEFAULT_HEALTH_CHECK_COUNT
;
1355 #if defined(CONFIG_BATTERY_CISD)
1356 battery
->cisd
.data
[CISD_DATA_UNSAFETY_VOLTAGE
]++;
1357 battery
->cisd
.data
[CISD_DATA_UNSAFE_VOLTAGE_PER_DAY
]++;
1359 /* Take the wakelock during 10 seconds
1360 when over-voltage status is detected */
1361 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
1364 power_supply_changed(battery
->psy_bat
);
1371 static bool sec_bat_ovp_uvlo(struct sec_battery_info
*battery
)
1373 int health
= POWER_SUPPLY_HEALTH_GOOD
;
1375 if (battery
->wdt_kick_disable
) {
1376 dev_dbg(battery
->dev
,
1377 "%s: No need to check in wdt test\n",
1380 } else if ((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
1381 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
1382 dev_dbg(battery
->dev
, "%s: No need to check in Full status", __func__
);
1386 if (battery
->health
!= POWER_SUPPLY_HEALTH_GOOD
&&
1387 battery
->health
!= POWER_SUPPLY_HEALTH_OVERVOLTAGE
&&
1388 battery
->health
!= POWER_SUPPLY_HEALTH_UNDERVOLTAGE
) {
1389 dev_dbg(battery
->dev
, "%s: No need to check\n", __func__
);
1393 health
= battery
->health
;
1395 switch (battery
->pdata
->ovp_uvlo_check_type
) {
1396 case SEC_BATTERY_OVP_UVLO_CALLBACK
:
1397 if (battery
->pdata
->ovp_uvlo_callback
)
1398 health
= battery
->pdata
->ovp_uvlo_callback();
1400 case SEC_BATTERY_OVP_UVLO_PMICPOLLING
:
1401 case SEC_BATTERY_OVP_UVLO_CHGPOLLING
:
1402 health
= sec_bat_ovp_uvlo_by_psy(battery
);
1404 case SEC_BATTERY_OVP_UVLO_PMICINT
:
1405 case SEC_BATTERY_OVP_UVLO_CHGINT
:
1406 /* nothing for interrupt check */
1411 /* Move the location for calling the get_health
1412 in case of attaching the jig */
1413 if (battery
->factory_mode
|| battery
->is_jig_on
) {
1414 dev_dbg(battery
->dev
,
1415 "%s: No need to check in factory mode\n",
1420 return sec_bat_ovp_uvlo_result(battery
, health
);
1423 static bool sec_bat_check_recharge(struct sec_battery_info
*battery
)
1425 #if defined(CONFIG_BATTERY_SWELLING)
1426 if (battery
->swelling_mode
== SWELLING_MODE_CHARGING
||
1427 battery
->swelling_mode
== SWELLING_MODE_FULL
) {
1428 pr_info("%s: Skip normal recharge check routine for swelling mode\n",
1433 if ((battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) &&
1434 (battery
->pdata
->full_condition_type
&
1435 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL
) &&
1436 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
1437 dev_info(battery
->dev
,
1438 "%s: Re-charging by NOTIMEFULL (%d)\n",
1439 __func__
, battery
->capacity
);
1440 goto check_recharge_check_count
;
1443 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
&&
1444 battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
) {
1445 int recharging_voltage
= battery
->pdata
->recharge_condition_vcell
;
1446 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
) {
1447 /* float voltage - 150mV */
1448 recharging_voltage
=\
1449 (battery
->pdata
->chg_float_voltage
/\
1450 battery
->pdata
->chg_float_voltage_conv
) - 150;
1451 dev_info(battery
->dev
, "%s: recharging voltage changed by low temp(%d)\n",
1452 __func__
, recharging_voltage
);
1454 dev_info(battery
->dev
, "%s: recharging voltage (%d)\n",
1455 __func__
, recharging_voltage
);
1457 if ((battery
->pdata
->recharge_condition_type
&
1458 SEC_BATTERY_RECHARGE_CONDITION_SOC
) &&
1459 (battery
->capacity
<=
1460 battery
->pdata
->recharge_condition_soc
)) {
1461 battery
->expired_time
= battery
->pdata
->recharging_expired_time
;
1462 battery
->prev_safety_time
= 0;
1463 dev_info(battery
->dev
,
1464 "%s: Re-charging by SOC (%d)\n",
1465 __func__
, battery
->capacity
);
1466 goto check_recharge_check_count
;
1469 if ((battery
->pdata
->recharge_condition_type
&
1470 SEC_BATTERY_RECHARGE_CONDITION_AVGVCELL
) &&
1471 (battery
->voltage_avg
<= recharging_voltage
)) {
1472 battery
->expired_time
= battery
->pdata
->recharging_expired_time
;
1473 battery
->prev_safety_time
= 0;
1474 dev_info(battery
->dev
,
1475 "%s: Re-charging by average VCELL (%d)\n",
1476 __func__
, battery
->voltage_avg
);
1477 goto check_recharge_check_count
;
1480 if ((battery
->pdata
->recharge_condition_type
&
1481 SEC_BATTERY_RECHARGE_CONDITION_VCELL
) &&
1482 (battery
->voltage_now
<= recharging_voltage
)) {
1483 battery
->expired_time
= battery
->pdata
->recharging_expired_time
;
1484 battery
->prev_safety_time
= 0;
1485 dev_info(battery
->dev
,
1486 "%s: Re-charging by VCELL (%d)\n",
1487 __func__
, battery
->voltage_now
);
1488 goto check_recharge_check_count
;
1492 battery
->recharge_check_cnt
= 0;
1495 check_recharge_check_count
:
1496 if (battery
->recharge_check_cnt
<
1497 battery
->pdata
->recharge_check_count
)
1498 battery
->recharge_check_cnt
++;
1499 dev_dbg(battery
->dev
,
1500 "%s: recharge count = %d\n",
1501 __func__
, battery
->recharge_check_cnt
);
1503 if (battery
->recharge_check_cnt
>=
1504 battery
->pdata
->recharge_check_count
)
1510 static bool sec_bat_voltage_check(struct sec_battery_info
*battery
)
1512 union power_supply_propval value
= {0, };
1514 if (battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
1515 dev_dbg(battery
->dev
,
1516 "%s: Charging Disabled\n", __func__
);
1520 /* OVP/UVLO check */
1521 if (sec_bat_ovp_uvlo(battery
)) {
1522 if (battery
->pdata
->ovp_uvlo_result_callback
)
1524 ovp_uvlo_result_callback(battery
->health
);
1528 if ((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
1529 #if defined(CONFIG_BATTERY_SWELLING)
1530 (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
||
1531 battery
->is_recharging
|| battery
->swelling_mode
)) {
1533 (battery
->charging_mode
== SEC_BATTERY_CHARGING_2ND
||
1534 battery
->is_recharging
)) {
1537 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
1538 POWER_SUPPLY_PROP_CAPACITY
, value
);
1540 battery
->pdata
->full_condition_soc
&&
1541 battery
->voltage_now
<
1542 (battery
->pdata
->recharge_condition_vcell
- 50)) {
1543 sec_bat_set_charging_status(battery
,
1544 POWER_SUPPLY_STATUS_CHARGING
);
1545 dev_info(battery
->dev
,
1546 "%s: battery status full -> charging, RepSOC(%d)\n", __func__
, value
.intval
);
1551 /* Re-Charging check */
1552 if (sec_bat_check_recharge(battery
)) {
1553 if (battery
->pdata
->full_check_type
!=
1554 SEC_BATTERY_FULLCHARGED_NONE
)
1555 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1557 battery
->charging_mode
= SEC_BATTERY_CHARGING_2ND
;
1558 battery
->is_recharging
= true;
1559 #if defined(CONFIG_BATTERY_CISD)
1560 battery
->cisd
.recharge_count
++;
1561 battery
->cisd
.recharge_count_2
++;
1562 battery
->cisd
.data
[CISD_DATA_RECHARGING_COUNT
]++;
1563 battery
->cisd
.data
[CISD_DATA_RECHARGING_COUNT_PER_DAY
]++;
1565 #if defined(CONFIG_BATTERY_SWELLING)
1566 if (!battery
->swelling_mode
)
1568 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1575 #if defined(CONFIG_BATTERY_SWELLING)
1576 static void sec_bat_swelling_check(struct sec_battery_info
*battery
)
1578 union power_supply_propval val
= {0, };
1579 int swelling_rechg_voltage
= battery
->pdata
->swelling_high_rechg_voltage
;
1580 bool en_swelling
= false, en_rechg
= false;
1581 int swelling_high_recovery
= battery
->pdata
->swelling_high_temp_recov
;
1583 if (is_wireless_type(battery
->cable_type
)) {
1584 swelling_high_recovery
= battery
->pdata
->swelling_wc_high_temp_recov
;
1586 pr_info("%s: swelling highblock(%d), highrecov(%d)\n", __func__
, battery
->pdata
->swelling_high_temp_block
, swelling_high_recovery
);
1588 psy_do_property(battery
->pdata
->charger_name
, get
,
1589 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
1591 pr_info("%s: status(%d), swell_mode(%d:%d:%d), cv(%d)mV, temp(%d)\n",
1592 __func__
, battery
->status
, battery
->swelling_mode
,
1593 battery
->charging_block
, (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
),
1594 val
.intval
, battery
->temperature
);
1597 under voltage over voltage, battery missing */
1598 if ((battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) ||\
1599 (battery
->status
== POWER_SUPPLY_STATUS_NOT_CHARGING
) ||
1600 battery
->skip_swelling
) {
1601 pr_debug("%s: DISCHARGING or NOT-CHARGING or 15 test mode. stop swelling mode\n", __func__
);
1602 battery
->swelling_mode
= SWELLING_MODE_NONE
;
1603 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1604 goto skip_swelling_check
;
1607 if (!battery
->swelling_mode
) {
1608 if (((battery
->temperature
>= battery
->pdata
->swelling_high_temp_block
) ||
1609 (battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_2nd
)) &&
1610 battery
->pdata
->temp_check_type
) {
1611 pr_info("%s: swelling mode start. stop charging\n", __func__
);
1612 battery
->swelling_mode
= SWELLING_MODE_CHARGING
;
1613 battery
->swelling_full_check_cnt
= 0;
1614 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
1616 if (battery
->temperature
>= battery
->pdata
->swelling_high_temp_block
) {
1617 #if defined(CONFIG_BATTERY_CISD)
1618 battery
->cisd
.data
[CISD_DATA_HIGH_TEMP_SWELLING
]++;
1619 battery
->cisd
.data
[CISD_DATA_HIGH_TEMP_SWELLING_PER_DAY
]++;
1621 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
,
1622 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1623 } else if (battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_2nd
) {
1624 #if defined(CONFIG_BATTERY_CISD)
1625 battery
->cisd
.data
[CISD_DATA_LOW_TEMP_SWELLING
]++;
1626 battery
->cisd
.data
[CISD_DATA_LOW_TEMP_SWELLING_PER_DAY
]++;
1628 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
,
1629 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1632 } else if ((battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_1st
) &&
1633 !(battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
)) {
1634 pr_info("%s: low temperature reduce current\n", __func__
);
1635 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP
,
1636 SEC_BAT_CURRENT_EVENT_LOW_TEMP
);
1637 } else if ((battery
->temperature
>= battery
->pdata
->swelling_low_temp_recov_1st
) &&
1638 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP
)) {
1639 pr_info("%s: normal temperature temperature recover current\n", __func__
);
1640 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_LOW_TEMP
);
1644 if (!battery
->voltage_now
)
1647 if (battery
->swelling_mode
) {
1648 if (battery
->temperature
<= battery
->pdata
->swelling_low_temp_recov_2nd
) {
1649 swelling_rechg_voltage
= battery
->pdata
->swelling_low_rechg_voltage
;
1652 if ((battery
->temperature
<= swelling_high_recovery
) &&
1653 (battery
->temperature
>= battery
->pdata
->swelling_low_temp_recov_2nd
)) {
1654 pr_info("%s: swelling mode end. restart charging\n", __func__
);
1655 battery
->swelling_mode
= SWELLING_MODE_NONE
;
1656 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1657 if ((battery
->temperature
<= battery
->pdata
->swelling_low_temp_block_1st
) ||
1658 ((battery
->temperature
< battery
->pdata
->swelling_low_temp_recov_1st
) &&
1659 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
))) {
1660 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP
,
1661 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1663 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1665 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1666 /* restore 4.4V float voltage */
1667 val
.intval
= battery
->pdata
->swelling_normal_float_voltage
;
1668 psy_do_property(battery
->pdata
->charger_name
, set
,
1669 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
1670 #if defined(CONFIG_BATTERY_CISD)
1671 battery
->cisd
.data
[CISD_DATA_SWELLING_RECOVERY_CNT
]++;
1672 battery
->cisd
.data
[CISD_DATA_SWELLING_RECOVERY_CNT_PER_DAY
]++;
1674 } else if (battery
->voltage_now
< swelling_rechg_voltage
&&
1675 battery
->charging_block
) {
1676 pr_info("%s: swelling mode recharging start. Vbatt(%d)\n",
1677 __func__
, battery
->voltage_now
);
1678 battery
->charging_mode
= SEC_BATTERY_CHARGING_1ST
;
1680 /* change drop float voltage */
1681 val
.intval
= battery
->pdata
->swelling_drop_float_voltage
;
1682 psy_do_property(battery
->pdata
->charger_name
, set
,
1683 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
1684 /* set charging enable */
1685 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
1686 if (battery
->temperature
< battery
->pdata
->swelling_low_temp_recov_2nd
) {
1687 pr_info("%s: swelling mode reduce charging current(LOW-temp:%d)\n",
1688 __func__
, battery
->temperature
);
1689 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
,
1690 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1691 } else if (battery
->temperature
> swelling_high_recovery
) {
1692 pr_info("%s: swelling mode reduce charging current(HIGH-temp:%d)\n",
1693 __func__
, battery
->temperature
);
1694 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
,
1695 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
1697 #if defined(CONFIG_BATTERY_CISD)
1698 battery
->cisd
.data
[CISD_DATA_SWELLING_CHARGING_COUNT
]++;
1699 battery
->cisd
.data
[CISD_DATA_SWELLING_CHARGING_COUNT_PER_DAY
]++;
1704 if (en_swelling
&& !en_rechg
) {
1705 pr_info("%s : SAFETY TIME RESET (SWELLING MODE CHARING STOP!)\n", __func__
);
1706 battery
->expired_time
= battery
->pdata
->expired_time
;
1707 battery
->prev_safety_time
= 0;
1710 skip_swelling_check
:
1711 dev_dbg(battery
->dev
, "%s end\n", __func__
);
1715 #if defined(CONFIG_BATTERY_AGE_FORECAST)
1716 static bool sec_bat_set_aging_step(struct sec_battery_info
*battery
, int step
)
1718 union power_supply_propval value
= {0, };
1720 if (battery
->pdata
->num_age_step
<= 0 || step
< 0 || step
>= battery
->pdata
->num_age_step
) {
1721 pr_info("%s: [AGE] abnormal age step : %d/%d\n",
1722 __func__
, step
, battery
->pdata
->num_age_step
-1);
1726 battery
->pdata
->age_step
= step
;
1729 battery
->pdata
->chg_float_voltage
=
1730 battery
->pdata
->age_data
[battery
->pdata
->age_step
].float_voltage
;
1731 battery
->pdata
->swelling_normal_float_voltage
=
1732 battery
->pdata
->chg_float_voltage
;
1733 if (!battery
->swelling_mode
) {
1734 value
.intval
= battery
->pdata
->chg_float_voltage
;
1735 psy_do_property(battery
->pdata
->charger_name
, set
,
1736 POWER_SUPPLY_PROP_VOLTAGE_MAX
, value
);
1739 /* full/recharge condition */
1740 battery
->pdata
->recharge_condition_vcell
=
1741 battery
->pdata
->age_data
[battery
->pdata
->age_step
].recharge_condition_vcell
;
1742 battery
->pdata
->full_condition_soc
=
1743 battery
->pdata
->age_data
[battery
->pdata
->age_step
].full_condition_soc
;
1744 battery
->pdata
->full_condition_vcell
=
1745 battery
->pdata
->age_data
[battery
->pdata
->age_step
].full_condition_vcell
;
1747 value
.intval
= battery
->pdata
->full_condition_soc
;
1748 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
1749 POWER_SUPPLY_PROP_CAPACITY_LEVEL
, value
);
1751 dev_info(battery
->dev
,
1752 "%s: Step(%d/%d), Cycle(%d), float_v(%d), r_v(%d), f_s(%d), f_vl(%d)\n",
1754 battery
->pdata
->age_step
, battery
->pdata
->num_age_step
-1, battery
->batt_cycle
,
1755 battery
->pdata
->chg_float_voltage
,
1756 battery
->pdata
->recharge_condition_vcell
,
1757 battery
->pdata
->full_condition_soc
,
1758 battery
->pdata
->full_condition_vcell
);
1763 static void sec_bat_aging_check(struct sec_battery_info
*battery
)
1765 int prev_step
= battery
->pdata
->age_step
;
1769 if (battery
->pdata
->num_age_step
<= 0 || battery
->batt_cycle
< 0)
1772 if (battery
->temperature
< 50) {
1773 pr_info("%s: [AGE] skip (temperature:%d)\n", __func__
, battery
->temperature
);
1777 for (calc_step
= battery
->pdata
->num_age_step
- 1; calc_step
>= 0; calc_step
--) {
1778 if (battery
->pdata
->age_data
[calc_step
].cycle
<= battery
->batt_cycle
)
1782 if (calc_step
== prev_step
)
1785 ret
= sec_bat_set_aging_step(battery
, calc_step
);
1786 dev_info(battery
->dev
,
1787 "%s: %s change step (%d->%d), Cycle(%d)\n",
1788 __func__
, ret
? "Succeed in" : "Fail to",
1789 prev_step
, battery
->pdata
->age_step
, battery
->batt_cycle
);
1793 static bool sec_bat_temperature(
1794 struct sec_battery_info
*battery
)
1799 if (is_wireless_type(battery
->cable_type
)) {
1800 battery
->temp_highlimit_threshold
=
1801 battery
->pdata
->temp_highlimit_threshold_normal
;
1802 battery
->temp_highlimit_recovery
=
1803 battery
->pdata
->temp_highlimit_recovery_normal
;
1804 battery
->temp_high_threshold
=
1805 battery
->pdata
->wpc_high_threshold_normal
;
1806 battery
->temp_high_recovery
=
1807 battery
->pdata
->wpc_high_recovery_normal
;
1808 battery
->temp_low_recovery
=
1809 battery
->pdata
->wpc_low_recovery_normal
;
1810 battery
->temp_low_threshold
=
1811 battery
->pdata
->wpc_low_threshold_normal
;
1814 battery
->temp_highlimit_threshold
=
1815 battery
->pdata
->temp_highlimit_threshold_lpm
;
1816 battery
->temp_highlimit_recovery
=
1817 battery
->pdata
->temp_highlimit_recovery_lpm
;
1818 battery
->temp_high_threshold
=
1819 battery
->pdata
->temp_high_threshold_lpm
;
1820 battery
->temp_high_recovery
=
1821 battery
->pdata
->temp_high_recovery_lpm
;
1822 battery
->temp_low_recovery
=
1823 battery
->pdata
->temp_low_recovery_lpm
;
1824 battery
->temp_low_threshold
=
1825 battery
->pdata
->temp_low_threshold_lpm
;
1827 battery
->temp_highlimit_threshold
=
1828 battery
->pdata
->temp_highlimit_threshold_normal
;
1829 battery
->temp_highlimit_recovery
=
1830 battery
->pdata
->temp_highlimit_recovery_normal
;
1831 battery
->temp_high_threshold
=
1832 battery
->pdata
->temp_high_threshold_normal
;
1833 battery
->temp_high_recovery
=
1834 battery
->pdata
->temp_high_recovery_normal
;
1835 battery
->temp_low_recovery
=
1836 battery
->pdata
->temp_low_recovery_normal
;
1837 battery
->temp_low_threshold
=
1838 battery
->pdata
->temp_low_threshold_normal
;
1841 dev_info(battery
->dev
,
1842 "%s: HLT(%d) HLR(%d) HT(%d), HR(%d), LT(%d), LR(%d)\n",
1843 __func__
, battery
->temp_highlimit_threshold
,
1844 battery
->temp_highlimit_recovery
,
1845 battery
->temp_high_threshold
,
1846 battery
->temp_high_recovery
,
1847 battery
->temp_low_threshold
,
1848 battery
->temp_low_recovery
);
1852 static bool sec_bat_temperature_check(
1853 struct sec_battery_info
*battery
)
1856 int pre_health
= POWER_SUPPLY_HEALTH_GOOD
;
1858 if (battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
1859 battery
->health_change
= false;
1860 dev_dbg(battery
->dev
,
1861 "%s: Charging Disabled\n", __func__
);
1865 if (battery
->health
!= POWER_SUPPLY_HEALTH_GOOD
&&
1866 battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEAT
&&
1867 battery
->health
!= POWER_SUPPLY_HEALTH_COLD
&&
1868 battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
1869 dev_dbg(battery
->dev
, "%s: No need to check\n", __func__
);
1873 #if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
1874 if (!battery
->cooldown_mode
) {
1875 dev_err(battery
->dev
, "%s: Forced temp check block\n", __func__
);
1880 sec_bat_temperature(battery
);
1882 switch (battery
->pdata
->temp_check_type
) {
1883 case SEC_BATTERY_TEMP_CHECK_ADC
:
1884 temp_value
= battery
->temp_adc
;
1886 case SEC_BATTERY_TEMP_CHECK_TEMP
:
1887 temp_value
= battery
->temperature
;
1890 dev_err(battery
->dev
,
1891 "%s: Invalid Temp Check Type\n", __func__
);
1894 pre_health
= battery
->health
;
1896 if (battery
->pdata
->usb_thermal_source
&& (battery
->usb_temp
>= battery
->temp_highlimit_threshold
)) {
1897 if (battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
1898 if (battery
->temp_highlimit_cnt
<
1899 battery
->pdata
->temp_check_count
) {
1900 battery
->temp_highlimit_cnt
++;
1901 battery
->temp_high_cnt
= 0;
1902 battery
->temp_low_cnt
= 0;
1903 battery
->temp_recover_cnt
= 0;
1905 dev_err(battery
->dev
,
1906 "%s: usb therm highlimit count = %d\n",
1907 __func__
, battery
->temp_highlimit_cnt
);
1909 } else if (battery
->pdata
->usb_thermal_source
&& (battery
->usb_temp
> battery
->temp_highlimit_recovery
)
1910 && (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
)) {
1911 dev_err(battery
->dev
,
1912 "%s: usb therm highlimit \n",__func__
);
1913 } else if (temp_value
>= battery
->temp_highlimit_threshold
&& !battery
->pdata
->usb_thermal_source
) {
1914 if (battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
1915 if (battery
->temp_highlimit_cnt
<
1916 battery
->pdata
->temp_check_count
) {
1917 battery
->temp_highlimit_cnt
++;
1918 battery
->temp_high_cnt
= 0;
1919 battery
->temp_low_cnt
= 0;
1920 battery
->temp_recover_cnt
= 0;
1922 dev_err(battery
->dev
,
1923 "%s: highlimit count = %d\n",
1924 __func__
, battery
->temp_highlimit_cnt
);
1926 } else if (temp_value
>= battery
->temp_high_threshold
) {
1927 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
&& !battery
->pdata
->usb_thermal_source
) {
1928 if (temp_value
<= battery
->temp_highlimit_recovery
) {
1929 if (battery
->temp_recover_cnt
<
1930 battery
->pdata
->temp_check_count
) {
1931 battery
->temp_recover_cnt
++;
1932 battery
->temp_highlimit_cnt
= 0;
1933 battery
->temp_high_cnt
= 0;
1934 battery
->temp_low_cnt
= 0;
1936 dev_err(battery
->dev
,
1937 "%s: recovery count = %d\n",
1938 __func__
, battery
->temp_recover_cnt
);
1940 } else if (battery
->health
!= POWER_SUPPLY_HEALTH_OVERHEAT
) {
1941 if (battery
->temp_high_cnt
<
1942 battery
->pdata
->temp_check_count
) {
1943 battery
->temp_high_cnt
++;
1944 battery
->temp_highlimit_cnt
= 0;
1945 battery
->temp_low_cnt
= 0;
1946 battery
->temp_recover_cnt
= 0;
1948 dev_err(battery
->dev
,
1949 "%s: high count = %d\n",
1950 __func__
, battery
->temp_high_cnt
);
1952 } else if ((temp_value
<= battery
->temp_high_recovery
) &&
1953 (temp_value
>= battery
->temp_low_recovery
)) {
1954 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
||
1955 battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
||
1956 battery
->health
== POWER_SUPPLY_HEALTH_COLD
) {
1957 if (battery
->temp_recover_cnt
<
1958 battery
->pdata
->temp_check_count
) {
1959 battery
->temp_recover_cnt
++;
1960 battery
->temp_highlimit_cnt
= 0;
1961 battery
->temp_high_cnt
= 0;
1962 battery
->temp_low_cnt
= 0;
1964 dev_err(battery
->dev
,
1965 "%s: recovery count = %d\n",
1966 __func__
, battery
->temp_recover_cnt
);
1968 } else if (temp_value
<= battery
->temp_low_threshold
) {
1969 if (battery
->health
!= POWER_SUPPLY_HEALTH_COLD
) {
1970 if (battery
->temp_low_cnt
<
1971 battery
->pdata
->temp_check_count
) {
1972 battery
->temp_low_cnt
++;
1973 battery
->temp_highlimit_cnt
= 0;
1974 battery
->temp_high_cnt
= 0;
1975 battery
->temp_recover_cnt
= 0;
1977 dev_err(battery
->dev
,
1978 "%s: low count = %d\n",
1979 __func__
, battery
->temp_low_cnt
);
1982 battery
->temp_highlimit_cnt
= 0;
1983 battery
->temp_high_cnt
= 0;
1984 battery
->temp_low_cnt
= 0;
1985 battery
->temp_recover_cnt
= 0;
1988 if (battery
->temp_highlimit_cnt
>=
1989 battery
->pdata
->temp_check_count
) {
1990 battery
->health
= POWER_SUPPLY_HEALTH_OVERHEATLIMIT
;
1991 battery
->temp_highlimit_cnt
= 0;
1992 } else if (battery
->temp_high_cnt
>=
1993 battery
->pdata
->temp_check_count
) {
1994 battery
->health
= POWER_SUPPLY_HEALTH_OVERHEAT
;
1995 battery
->temp_high_cnt
= 0;
1996 } else if (battery
->temp_low_cnt
>=
1997 battery
->pdata
->temp_check_count
) {
1998 battery
->health
= POWER_SUPPLY_HEALTH_COLD
;
1999 battery
->temp_low_cnt
= 0;
2000 } else if (battery
->temp_recover_cnt
>=
2001 battery
->pdata
->temp_check_count
) {
2002 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
&&
2003 temp_value
> battery
->temp_high_recovery
) {
2004 battery
->health
= POWER_SUPPLY_HEALTH_OVERHEAT
;
2006 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
2008 battery
->temp_recover_cnt
= 0;
2010 if (pre_health
!= battery
->health
) {
2011 battery
->health_change
= true;
2012 dev_info(battery
->dev
, "%s, health_change true\n", __func__
);
2013 #if defined(CONFIG_BATTERY_SBM_DATA)
2014 sec_bat_add_sbm_data(battery
, SBM_DATA_TEMP
);
2017 battery
->health_change
= false;
2020 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
) ||
2021 (battery
->health
== POWER_SUPPLY_HEALTH_COLD
) ||
2022 (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
)) {
2023 union power_supply_propval val
= {0, };
2024 if (battery
->health_change
) {
2025 battery
->is_abnormal_temp
= true;
2026 if (is_wireless_type(battery
->cable_type
)) {
2027 val
.intval
= battery
->health
;
2028 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
2029 POWER_SUPPLY_PROP_HEALTH
, val
);
2031 dev_info(battery
->dev
,
2032 "%s: Unsafe Temperature\n", __func__
);
2033 sec_bat_set_charging_status(battery
,
2034 POWER_SUPPLY_STATUS_NOT_CHARGING
);
2035 #if defined(CONFIG_BATTERY_CISD)
2036 battery
->cisd
.data
[CISD_DATA_UNSAFETY_TEMPERATURE
]++;
2037 battery
->cisd
.data
[CISD_DATA_UNSAFE_TEMPERATURE_PER_DAY
]++;
2040 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
) {
2041 /* change charging current to battery (default 0mA) */
2042 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
2043 if (is_hv_afc_wire_type(battery
->cable_type
) && !battery
->vbus_limit
) {
2044 #if defined(CONFIG_MUIC_HV) || defined(CONFIG_SUPPORT_QC30)
2045 muic_afc_set_voltage(SEC_INPUT_VOLTAGE_0V
);
2047 battery
->vbus_limit
= true;
2048 pr_info("%s: Set AFC TA to 0V\n", __func__
);
2050 } else if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
) {
2051 /* to discharge battery */
2052 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
2054 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2059 /* dose not need buck control at low temperature */
2060 if (battery
->health
== POWER_SUPPLY_HEALTH_OVERHEATLIMIT
||
2061 battery
->health
== POWER_SUPPLY_HEALTH_OVERHEAT
) {
2062 if((battery
->charger_mode
== SEC_BAT_CHG_MODE_BUCK_OFF
) &&
2063 (battery
->voltage_now
< (battery
->pdata
->swelling_drop_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
))) {
2064 pr_info("%s: Vnow(%dmV) < %dmV has dropped enough to get buck on mode \n", __func__
,
2065 battery
->voltage_now
,
2066 (battery
->pdata
->swelling_drop_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
));
2067 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2071 /* if recovered from not charging */
2072 if ((battery
->health
== POWER_SUPPLY_HEALTH_GOOD
) &&
2074 POWER_SUPPLY_STATUS_NOT_CHARGING
)) {
2075 battery
->is_abnormal_temp
= false;
2076 dev_info(battery
->dev
,
2077 "%s: Safe Temperature\n", __func__
);
2078 if (battery
->capacity
>= 100)
2079 sec_bat_set_charging_status(battery
,
2080 POWER_SUPPLY_STATUS_FULL
);
2081 else /* Normal Charging */
2082 sec_bat_set_charging_status(battery
,
2083 POWER_SUPPLY_STATUS_CHARGING
);
2084 #if defined(CONFIG_BATTERY_SWELLING)
2085 if ((temp_value
> battery
->pdata
->swelling_high_temp_recov
) ||
2086 (temp_value
< battery
->pdata
->swelling_low_temp_recov_2nd
)) {
2087 pr_info("%s: swelling mode start. stop charging\n", __func__
);
2088 battery
->swelling_mode
= SWELLING_MODE_CHARGING
;
2089 battery
->swelling_full_check_cnt
= 0;
2090 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
2091 if (battery
->temperature
> battery
->pdata
->swelling_high_temp_recov
) {
2092 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
,
2093 SEC_BAT_CURRENT_EVENT_HIGH_TEMP_SWELLING
);
2094 } else if (battery
->temperature
< battery
->pdata
->swelling_low_temp_recov_2nd
) {
2095 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
,
2096 SEC_BAT_CURRENT_EVENT_LOW_TEMP_SWELLING
);
2099 union power_supply_propval val
= {0, };
2100 /* restore 4.4V float voltage */
2101 val
.intval
= battery
->pdata
->swelling_normal_float_voltage
;
2102 psy_do_property(battery
->pdata
->charger_name
, set
,
2103 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
2104 /* turn on charger by cable type */
2105 if((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
2106 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
2107 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2109 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2112 if (temp_value
<= battery
->pdata
->swelling_low_temp_block_1st
||
2113 ((temp_value
< battery
->pdata
->swelling_low_temp_recov_1st
) &&
2114 (pre_health
== POWER_SUPPLY_HEALTH_COLD
))) {
2115 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_LOW_TEMP
,
2116 SEC_BAT_CURRENT_EVENT_SWELLING_MODE
);
2120 /* turn on charger by cable type */
2121 if((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
2122 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
)) {
2123 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2125 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2134 static bool sec_bat_check_fullcharged_condition(
2135 struct sec_battery_info
*battery
)
2137 int full_check_type
= SEC_BATTERY_FULLCHARGED_NONE
;
2139 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
)
2140 full_check_type
= battery
->pdata
->full_check_type
;
2142 full_check_type
= battery
->pdata
->full_check_type_2nd
;
2144 switch (full_check_type
) {
2145 case SEC_BATTERY_FULLCHARGED_ADC
:
2146 case SEC_BATTERY_FULLCHARGED_FG_CURRENT
:
2147 case SEC_BATTERY_FULLCHARGED_SOC
:
2148 case SEC_BATTERY_FULLCHARGED_CHGGPIO
:
2149 case SEC_BATTERY_FULLCHARGED_CHGPSY
:
2152 /* If these is NOT full check type or NONE full check type,
2153 * it is full-charged
2155 case SEC_BATTERY_FULLCHARGED_CHGINT
:
2156 case SEC_BATTERY_FULLCHARGED_TIME
:
2157 case SEC_BATTERY_FULLCHARGED_NONE
:
2163 if (battery
->pdata
->full_condition_type
&
2164 SEC_BATTERY_FULL_CONDITION_SOC
) {
2165 if (battery
->capacity
<
2166 battery
->pdata
->full_condition_soc
) {
2167 dev_dbg(battery
->dev
,
2168 "%s: Not enough SOC (%d%%)\n",
2169 __func__
, battery
->capacity
);
2174 if (battery
->pdata
->full_condition_type
&
2175 SEC_BATTERY_FULL_CONDITION_VCELL
) {
2176 if (battery
->voltage_now
<
2177 battery
->pdata
->full_condition_vcell
) {
2178 dev_dbg(battery
->dev
,
2179 "%s: Not enough VCELL (%dmV)\n",
2180 __func__
, battery
->voltage_now
);
2185 if (battery
->pdata
->full_condition_type
&
2186 SEC_BATTERY_FULL_CONDITION_AVGVCELL
) {
2187 if (battery
->voltage_avg
<
2188 battery
->pdata
->full_condition_avgvcell
) {
2189 dev_dbg(battery
->dev
,
2190 "%s: Not enough AVGVCELL (%dmV)\n",
2191 __func__
, battery
->voltage_avg
);
2196 if (battery
->pdata
->full_condition_type
&
2197 SEC_BATTERY_FULL_CONDITION_OCV
) {
2198 if (battery
->voltage_ocv
<
2199 battery
->pdata
->full_condition_ocv
) {
2200 dev_dbg(battery
->dev
,
2201 "%s: Not enough OCV (%dmV)\n",
2202 __func__
, battery
->voltage_ocv
);
2210 static void sec_bat_do_test_function(
2211 struct sec_battery_info
*battery
)
2213 union power_supply_propval value
= {0, };
2215 switch (battery
->test_mode
) {
2217 if (battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) {
2218 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2219 sec_bat_set_charging_status(battery
,
2220 POWER_SUPPLY_STATUS_DISCHARGING
);
2224 if(battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
2225 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2226 psy_do_property(battery
->pdata
->charger_name
, get
,
2227 POWER_SUPPLY_PROP_STATUS
, value
);
2228 sec_bat_set_charging_status(battery
, value
.intval
);
2230 battery
->test_mode
= 0;
2232 case 3: // clear temp block
2233 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
2234 sec_bat_set_charging_status(battery
,
2235 POWER_SUPPLY_STATUS_DISCHARGING
);
2238 if(battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
2239 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2240 psy_do_property(battery
->pdata
->charger_name
, get
,
2241 POWER_SUPPLY_PROP_STATUS
, value
);
2242 sec_bat_set_charging_status(battery
, value
.intval
);
2246 pr_info("%s: error test: unknown state\n", __func__
);
2251 static bool sec_bat_time_management(
2252 struct sec_battery_info
*battery
)
2254 struct timespec ts
= {0, };
2255 unsigned long charging_time
;
2257 if (battery
->charging_start_time
== 0 || !battery
->safety_timer_set
) {
2258 dev_dbg(battery
->dev
,
2259 "%s: Charging Disabled\n", __func__
);
2263 get_monotonic_boottime(&ts
);
2265 if (ts
.tv_sec
>= battery
->charging_start_time
) {
2266 charging_time
= ts
.tv_sec
- battery
->charging_start_time
;
2268 charging_time
= 0xFFFFFFFF - battery
->charging_start_time
2272 battery
->charging_passed_time
= charging_time
;
2274 switch (battery
->status
) {
2275 case POWER_SUPPLY_STATUS_FULL
:
2276 if (battery
->expired_time
== 0) {
2277 dev_info(battery
->dev
,
2278 "%s: Recharging Timer Expired\n", __func__
);
2279 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2280 battery
->health
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
2281 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
2282 battery
->is_recharging
= false;
2283 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
)) {
2284 dev_err(battery
->dev
,
2285 "%s: Fail to Set Charger\n", __func__
);
2292 case POWER_SUPPLY_STATUS_CHARGING
:
2293 if ((battery
->pdata
->full_condition_type
&
2294 SEC_BATTERY_FULL_CONDITION_NOTIMEFULL
) &&
2295 (battery
->is_recharging
&& (battery
->expired_time
== 0))) {
2296 dev_info(battery
->dev
,
2297 "%s: Recharging Timer Expired\n", __func__
);
2298 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2299 battery
->health
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
2300 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
2301 battery
->is_recharging
= false;
2302 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
)) {
2303 dev_err(battery
->dev
,
2304 "%s: Fail to Set Charger\n", __func__
);
2308 } else if (!battery
->is_recharging
&&
2309 (battery
->expired_time
== 0)) {
2310 dev_info(battery
->dev
,
2311 "%s: Charging Timer Expired\n", __func__
);
2312 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2313 battery
->health
= POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE
;
2314 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
2315 #if defined(CONFIG_BATTERY_CISD)
2316 battery
->cisd
.data
[CISD_DATA_SAFETY_TIMER
]++;
2317 battery
->cisd
.data
[CISD_DATA_SAFETY_TIMER_PER_DAY
]++;
2319 #if defined(CONFIG_SEC_ABC)
2320 sec_abc_send_event("MODULE=battery@ERROR=safety_timer");
2322 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
)) {
2323 dev_err(battery
->dev
,
2324 "%s: Fail to Set Charger\n", __func__
);
2331 dev_err(battery
->dev
,
2332 "%s: Undefine Battery Status\n", __func__
);
2339 static bool sec_bat_check_fullcharged(
2340 struct sec_battery_info
*battery
)
2342 union power_supply_propval value
= {0, };
2343 int current_adc
= 0;
2344 int full_check_type
= SEC_BATTERY_FULLCHARGED_NONE
;
2348 if (!sec_bat_check_fullcharged_condition(battery
))
2349 goto not_full_charged
;
2351 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
)
2352 full_check_type
= battery
->pdata
->full_check_type
;
2354 full_check_type
= battery
->pdata
->full_check_type_2nd
;
2356 switch (full_check_type
) {
2357 case SEC_BATTERY_FULLCHARGED_ADC
:
2359 sec_bat_get_adc_data(battery
,
2360 SEC_BAT_ADC_CHANNEL_FULL_CHECK
,
2361 battery
->pdata
->adc_check_count
);
2363 dev_dbg(battery
->dev
,
2364 "%s: Current ADC (%d)\n",
2365 __func__
, current_adc
);
2367 if (current_adc
< 0)
2369 battery
->current_adc
= current_adc
;
2371 if (battery
->current_adc
<
2372 (battery
->charging_mode
==
2373 SEC_BATTERY_CHARGING_1ST
?
2374 battery
->pdata
->full_check_current_1st
:
2375 battery
->pdata
->full_check_current_2nd
)) {
2376 battery
->full_check_cnt
++;
2377 dev_dbg(battery
->dev
,
2378 "%s: Full Check ADC (%d)\n",
2380 battery
->full_check_cnt
);
2382 battery
->full_check_cnt
= 0;
2385 case SEC_BATTERY_FULLCHARGED_FG_CURRENT
:
2386 if ((battery
->current_now
> 0 && battery
->current_now
<
2387 battery
->pdata
->full_check_current_1st
) &&
2388 (battery
->current_avg
> 0 && battery
->current_avg
<
2389 (battery
->charging_mode
==
2390 SEC_BATTERY_CHARGING_1ST
?
2391 battery
->pdata
->full_check_current_1st
:
2392 battery
->pdata
->full_check_current_2nd
))) {
2393 battery
->full_check_cnt
++;
2394 dev_dbg(battery
->dev
,
2395 "%s: Full Check Current (%d)\n",
2397 battery
->full_check_cnt
);
2399 battery
->full_check_cnt
= 0;
2402 case SEC_BATTERY_FULLCHARGED_TIME
:
2403 if ((battery
->charging_mode
==
2404 SEC_BATTERY_CHARGING_2ND
?
2405 (battery
->charging_passed_time
-
2406 battery
->charging_fullcharged_time
) :
2407 battery
->charging_passed_time
) >
2408 (battery
->charging_mode
==
2409 SEC_BATTERY_CHARGING_1ST
?
2410 battery
->pdata
->full_check_current_1st
:
2411 battery
->pdata
->full_check_current_2nd
)) {
2412 battery
->full_check_cnt
++;
2413 dev_dbg(battery
->dev
,
2414 "%s: Full Check Time (%d)\n",
2416 battery
->full_check_cnt
);
2418 battery
->full_check_cnt
= 0;
2421 case SEC_BATTERY_FULLCHARGED_SOC
:
2422 if (battery
->capacity
<=
2423 (battery
->charging_mode
==
2424 SEC_BATTERY_CHARGING_1ST
?
2425 battery
->pdata
->full_check_current_1st
:
2426 battery
->pdata
->full_check_current_2nd
)) {
2427 battery
->full_check_cnt
++;
2428 dev_dbg(battery
->dev
,
2429 "%s: Full Check SOC (%d)\n",
2431 battery
->full_check_cnt
);
2433 battery
->full_check_cnt
= 0;
2436 case SEC_BATTERY_FULLCHARGED_CHGGPIO
:
2438 battery
->pdata
->chg_gpio_full_check
,
2441 dev_err(battery
->dev
,
2442 "%s: Error in Request of GPIO\n", __func__
);
2445 if (!(gpio_get_value_cansleep(
2446 battery
->pdata
->chg_gpio_full_check
) ^
2447 !battery
->pdata
->chg_polarity_full_check
)) {
2448 battery
->full_check_cnt
++;
2449 dev_dbg(battery
->dev
,
2450 "%s: Full Check GPIO (%d)\n",
2451 __func__
, battery
->full_check_cnt
);
2453 battery
->full_check_cnt
= 0;
2454 gpio_free(battery
->pdata
->chg_gpio_full_check
);
2457 case SEC_BATTERY_FULLCHARGED_CHGINT
:
2458 case SEC_BATTERY_FULLCHARGED_CHGPSY
:
2459 psy_do_property(battery
->pdata
->charger_name
, get
,
2460 POWER_SUPPLY_PROP_STATUS
, value
);
2462 if (value
.intval
== POWER_SUPPLY_STATUS_FULL
) {
2463 battery
->full_check_cnt
++;
2464 dev_info(battery
->dev
,
2465 "%s: Full Check Charger (%d)\n",
2466 __func__
, battery
->full_check_cnt
);
2468 battery
->full_check_cnt
= 0;
2471 /* If these is NOT full check type or NONE full check type,
2472 * it is full-charged
2474 case SEC_BATTERY_FULLCHARGED_NONE
:
2475 battery
->full_check_cnt
= 0;
2479 dev_err(battery
->dev
,
2480 "%s: Invalid Full Check\n", __func__
);
2484 if (battery
->full_check_cnt
>=
2485 battery
->pdata
->full_check_count
) {
2486 battery
->full_check_cnt
= 0;
2494 static void sec_bat_do_fullcharged(
2495 struct sec_battery_info
*battery
)
2497 union power_supply_propval value
= {0, };
2499 /* To let charger/fuel gauge know the full status,
2500 * set status before calling sec_bat_set_charge()
2502 #if defined(CONFIG_BATTERY_CISD)
2503 struct timespec now_ts
;
2505 if (battery
->status
!= POWER_SUPPLY_STATUS_FULL
) {
2506 battery
->cisd
.data
[CISD_DATA_FULL_COUNT
]++;
2507 battery
->cisd
.data
[CISD_DATA_FULL_COUNT_PER_DAY
]++;
2510 sec_bat_set_charging_status(battery
,
2511 POWER_SUPPLY_STATUS_FULL
);
2513 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
&&
2514 battery
->pdata
->full_check_type_2nd
!= SEC_BATTERY_FULLCHARGED_NONE
) {
2515 battery
->charging_mode
= SEC_BATTERY_CHARGING_2ND
;
2516 battery
->charging_fullcharged_time
= battery
->charging_passed_time
;
2517 value
.intval
= SEC_BAT_CHG_MODE_CHARGING_OFF
;
2518 psy_do_property(battery
->pdata
->charger_name
, set
,
2519 POWER_SUPPLY_PROP_CHARGING_ENABLED
, value
);
2520 sec_bat_set_charging_current(battery
);
2521 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
2522 #if defined(CONFIG_BATTERY_SBM_DATA)
2523 sec_bat_add_sbm_data(battery
, SBM_DATA_FULL_1ST
);
2526 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
2527 #if defined(CONFIG_BATTERY_CISD)
2528 now_ts
= ktime_to_timespec(ktime_get_boottime());
2529 if (!battery
->is_recharging
) {
2530 battery
->cisd
.charging_end_time
= now_ts
.tv_sec
;
2532 if (battery
->siop_level
== 100) {
2533 dev_info(battery
->dev
, "%s: cisd - leakage EFGH start(%ld)\n", __func__
, ((unsigned long)now_ts
.tv_sec
));
2534 battery
->cisd
.state
&= ~(CISD_STATE_LEAK_E
|CISD_STATE_LEAK_F
|CISD_STATE_LEAK_G
);
2535 battery
->cisd
.charging_end_time_2
= now_ts
.tv_sec
;
2536 battery
->cisd
.recharge_count_2
= 0;
2538 battery
->cisd
.state
&= ~(CISD_STATE_LEAK_E
|CISD_STATE_LEAK_F
|CISD_STATE_LEAK_G
);
2539 battery
->cisd
.recharge_count_2
= 0;
2540 battery
->cisd
.charging_end_time_2
= 0;
2543 battery
->is_recharging
= false;
2545 if (!battery
->wdt_kick_disable
) {
2546 pr_info("%s: wdt kick enable -> Charger Off, %d\n",
2547 __func__
, battery
->wdt_kick_disable
);
2548 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
2550 pr_info("%s: wdt kick disabled -> skip charger off, %d\n",
2551 __func__
, battery
->wdt_kick_disable
);
2554 #if defined(CONFIG_BATTERY_AGE_FORECAST)
2555 sec_bat_aging_check(battery
);
2558 value
.intval
= POWER_SUPPLY_STATUS_FULL
;
2559 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2560 POWER_SUPPLY_PROP_STATUS
, value
);
2561 #if defined(CONFIG_BATTERY_SBM_DATA)
2562 sec_bat_add_sbm_data(battery
, SBM_DATA_FULL_2ND
);
2566 /* platform can NOT get information of battery
2567 * because wakeup time is too short to check uevent
2568 * To make sure that target is wakeup if full-charged,
2569 * activated wake lock in a few seconds
2571 if (battery
->pdata
->polling_type
== SEC_BATTERY_MONITOR_ALARM
)
2572 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
2575 static bool sec_bat_fullcharged_check(
2576 struct sec_battery_info
*battery
)
2578 if ((battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
) ||
2579 (battery
->status
== POWER_SUPPLY_STATUS_NOT_CHARGING
)) {
2580 dev_dbg(battery
->dev
,
2581 "%s: No Need to Check Full-Charged\n", __func__
);
2585 if (sec_bat_check_fullcharged(battery
)) {
2586 union power_supply_propval value
= {0, };
2587 if (battery
->capacity
< 100) {
2588 battery
->full_check_cnt
= battery
->pdata
->full_check_count
;
2590 sec_bat_do_fullcharged(battery
);
2593 /* update capacity max */
2594 value
.intval
= battery
->capacity
;
2595 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2596 POWER_SUPPLY_PROP_CHARGE_FULL
, value
);
2597 pr_info("%s : forced full-charged sequence for the capacity(%d)\n",
2598 __func__
, battery
->capacity
);
2601 dev_info(battery
->dev
,
2602 "%s: Charging Mode : %s\n", __func__
,
2603 battery
->is_recharging
?
2604 sec_bat_charging_mode_str
[SEC_BATTERY_CHARGING_RECHARGING
] :
2605 sec_bat_charging_mode_str
[battery
->charging_mode
]);
2610 static void sec_bat_get_temperature_info(
2611 struct sec_battery_info
*battery
)
2613 union power_supply_propval value
= {0, };
2615 switch (battery
->pdata
->thermal_source
) {
2616 case SEC_BATTERY_THERMAL_SOURCE_FG
:
2617 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2618 POWER_SUPPLY_PROP_TEMP
, value
);
2619 battery
->temperature
= value
.intval
;
2621 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2622 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
2623 battery
->temper_amb
= value
.intval
;
2625 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK
:
2626 if (battery
->pdata
->get_temperature_callback
) {
2627 battery
->pdata
->get_temperature_callback(
2628 POWER_SUPPLY_PROP_TEMP
, &value
);
2629 battery
->temperature
= value
.intval
;
2630 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2631 POWER_SUPPLY_PROP_TEMP
, value
);
2633 battery
->pdata
->get_temperature_callback(
2634 POWER_SUPPLY_PROP_TEMP_AMBIENT
, &value
);
2635 battery
->temper_amb
= value
.intval
;
2636 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2637 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
2640 case SEC_BATTERY_THERMAL_SOURCE_ADC
:
2641 sec_bat_get_value_by_adc(battery
,
2642 SEC_BAT_ADC_CHANNEL_TEMP
, &value
);
2643 battery
->temperature
= value
.intval
;
2645 sec_bat_get_value_by_adc(battery
,
2646 SEC_BAT_ADC_CHANNEL_TEMP_AMBIENT
, &value
);
2647 battery
->temper_amb
= value
.intval
;
2649 if (battery
->pdata
->usb_thermal_source
) {
2650 sec_bat_get_value_by_adc(battery
,
2651 SEC_BAT_ADC_CHANNEL_USB_TEMP
, &value
);
2652 battery
->usb_temp
= value
.intval
;
2653 if (battery
->vbus_limit
&& battery
->usb_temp
<= battery
->temp_highlimit_recovery
)
2654 battery
->vbus_limit
= false;
2657 if (battery
->pdata
->chg_thermal_source
) {
2658 sec_bat_get_value_by_adc(battery
,
2659 SEC_BAT_ADC_CHANNEL_CHG_TEMP
, &value
);
2660 battery
->chg_temp
= value
.intval
;
2663 if (battery
->pdata
->wpc_thermal_source
) {
2664 sec_bat_get_value_by_adc(battery
,
2665 SEC_BAT_ADC_CHANNEL_WPC_TEMP
, &value
);
2666 battery
->wpc_temp
= value
.intval
;
2667 battery
->coil_temp
= value
.intval
;
2670 if (battery
->pdata
->slave_thermal_source
) {
2671 sec_bat_get_value_by_adc(battery
,
2672 SEC_BAT_ADC_CHANNEL_SLAVE_CHG_TEMP
, &value
);
2673 battery
->slave_chg_temp
= value
.intval
;
2675 /* set temperature */
2676 value
.intval
= ((battery
->slave_chg_temp
) << 16) | (battery
->chg_temp
);
2677 psy_do_property(battery
->pdata
->charger_name
, set
,
2678 POWER_SUPPLY_PROP_TEMP
, value
);
2681 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
2682 if (battery
->temperature_test_battery
> -300 && battery
->temperature_test_battery
< 3000) {
2683 pr_info("%s : battery temperature test %d\n", __func__
, battery
->temperature_test_battery
);
2684 battery
->temperature
= battery
->temperature_test_battery
;
2686 if (battery
->temperature_test_usb
> -300 && battery
->temperature_test_usb
< 3000) {
2687 pr_info("%s : usb temperature test %d\n", __func__
, battery
->temperature_test_usb
);
2688 battery
->usb_temp
= battery
->temperature_test_usb
;
2690 if (battery
->temperature_test_wpc
> -300 && battery
->temperature_test_wpc
< 3000) {
2691 pr_info("%s : wpc temperature test %d\n", __func__
, battery
->temperature_test_wpc
);
2692 battery
->wpc_temp
= battery
->temperature_test_wpc
;
2693 battery
->coil_temp
= battery
->temperature_test_wpc
;
2695 if (battery
->temperature_test_chg
> -300 && battery
->temperature_test_chg
< 3000) {
2696 pr_info("%s : chg temperature test %d\n", __func__
, battery
->temperature_test_chg
);
2697 battery
->chg_temp
= battery
->temperature_test_chg
;
2701 #if defined(CONFIG_SEC_FACTORY)
2702 if (battery
->temperature
<= (-200)) {
2703 value
.intval
= battery
->usb_temp
;
2705 value
.intval
= battery
->temperature
;
2708 value
.intval
= battery
->temperature
;
2710 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2711 POWER_SUPPLY_PROP_TEMP
, value
);
2713 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
2714 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
2722 static void sec_bat_get_battery_info(
2723 struct sec_battery_info
*battery
)
2725 union power_supply_propval value
= {0, };
2727 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2728 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
2729 battery
->voltage_now
= value
.intval
;
2731 value
.intval
= SEC_BATTERY_VOLTAGE_AVERAGE
;
2732 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2733 POWER_SUPPLY_PROP_VOLTAGE_AVG
, value
);
2734 battery
->voltage_avg
= value
.intval
;
2736 /* Do not call it to reduce time after cable_work, this funtion call FG full log*/
2737 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
)) {
2738 value
.intval
= SEC_BATTERY_VOLTAGE_OCV
;
2739 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2740 POWER_SUPPLY_PROP_VOLTAGE_AVG
, value
);
2741 battery
->voltage_ocv
= value
.intval
;
2744 value
.intval
= SEC_BATTERY_CURRENT_MA
;
2745 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2746 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
2747 battery
->current_now
= value
.intval
;
2749 value
.intval
= SEC_BATTERY_CURRENT_MA
;
2750 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2751 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
2752 battery
->current_avg
= value
.intval
;
2754 /* input current limit in charger */
2755 psy_do_property(battery
->pdata
->charger_name
, get
,
2756 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
2757 battery
->current_max
= value
.intval
;
2759 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2760 POWER_SUPPLY_PROP_CHARGE_COUNTER
, value
);
2761 battery
->charge_counter
= value
.intval
;
2763 /* check abnormal status for wireless charging */
2764 if (!(battery
->current_event
& SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
) &&
2765 is_wireless_type(battery
->cable_type
)) {
2766 value
.intval
= (battery
->status
== POWER_SUPPLY_STATUS_FULL
) ?
2767 100 : battery
->capacity
;
2768 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
2769 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
2772 sec_bat_get_temperature_info(battery
);
2774 /* To get SOC value (NOT raw SOC), need to reset value */
2776 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
2777 POWER_SUPPLY_PROP_CAPACITY
, value
);
2778 /* if the battery status was full, and SOC wasn't 100% yet,
2779 then ignore FG SOC, and report (previous SOC +1)% */
2780 battery
->capacity
= value
.intval
;
2782 dev_info(battery
->dev
,
2783 "%s:Vnow(%dmV),Vavg(%dmV),Inow(%dmA),Imax(%dmA),Ichg(%dmA),SOC(%d%%),"
2784 "Tbat(%d),Tusb(%d),Tchg(%d),Twpc(%d)\n", __func__
,
2785 battery
->voltage_now
, battery
->voltage_avg
, battery
->current_now
,
2786 battery
->current_max
, battery
->charging_current
,
2787 battery
->capacity
, battery
->temperature
,
2788 battery
->usb_temp
,battery
->chg_temp
, battery
->wpc_temp
2790 dev_dbg(battery
->dev
,
2791 "%s,Vavg(%dmV),Vocv(%dmV),Tamb(%d),"
2792 "Iavg(%dmA),Iadc(%d)\n",
2793 battery
->present
? "Connected" : "Disconnected",
2794 battery
->voltage_avg
, battery
->voltage_ocv
,
2795 battery
->temper_amb
,
2796 battery
->current_avg
, battery
->current_adc
);
2798 sec_debug_set_extra_info_batt(battery
->capacity
, battery
->voltage_avg
, battery
->temperature
, battery
->current_avg
);
2801 static void sec_bat_polling_work(struct work_struct
*work
)
2803 struct sec_battery_info
*battery
= container_of(
2804 work
, struct sec_battery_info
, polling_work
.work
);
2806 wake_lock(&battery
->monitor_wake_lock
);
2807 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
2808 dev_dbg(battery
->dev
, "%s: Activated\n", __func__
);
2811 static void sec_bat_program_alarm(
2812 struct sec_battery_info
*battery
, int seconds
)
2814 alarm_start(&battery
->polling_alarm
,
2815 ktime_add(battery
->last_poll_time
, ktime_set(seconds
, 0)));
2818 static unsigned int sec_bat_get_polling_time(
2819 struct sec_battery_info
*battery
)
2821 if (battery
->status
==
2822 POWER_SUPPLY_STATUS_FULL
)
2823 battery
->polling_time
=
2824 battery
->pdata
->polling_time
[
2825 POWER_SUPPLY_STATUS_CHARGING
];
2827 battery
->polling_time
=
2828 battery
->pdata
->polling_time
[
2831 battery
->polling_short
= true;
2833 switch (battery
->status
) {
2834 case POWER_SUPPLY_STATUS_CHARGING
:
2835 if (battery
->polling_in_sleep
)
2836 battery
->polling_short
= false;
2838 case POWER_SUPPLY_STATUS_DISCHARGING
:
2839 if (battery
->polling_in_sleep
&& (battery
->ps_enable
!= true)) {
2840 battery
->polling_time
=
2841 battery
->pdata
->polling_time
[
2842 SEC_BATTERY_POLLING_TIME_SLEEP
];
2844 battery
->polling_time
=
2845 battery
->pdata
->polling_time
[
2847 if (!battery
->wc_enable
) {
2848 battery
->polling_time
= battery
->pdata
->polling_time
[
2849 SEC_BATTERY_POLLING_TIME_CHARGING
];
2850 pr_info("%s: wc_enable is false, polling time is 30sec\n", __func__
);
2852 battery
->polling_short
= false;
2854 case POWER_SUPPLY_STATUS_FULL
:
2855 if (battery
->polling_in_sleep
) {
2856 if (!(battery
->pdata
->full_condition_type
&
2857 SEC_BATTERY_FULL_CONDITION_NOSLEEPINFULL
) &&
2858 battery
->charging_mode
==
2859 SEC_BATTERY_CHARGING_NONE
) {
2860 battery
->polling_time
=
2861 battery
->pdata
->polling_time
[
2862 SEC_BATTERY_POLLING_TIME_SLEEP
];
2864 battery
->polling_short
= false;
2866 if (battery
->charging_mode
==
2867 SEC_BATTERY_CHARGING_NONE
)
2868 battery
->polling_short
= false;
2871 case POWER_SUPPLY_STATUS_NOT_CHARGING
:
2872 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
||
2873 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) &&
2874 (battery
->health_check_count
> 0)) {
2875 battery
->health_check_count
--;
2876 battery
->polling_time
= 1;
2877 battery
->polling_short
= false;
2882 if (battery
->polling_short
)
2883 return battery
->pdata
->polling_time
[
2884 SEC_BATTERY_POLLING_TIME_BASIC
];
2885 /* set polling time to 46s to reduce current noise on wc */
2886 else if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
&&
2887 battery
->status
== POWER_SUPPLY_STATUS_CHARGING
)
2888 battery
->polling_time
= 46;
2890 return battery
->polling_time
;
2893 static bool sec_bat_is_short_polling(
2894 struct sec_battery_info
*battery
)
2896 /* Change the full and short monitoring sequence
2897 * Originally, full monitoring was the last time of polling_count
2898 * But change full monitoring to first time
2899 * because temperature check is too late
2901 if (!battery
->polling_short
|| battery
->polling_count
== 1)
2907 static void sec_bat_update_polling_count(
2908 struct sec_battery_info
*battery
)
2910 /* do NOT change polling count in sleep
2911 * even though it is short polling
2912 * to keep polling count along sleep/wakeup
2914 if (battery
->polling_short
&& battery
->polling_in_sleep
)
2917 if (battery
->polling_short
&&
2918 ((battery
->polling_time
/
2919 battery
->pdata
->polling_time
[
2920 SEC_BATTERY_POLLING_TIME_BASIC
])
2921 > battery
->polling_count
))
2922 battery
->polling_count
++;
2924 battery
->polling_count
= 1; /* initial value = 1 */
2927 static void sec_bat_set_polling(
2928 struct sec_battery_info
*battery
)
2930 unsigned int polling_time_temp
= 0;
2932 dev_dbg(battery
->dev
, "%s: Start\n", __func__
);
2934 polling_time_temp
= sec_bat_get_polling_time(battery
);
2936 dev_info(battery
->dev
,
2937 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
2938 __func__
, sec_bat_status_str
[battery
->status
],
2939 battery
->polling_in_sleep
? "Yes" : "No",
2940 (battery
->charging_mode
==
2941 SEC_BATTERY_CHARGING_NONE
) ? "No" : "Yes",
2942 battery
->polling_short
? "Yes" : "No");
2943 dev_info(battery
->dev
,
2944 "%s: Polling time %d/%d sec.\n", __func__
,
2945 battery
->polling_short
?
2946 (polling_time_temp
* battery
->polling_count
) :
2947 polling_time_temp
, battery
->polling_time
);
2949 /* To sync with log above,
2950 * change polling count after log is displayed
2951 * Do NOT update polling count in initial monitor
2953 if (!battery
->pdata
->monitor_initial_count
)
2954 sec_bat_update_polling_count(battery
);
2956 dev_dbg(battery
->dev
,
2957 "%s: Initial monitor %d times left.\n", __func__
,
2958 battery
->pdata
->monitor_initial_count
);
2960 switch (battery
->pdata
->polling_type
) {
2961 case SEC_BATTERY_MONITOR_WORKQUEUE
:
2962 if (battery
->pdata
->monitor_initial_count
) {
2963 battery
->pdata
->monitor_initial_count
--;
2964 schedule_delayed_work(&battery
->polling_work
, HZ
);
2966 schedule_delayed_work(&battery
->polling_work
,
2967 polling_time_temp
* HZ
);
2969 case SEC_BATTERY_MONITOR_ALARM
:
2970 battery
->last_poll_time
= ktime_get_boottime();
2972 if (battery
->pdata
->monitor_initial_count
) {
2973 battery
->pdata
->monitor_initial_count
--;
2974 sec_bat_program_alarm(battery
, 1);
2976 sec_bat_program_alarm(battery
, polling_time_temp
);
2978 case SEC_BATTERY_MONITOR_TIMER
:
2983 dev_dbg(battery
->dev
, "%s: End\n", __func__
);
2986 /* OTG during HV wireless charging or sleep mode have 4.5W normal wireless charging UI */
2987 static bool sec_bat_hv_wc_normal_mode_check(struct sec_battery_info
*battery
)
2989 union power_supply_propval value
= {0, };
2991 psy_do_property(battery
->pdata
->charger_name
, get
,
2992 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
2993 if (value
.intval
|| sleep_mode
) {
2994 pr_info("%s: otg(%d), sleep_mode(%d)\n", __func__
, value
.intval
, sleep_mode
);
3000 #if defined(CONFIG_BATTERY_SWELLING)
3001 static void sec_bat_swelling_fullcharged_check(struct sec_battery_info
*battery
)
3003 union power_supply_propval value
= {0, };
3005 psy_do_property(battery
->pdata
->charger_name
, get
,
3006 POWER_SUPPLY_PROP_STATUS
, value
);
3008 if (value
.intval
== POWER_SUPPLY_STATUS_FULL
) {
3009 battery
->swelling_full_check_cnt
++;
3010 pr_info("%s: Swelling mode full-charged check (%d)\n",
3011 __func__
, battery
->swelling_full_check_cnt
);
3013 battery
->swelling_full_check_cnt
= 0;
3015 if (battery
->swelling_full_check_cnt
>=
3016 battery
->pdata
->full_check_count
) {
3017 battery
->swelling_full_check_cnt
= 0;
3018 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3019 battery
->is_recharging
= false;
3020 battery
->swelling_mode
= SWELLING_MODE_FULL
;
3021 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
3022 battery
->expired_time
= battery
->pdata
->expired_time
;
3023 battery
->prev_safety_time
= 0;
3024 #if defined(CONFIG_BATTERY_CISD)
3025 battery
->cisd
.data
[CISD_DATA_SWELLING_FULL_CNT
]++;
3026 battery
->cisd
.data
[CISD_DATA_SWELLING_FULL_CNT_PER_DAY
]++;
3032 #if defined(CONFIG_CALC_TIME_TO_FULL)
3033 static void sec_bat_calc_time_to_full(struct sec_battery_info
* battery
)
3035 if (delayed_work_pending(&battery
->timetofull_work
)) {
3036 pr_info("%s: keep time_to_full(%5d sec)\n", __func__
, battery
->timetofull
);
3037 } else if (battery
->status
== POWER_SUPPLY_STATUS_CHARGING
||
3038 (battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->capacity
!= 100)) {
3039 union power_supply_propval value
= {0, };
3042 if (is_hv_wire_12v_type(battery
->cable_type
) ||
3043 battery
->max_charge_power
>= (battery
->pdata
->pd_charging_charge_power
+ 5000)) { /* 20000mW */
3044 charge
= battery
->pdata
->ttf_hv_12v_charge_current
;
3045 } else if (is_hv_wire_type(battery
->cable_type
) ||
3046 /* if max_charge_power could support over than max_charging_current, calculate based on ttf_hv_charge_current */
3047 battery
->max_charge_power
>= (battery
->pdata
->max_charging_current
* 5)) {
3048 charge
= battery
->pdata
->ttf_hv_charge_current
;
3049 } else if (is_hv_wireless_type(battery
->cable_type
) ||
3050 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
) {
3051 if (sec_bat_hv_wc_normal_mode_check(battery
))
3052 charge
= battery
->pdata
->ttf_wireless_charge_current
;
3054 charge
= battery
->pdata
->ttf_hv_wireless_charge_current
;
3055 } else if (is_nv_wireless_type(battery
->cable_type
)) {
3056 charge
= battery
->pdata
->ttf_wireless_charge_current
;
3058 charge
= battery
->max_charge_power
/ 5;
3060 value
.intval
= charge
;
3061 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3062 POWER_SUPPLY_PROP_TIME_TO_FULL_NOW
, value
);
3063 dev_info(battery
->dev
, "%s: T: %5d sec, passed time: %5ld, current: %d\n",
3064 __func__
, value
.intval
, battery
->charging_passed_time
, charge
);
3065 battery
->timetofull
= value
.intval
;
3067 battery
->timetofull
= -1;
3071 static void sec_bat_time_to_full_work(struct work_struct
*work
)
3073 struct sec_battery_info
*battery
= container_of(work
,
3074 struct sec_battery_info
, timetofull_work
.work
);
3075 union power_supply_propval value
= {0, };
3077 psy_do_property(battery
->pdata
->charger_name
, get
,
3078 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
3079 battery
->current_max
= value
.intval
;
3081 value
.intval
= SEC_BATTERY_CURRENT_MA
;
3082 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3083 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
3084 battery
->current_now
= value
.intval
;
3086 value
.intval
= SEC_BATTERY_CURRENT_MA
;
3087 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3088 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
3089 battery
->current_avg
= value
.intval
;
3091 sec_bat_calc_time_to_full(battery
);
3092 dev_info(battery
->dev
, "%s: \n",__func__
);
3093 if (battery
->voltage_now
> 0)
3094 battery
->voltage_now
--;
3096 power_supply_changed(battery
->psy_bat
);
3100 extern bool get_usb_enumeration_state(void);
3101 /* To disaply slow charging when usb charging 100MA*/
3102 static void sec_bat_check_slowcharging_work(struct work_struct
*work
)
3104 struct sec_battery_info
*battery
= container_of(work
,
3105 struct sec_battery_info
, slowcharging_work
.work
);
3107 if (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL_DEFAULT
&&
3108 battery
->cable_type
== SEC_BATTERY_CABLE_USB
) {
3109 if (!get_usb_enumeration_state() &&
3110 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_USB_100MA
)) {
3111 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
, 0);
3112 battery
->max_charge_power
= battery
->input_voltage
* battery
->current_max
;
3115 dev_info(battery
->dev
, "%s: \n",__func__
);
3118 static void sec_bat_wc_cv_mode_check(struct sec_battery_info
*battery
)
3120 union power_supply_propval value
= {0, };
3122 pr_info("%s: battery->wc_cv_mode = %d \n", __func__
, battery
->wc_cv_mode
);
3124 if (battery
->capacity
>= battery
->pdata
->wireless_cc_cv
) {
3125 pr_info("%s: 4.5W WC Changed Vout input current limit\n", __func__
);
3126 battery
->wc_cv_mode
= true;
3127 sec_bat_set_charging_current(battery
);
3128 value
.intval
= WIRELESS_VOUT_CC_CV_VOUT
; // 5.5V
3129 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3130 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3131 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_5
; // 80mv
3132 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3133 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3134 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
||
3135 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
||
3136 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
3137 value
.intval
= WIRELESS_CLAMP_ENABLE
;
3138 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3139 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3141 /* Change FOD values for CV mode */
3142 value
.intval
= POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
;
3143 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3144 POWER_SUPPLY_PROP_STATUS
, value
);
3148 static void sec_bat_siop_level_work(struct work_struct
*work
)
3150 struct sec_battery_info
*battery
= container_of(work
,
3151 struct sec_battery_info
, siop_level_work
.work
);
3153 pr_info("%s : set current by siop level(%d)\n",__func__
, battery
->siop_level
);
3154 sec_bat_set_charging_current(battery
);
3155 wake_unlock(&battery
->siop_level_wake_lock
);
3158 static void sec_bat_wc_headroom_work(struct work_struct
*work
)
3160 struct sec_battery_info
*battery
= container_of(work
,
3161 struct sec_battery_info
, wc_headroom_work
.work
);
3162 union power_supply_propval value
= {0, };
3164 /* The default headroom is high, because initial wireless charging state is unstable.
3165 After 10sec wireless charging, however, recover headroom level to avoid chipset damage */
3166 if (battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
) {
3167 /* When the capacity is higher than 99, and the device is in 5V wireless charging state,
3168 then Vrect headroom has to be headroom_2.
3169 Refer to the sec_bat_siop_work function. */
3170 if (battery
->capacity
< 99 && battery
->status
!= POWER_SUPPLY_STATUS_FULL
) {
3171 if (is_nv_wireless_type(battery
->cable_type
)) {
3172 if (battery
->capacity
< battery
->pdata
->wireless_cc_cv
)
3173 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_4
; /* WPC 4.5W, Vrect Room 30mV */
3175 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_5
; /* WPC 4.5W, Vrect Room 80mV */
3176 } else if (is_hv_wireless_type(battery
->cable_type
)) {
3177 value
.intval
= WIRELESS_VRECT_ADJ_ROOM_5
;
3179 value
.intval
= WIRELESS_VRECT_ADJ_OFF
;
3181 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3182 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
3183 pr_info("%s: Changed Vrect adjustment from Rx activation(10seconds)", __func__
);
3185 if (is_nv_wireless_type(battery
->cable_type
))
3186 sec_bat_wc_cv_mode_check(battery
);
3188 wake_unlock(&battery
->wc_headroom_wake_lock
);
3191 static void sec_bat_ext_event_work(struct work_struct
*work
)
3193 struct sec_battery_info
*battery
= container_of(work
,
3194 struct sec_battery_info
, ext_event_work
.work
);
3196 union power_supply_propval value
= {0, };
3198 /* TX OFF state, it has only call scenario */
3199 if (battery
->ext_event
& BATT_EXT_EVENT_CALL
) {
3200 pr_info("%s: Call ON\n", __func__
);
3202 value
.intval
= BATT_EXT_EVENT_CALL
;
3203 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3204 POWER_SUPPLY_EXT_PROP_CALL_EVENT
, value
);
3206 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
||
3207 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_PACK
||
3208 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
3209 pr_info("%s : Call is on during Wireless Pack or TX\n",__func__
);
3210 battery
->wc_rx_phm_mode
= true;
3212 } else if (!(battery
->ext_event
& BATT_EXT_EVENT_CALL
)) {
3213 pr_info("%s: Call OFF\n", __func__
);
3215 value
.intval
= BATT_EXT_EVENT_NONE
;
3216 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3217 POWER_SUPPLY_EXT_PROP_CALL_EVENT
, value
);
3219 if (battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
||
3220 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_PACK
||
3221 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
3222 pr_info("%s : Call is off during Wireless Pack or TX\n",__func__
);
3226 if(battery
->wc_rx_phm_mode
) {
3227 pr_info("%s: ESCAPE PHM STEP 1 - WC CONTROL: Enable", __func__
);
3228 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
3230 pr_info("%s: ESCAPE PHM STEP 2 - WC CONTROL: Disable", __func__
);
3231 gpio_direction_output(battery
->pdata
->wpc_en
, 1);
3233 pr_info("%s: ESCAPE PHM STEP 3 - WC CONTROL: Enable", __func__
);
3234 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
3236 battery
->wc_rx_phm_mode
= false;
3238 wake_unlock(&battery
->ext_event_wake_lock
);
3241 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
3242 static void sec_bat_fw_update_work(struct sec_battery_info
*battery
, int mode
)
3244 union power_supply_propval value
= {0, };
3246 dev_info(battery
->dev
, "%s \n", __func__
);
3248 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
3251 case SEC_WIRELESS_RX_SDCARD_MODE
:
3252 case SEC_WIRELESS_RX_BUILT_IN_MODE
:
3253 value
.intval
= mode
;
3254 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3255 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
, value
);
3257 case SEC_WIRELESS_TX_ON_MODE
:
3258 value
.intval
= true;
3259 psy_do_property(battery
->pdata
->charger_name
, set
,
3260 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3262 value
.intval
= mode
;
3263 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3264 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
, value
);
3267 case SEC_WIRELESS_TX_OFF_MODE
:
3268 value
.intval
= false;
3269 psy_do_property(battery
->pdata
->charger_name
, set
,
3270 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3277 static void sec_bat_fw_init_work(struct work_struct
*work
)
3279 struct sec_battery_info
*battery
= container_of(work
,
3280 struct sec_battery_info
, fw_init_work
.work
);
3282 union power_supply_propval value
= {0, };
3283 int uno_status
= 0, wpc_det
= 0;
3285 dev_info(battery
->dev
, "%s \n", __func__
);
3287 wpc_det
= gpio_get_value(battery
->pdata
->wpc_det
);
3289 pr_info("%s wpc_det = %d \n", __func__
, wpc_det
);
3291 psy_do_property(battery
->pdata
->charger_name
, get
,
3292 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3293 uno_status
= value
.intval
;
3294 pr_info("%s uno = %d \n", __func__
, uno_status
);
3296 if (!uno_status
&& !wpc_det
) {
3297 pr_info("%s uno on \n", __func__
);
3298 value
.intval
= true;
3299 psy_do_property(battery
->pdata
->charger_name
, set
,
3300 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3303 value
.intval
= SEC_WIRELESS_RX_INIT
;
3304 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3305 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
, value
);
3307 if (!uno_status
&& !wpc_det
) {
3308 pr_info("%s uno off \n", __func__
);
3309 value
.intval
= false;
3310 psy_do_property(battery
->pdata
->charger_name
, set
,
3311 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
3315 #if defined(CONFIG_UPDATE_BATTERY_DATA)
3316 static int sec_bat_parse_dt(struct device
*dev
, struct sec_battery_info
*battery
);
3317 static void sec_bat_update_data_work(struct work_struct
*work
)
3319 struct sec_battery_info
*battery
= container_of(work
,
3320 struct sec_battery_info
, batt_data_work
.work
);
3322 sec_battery_update_data(battery
->data_path
);
3323 wake_unlock(&battery
->batt_data_wake_lock
);
3327 static void sec_bat_misc_event_work(struct work_struct
*work
)
3329 struct sec_battery_info
*battery
= container_of(work
,
3330 struct sec_battery_info
, misc_event_work
.work
);
3331 int xor_misc_event
= battery
->prev_misc_event
^ battery
->misc_event
;
3333 if ((xor_misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
) &&
3334 (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
)) {
3335 if (battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
) {
3336 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
3337 } else if (battery
->prev_misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
) {
3338 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
3342 pr_info("%s: change misc event(0x%x --> 0x%x)\n",
3343 __func__
, battery
->prev_misc_event
, battery
->misc_event
);
3344 battery
->prev_misc_event
= battery
->misc_event
;
3345 wake_unlock(&battery
->misc_event_wake_lock
);
3347 wake_lock(&battery
->monitor_wake_lock
);
3348 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
3351 static void sec_bat_calculate_safety_time(struct sec_battery_info
*battery
)
3353 unsigned long long expired_time
= battery
->expired_time
;
3354 struct timespec ts
= {0, };
3356 int input_power
= battery
->current_max
* battery
->input_voltage
* 1000;
3357 int charging_power
= battery
->charging_current
* (battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
);
3358 static int discharging_cnt
= 0;
3360 if (battery
->current_avg
< 0) {
3363 discharging_cnt
= 0;
3366 if (discharging_cnt
>= 5) {
3367 battery
->expired_time
= battery
->pdata
->expired_time
;
3368 battery
->prev_safety_time
= 0;
3369 pr_info("%s : SAFETY TIME RESET! DISCHARGING CNT(%d)\n",
3370 __func__
, discharging_cnt
);
3371 discharging_cnt
= 0;
3373 } else if (battery
->lcd_status
&& battery
->stop_timer
) {
3374 battery
->prev_safety_time
= 0;
3378 get_monotonic_boottime(&ts
);
3380 if (battery
->prev_safety_time
== 0) {
3381 battery
->prev_safety_time
= ts
.tv_sec
;
3384 if (input_power
> charging_power
) {
3385 curr
= battery
->charging_current
;
3387 curr
= input_power
/ (battery
->pdata
->chg_float_voltage
/ battery
->pdata
->chg_float_voltage_conv
);
3388 curr
= (curr
* 9) / 10;
3391 if (battery
->lcd_status
&& !battery
->stop_timer
) {
3392 battery
->stop_timer
= true;
3393 } else if (!battery
->lcd_status
&& battery
->stop_timer
) {
3394 battery
->stop_timer
= false;
3397 pr_info("%s : EXPIRED_TIME(%llu), IP(%d), CP(%d), CURR(%d), STANDARD(%d)\n",
3398 __func__
, expired_time
, input_power
, charging_power
, curr
, battery
->pdata
->standard_curr
);
3403 expired_time
= (expired_time
* battery
->pdata
->standard_curr
) / curr
;
3405 pr_info("%s : CAL_EXPIRED_TIME(%llu) TIME NOW(%ld) TIME PREV(%ld)\n", __func__
, expired_time
, ts
.tv_sec
, battery
->prev_safety_time
);
3407 if (expired_time
<= ((ts
.tv_sec
- battery
->prev_safety_time
) * 1000))
3410 expired_time
-= ((ts
.tv_sec
- battery
->prev_safety_time
) * 1000);
3412 battery
->cal_safety_time
= expired_time
;
3413 expired_time
= (expired_time
* curr
) / battery
->pdata
->standard_curr
;
3415 battery
->expired_time
= expired_time
;
3416 battery
->prev_safety_time
= ts
.tv_sec
;
3417 pr_info("%s : REMAIN_TIME(%ld) CAL_REMAIN_TIME(%ld)\n", __func__
, battery
->expired_time
, battery
->cal_safety_time
);
3420 static void sec_bat_monitor_work(
3421 struct work_struct
*work
)
3423 struct sec_battery_info
*battery
=
3424 container_of(work
, struct sec_battery_info
,
3426 static struct timespec old_ts
= {0, };
3427 struct timespec c_ts
= {0, };
3429 dev_dbg(battery
->dev
, "%s: Start\n", __func__
);
3430 c_ts
= ktime_to_timespec(ktime_get_boottime());
3432 mutex_lock(&battery
->wclock
);
3433 if (!battery
->wc_enable
) {
3434 pr_info("%s: wc_enable(%d), cnt(%d)\n",
3435 __func__
, battery
->wc_enable
, battery
->wc_enable_cnt
);
3436 if (battery
->wc_enable_cnt
> battery
->wc_enable_cnt_value
) {
3437 battery
->wc_enable
= true;
3438 battery
->wc_enable_cnt
= 0;
3439 if (battery
->pdata
->wpc_en
) {
3440 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
3441 pr_info("%s: WC CONTROL: Enable", __func__
);
3443 pr_info("%s: wpc_en(%d)\n",
3444 __func__
, gpio_get_value(battery
->pdata
->wpc_en
));
3446 battery
->wc_enable_cnt
++;
3448 mutex_unlock(&battery
->wclock
);
3450 /* monitor once after wakeup */
3451 if (battery
->polling_in_sleep
) {
3452 battery
->polling_in_sleep
= false;
3453 if ((battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) &&
3454 (battery
->ps_enable
!= true)) {
3455 if ((unsigned long)(c_ts
.tv_sec
- old_ts
.tv_sec
) < 10 * 60) {
3456 union power_supply_propval value
= {0, };
3458 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3459 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
3460 battery
->voltage_now
= value
.intval
;
3463 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
3464 POWER_SUPPLY_PROP_CAPACITY
, value
);
3465 battery
->capacity
= value
.intval
;
3467 sec_bat_get_temperature_info(battery
);
3468 #if defined(CONFIG_BATTERY_CISD)
3469 sec_bat_cisd_check(battery
);
3471 power_supply_changed(battery
->psy_bat
);
3472 pr_info("Skip monitor work(%ld, Vnow:%d(mV), SoC:%d(%%), Tbat:%d(0.1'C))\n",
3473 c_ts
.tv_sec
- old_ts
.tv_sec
, battery
->voltage_now
, battery
->capacity
, battery
->temperature
);
3479 /* update last monitor time */
3482 sec_bat_get_battery_info(battery
);
3483 #if defined(CONFIG_BATTERY_CISD)
3484 sec_bat_cisd_check(battery
);
3487 #if defined(CONFIG_STEP_CHARGING)
3488 sec_bat_check_step_charging(battery
);
3490 #if defined(CONFIG_CALC_TIME_TO_FULL)
3491 /* time to full check */
3492 sec_bat_calc_time_to_full(battery
);
3496 if (battery
->test_mode
) {
3497 dev_err(battery
->dev
, "%s: Test Mode\n", __func__
);
3498 sec_bat_do_test_function(battery
);
3499 if (battery
->test_mode
!= 0)
3500 goto continue_monitor
;
3503 /* 1. battery check */
3504 if (!sec_bat_battery_cable_check(battery
))
3505 goto continue_monitor
;
3507 /* 2. voltage check */
3508 if (!sec_bat_voltage_check(battery
))
3509 goto continue_monitor
;
3511 /* monitor short routine in initial monitor */
3512 if (battery
->pdata
->monitor_initial_count
|| sec_bat_is_short_polling(battery
))
3513 goto skip_current_monitor
;
3515 /* 3. time management */
3516 if (!sec_bat_time_management(battery
))
3517 goto continue_monitor
;
3519 /* 4. temperature check */
3520 if (!sec_bat_temperature_check(battery
))
3521 goto continue_monitor
;
3523 #if defined(CONFIG_BATTERY_SWELLING)
3524 sec_bat_swelling_check(battery
);
3526 if ((battery
->swelling_mode
== SWELLING_MODE_CHARGING
|| battery
->swelling_mode
== SWELLING_MODE_FULL
) &&
3527 (!battery
->charging_block
))
3528 sec_bat_swelling_fullcharged_check(battery
);
3530 sec_bat_fullcharged_check(battery
);
3532 /* 5. full charging check */
3533 sec_bat_fullcharged_check(battery
);
3534 #endif /* CONFIG_BATTERY_SWELLING */
3536 /* 6. additional check */
3537 if (battery
->pdata
->monitor_additional_check
)
3538 battery
->pdata
->monitor_additional_check();
3540 #if defined(CONFIG_BATTERY_SBM_DATA)
3541 sec_bat_add_sbm_data(battery
, SBM_DATA_COMMON_INFO
);
3544 if ((battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
||
3545 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
||
3546 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) &&
3547 !battery
->wc_cv_mode
&& battery
->charging_passed_time
> 10)
3548 sec_bat_wc_cv_mode_check(battery
);
3551 /* clear HEATING_CONTROL*/
3552 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
);
3554 /* calculate safety time */
3555 if (!battery
->charging_block
)
3556 sec_bat_calculate_safety_time(battery
);
3558 /* set charging current */
3559 sec_bat_set_charging_current(battery
);
3561 skip_current_monitor
:
3562 dev_info(battery
->dev
,
3563 "%s: HLT(%d) HLR(%d) HT(%d), HR(%d), LT(%d), LR(%d), lpcharge(%d)\n",
3564 __func__
, battery
->temp_highlimit_threshold
, battery
->temp_highlimit_recovery
,
3565 battery
->temp_high_threshold
, battery
->temp_high_recovery
,
3566 battery
->temp_low_threshold
, battery
->temp_low_recovery
, lpcharge
);
3568 dev_info(battery
->dev
,
3569 "%s: Status(%s), mode(%s), Health(%s), Cable(%s, %s, %d, %d), level(%d%%), slate_mode(%d), store_mode(%d)"
3570 #if defined(CONFIG_AFC_CHARGER_MODE)
3571 ", HV(%s), sleep_mode(%d)"
3573 #if defined(CONFIG_BATTERY_AGE_FORECAST)
3577 sec_bat_status_str
[battery
->status
],
3578 sec_bat_charging_mode_str
[battery
->charging_mode
],
3579 sec_bat_health_str
[battery
->health
],
3580 sec_cable_type
[battery
->cable_type
],
3581 sec_cable_type
[battery
->wire_status
],
3582 battery
->muic_cable_type
,
3583 battery
->pd_usb_attached
,
3584 battery
->siop_level
,
3585 battery
->slate_mode
,
3587 #if defined(CONFIG_AFC_CHARGER_MODE)
3588 , battery
->hv_chg_name
, sleep_mode
3590 #if defined(CONFIG_BATTERY_AGE_FORECAST)
3591 , battery
->batt_cycle
3594 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
3595 dev_info(battery
->dev
,
3596 "%s: battery->stability_test(%d), battery->eng_not_full_status(%d)\n",
3597 __func__
, battery
->stability_test
, battery
->eng_not_full_status
);
3599 #if defined(CONFIG_SEC_FACTORY)
3600 if ((battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
) && (battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
)) {
3602 if ((battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
) && (battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
) && battery
->store_mode
) {
3604 dev_info(battery
->dev
,
3605 "%s: @battery->capacity = (%d), battery->status= (%d), battery->store_mode=(%d)\n",
3606 __func__
, battery
->capacity
, battery
->status
, battery
->store_mode
);
3608 if (battery
->capacity
>= STORE_MODE_CHARGING_MAX
) {
3609 int chg_mode
= battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
?
3610 SEC_BAT_CHG_MODE_BUCK_OFF
: SEC_BAT_CHG_MODE_CHARGING_OFF
;
3611 /* to discharge the battery, off buck */
3612 if (battery
->capacity
> STORE_MODE_CHARGING_MAX
)
3613 chg_mode
= SEC_BAT_CHG_MODE_BUCK_OFF
;
3615 sec_bat_set_charging_status(battery
,
3616 POWER_SUPPLY_STATUS_DISCHARGING
);
3617 sec_bat_set_charge(battery
, chg_mode
);
3620 if ((battery
->capacity
<= STORE_MODE_CHARGING_MIN
) && (battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
)) {
3621 sec_bat_set_charging_status(battery
,
3622 POWER_SUPPLY_STATUS_CHARGING
);
3623 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
3626 power_supply_changed(battery
->psy_bat
);
3629 sec_bat_set_polling(battery
);
3631 if (battery
->capacity
<= 0 || battery
->health_change
)
3632 wake_lock_timeout(&battery
->monitor_wake_lock
, HZ
* 5);
3634 wake_unlock(&battery
->monitor_wake_lock
);
3636 dev_dbg(battery
->dev
, "%s: End\n", __func__
);
3641 static enum alarmtimer_restart
sec_bat_alarm(
3642 struct alarm
*alarm
, ktime_t now
)
3644 struct sec_battery_info
*battery
= container_of(alarm
,
3645 struct sec_battery_info
, polling_alarm
);
3647 dev_dbg(battery
->dev
,
3650 /* In wake up, monitor work will be queued in complete function
3651 * To avoid duplicated queuing of monitor work,
3652 * do NOT queue monitor work in wake up by polling alarm
3654 if (!battery
->polling_in_sleep
) {
3655 wake_lock(&battery
->monitor_wake_lock
);
3656 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
3657 dev_dbg(battery
->dev
, "%s: Activated\n", __func__
);
3660 return ALARMTIMER_NORESTART
;
3663 static void sec_bat_check_input_voltage(struct sec_battery_info
*battery
)
3665 unsigned int voltage
= 0;
3666 int input_current
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
;
3668 if (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
) {
3669 battery
->max_charge_power
= battery
->pd_max_charge_power
;
3672 else if (is_hv_wire_12v_type(battery
->cable_type
))
3673 voltage
= SEC_INPUT_VOLTAGE_12V
;
3674 else if (is_hv_wire_9v_type(battery
->cable_type
))
3675 voltage
= SEC_INPUT_VOLTAGE_9V
;
3676 else if (is_hv_wireless_type(battery
->cable_type
) ||
3677 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
)
3678 voltage
= SEC_INPUT_VOLTAGE_10V
;
3680 voltage
= SEC_INPUT_VOLTAGE_5V
;
3682 battery
->input_voltage
= voltage
;
3683 battery
->charge_power
= voltage
* input_current
;
3684 #if !defined(CONFIG_SEC_FACTORY)
3685 if (battery
->charge_power
> battery
->max_charge_power
)
3687 battery
->max_charge_power
= battery
->charge_power
;
3689 pr_info("%s: battery->input_voltage : %dV, %dmW, %dmW)\n", __func__
,
3690 battery
->input_voltage
, battery
->charge_power
, battery
->max_charge_power
);
3693 static void sec_bat_cable_work(struct work_struct
*work
)
3695 struct sec_battery_info
*battery
= container_of(work
,
3696 struct sec_battery_info
, cable_work
.work
);
3697 union power_supply_propval val
= {0, };
3698 int current_cable_type
= SEC_BATTERY_CABLE_NONE
;
3700 dev_info(battery
->dev
, "%s: Start\n", __func__
);
3701 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
,
3702 SEC_BAT_CURRENT_EVENT_SKIP_HEATING_CONTROL
);
3703 #if defined(CONFIG_CCIC_NOTIFIER)
3704 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
3705 if (battery
->pdic_info
.sink_status
.selected_pdo_num
==
3706 battery
->pdic_info
.sink_status
.current_pdo_num
)
3707 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SELECT_PDO
);
3708 sec_bat_get_input_current_in_power_list(battery
);
3709 sec_bat_get_charging_current_in_power_list(battery
);
3713 if (battery
->wc_status
&& battery
->wc_enable
) {
3714 int wireless_current
, wire_current
;
3715 int temp_current_type
;
3717 if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC
)
3718 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
3719 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_HV
)
3720 current_cable_type
= SEC_BATTERY_CABLE_HV_WIRELESS
;
3721 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK
)
3722 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_PACK
;
3723 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK_HV
)
3724 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_HV_PACK
;
3725 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_STAND
)
3726 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_STAND
;
3727 else if (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_STAND_HV
)
3728 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_HV_STAND
;
3729 else if (battery
->wc_status
== SEC_WIRELESS_PAD_VEHICLE
)
3730 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_VEHICLE
;
3731 else if (battery
->wc_status
== SEC_WIRELESS_PAD_VEHICLE_HV
)
3732 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE
;
3733 else if (battery
->wc_status
== SEC_WIRELESS_PAD_PREPARE_HV
)
3734 current_cable_type
= SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
;
3735 else if (battery
->wc_status
== SEC_WIRELESS_PAD_TX
)
3736 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS_TX
;
3738 current_cable_type
= SEC_BATTERY_CABLE_PMA_WIRELESS
;
3740 if (current_cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
)
3741 temp_current_type
= SEC_BATTERY_CABLE_HV_WIRELESS
;
3743 temp_current_type
= current_cable_type
;
3745 if (battery
->wire_status
!= SEC_BATTERY_CABLE_NONE
) {
3746 wireless_current
= battery
->pdata
->charging_current
[temp_current_type
].input_current_limit
;
3747 wireless_current
= wireless_current
* (is_hv_wireless_type(temp_current_type
) ?
3748 SEC_INPUT_VOLTAGE_9V
: SEC_INPUT_VOLTAGE_5V
);
3749 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
3750 if (wireless_current
< battery
->pd_max_charge_power
)
3751 current_cable_type
= battery
->wire_status
;
3753 wire_current
= (battery
->wire_status
== SEC_BATTERY_CABLE_PREPARE_TA
?
3754 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_TA
].input_current_limit
:
3755 battery
->pdata
->charging_current
[battery
->wire_status
].input_current_limit
);
3757 wire_current
= wire_current
* (is_hv_wire_type(battery
->wire_status
) ?
3758 (battery
->wire_status
== SEC_BATTERY_CABLE_12V_TA
? SEC_INPUT_VOLTAGE_12V
: SEC_INPUT_VOLTAGE_9V
)
3759 : SEC_INPUT_VOLTAGE_5V
);
3760 pr_info("%s: wl_cur(%d), wr_cur(%d), wc_cable_type(%d), wire_cable_type(%d)\n",
3761 __func__
, wireless_current
, wire_current
, current_cable_type
, battery
->wire_status
);
3763 if (wireless_current
< wire_current
)
3764 current_cable_type
= battery
->wire_status
;
3768 current_cable_type
= battery
->wire_status
;
3770 if (battery
->wc_status
) {
3771 /* wired charger has priority, but wireless charger exist. */
3772 val
.intval
= is_wired_type(current_cable_type
) ?
3773 MFC_LDO_OFF
: MFC_LDO_ON
;
3774 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
3775 POWER_SUPPLY_PROP_CHARGE_EMPTY
, val
);
3778 if (current_cable_type
== SEC_BATTERY_CABLE_PDIC
&&
3779 battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
&&
3780 !battery
->slate_mode
) {
3781 cancel_delayed_work(&battery
->afc_work
);
3782 wake_unlock(&battery
->afc_wake_lock
);
3783 sec_bat_set_current_event(battery
, 0,
3784 SEC_BAT_CURRENT_EVENT_AFC
| SEC_BAT_CURRENT_EVENT_AICL
);
3785 battery
->aicl_current
= 0;
3786 sec_bat_set_charging_current(battery
);
3787 power_supply_changed(battery
->psy_bat
);
3788 goto end_of_cable_work
;
3791 /* to clear this value when cable type switched without dettach */
3792 if ((is_wired_type(battery
->cable_type
) && is_wireless_type(current_cable_type
)) ||
3793 (is_wireless_type(battery
->cable_type
) && is_wired_type(current_cable_type
)))
3794 battery
->max_charge_power
= 0;
3796 if ((current_cable_type
== battery
->cable_type
) && !battery
->slate_mode
) {
3797 dev_dbg(battery
->dev
,
3798 "%s: Cable is NOT Changed(%d)\n",
3799 __func__
, battery
->cable_type
);
3800 /* Do NOT activate cable work for NOT changed */
3801 goto end_of_cable_work
;
3804 #if defined(CONFIG_BATTERY_SWELLING)
3805 if ((current_cable_type
== SEC_BATTERY_CABLE_NONE
) ||
3806 (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
&& battery
->swelling_mode
== SWELLING_MODE_NONE
) ||
3807 (battery
->cable_type
== SEC_BATTERY_CABLE_OTG
&& battery
->swelling_mode
== SWELLING_MODE_NONE
)) {
3808 battery
->swelling_mode
= SWELLING_MODE_NONE
;
3809 /* restore 4.4V float voltage */
3810 val
.intval
= battery
->pdata
->swelling_normal_float_voltage
;
3811 psy_do_property(battery
->pdata
->charger_name
, set
,
3812 POWER_SUPPLY_PROP_VOLTAGE_MAX
, val
);
3813 pr_info("%s: float voltage = %d\n", __func__
, val
.intval
);
3815 pr_info("%s: skip float_voltage setting, swelling_mode(%d)\n",
3816 __func__
, battery
->swelling_mode
);
3820 battery
->cable_type
= current_cable_type
;
3821 battery
->wpc_vout_level
= WIRELESS_VOUT_10V
;
3822 if (is_wireless_type(battery
->cable_type
)) {
3823 power_supply_changed(battery
->psy_bat
);
3824 /* After 10sec wireless charging, Vrect headroom has to be reduced */
3825 wake_lock(&battery
->wc_headroom_wake_lock
);
3826 queue_delayed_work(battery
->monitor_wqueue
, &battery
->wc_headroom_work
,
3827 msecs_to_jiffies(10000));
3830 if (battery
->pdata
->check_cable_result_callback
)
3831 battery
->pdata
->check_cable_result_callback(battery
->cable_type
);
3832 /* platform can NOT get information of cable connection
3833 * because wakeup time is too short to check uevent
3834 * To make sure that target is wakeup
3835 * if cable is connected and disconnected,
3836 * activated wake lock in a few seconds
3838 wake_lock_timeout(&battery
->vbus_wake_lock
, HZ
* 10);
3840 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
||
3841 ((battery
->pdata
->cable_check_type
&
3842 SEC_BATTERY_CABLE_CHECK_NOINCOMPATIBLECHARGE
) &&
3843 battery
->cable_type
== SEC_BATTERY_CABLE_UNKNOWN
)) {
3844 /* initialize all status */
3845 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3846 battery
->vbus_chg_by_siop
= false;
3847 battery
->is_recharging
= false;
3848 #if defined(CONFIG_BATTERY_CISD)
3849 battery
->cisd
.charging_end_time
= 0;
3850 battery
->cisd
.recharge_count
= 0;
3851 battery
->cisd
.charging_end_time_2
= 0;
3852 battery
->cisd
.recharge_count_2
= 0;
3853 battery
->cisd
.ab_vbat_check_count
= 0;
3854 battery
->cisd
.state
&= ~CISD_STATE_OVER_VOLTAGE
;
3856 battery
->input_voltage
= 0;
3857 battery
->charge_power
= 0;
3858 battery
->max_charge_power
= 0;
3859 battery
->pd_max_charge_power
= 0;
3860 sec_bat_set_charging_status(battery
,
3861 POWER_SUPPLY_STATUS_DISCHARGING
);
3862 battery
->chg_limit
= false;
3863 battery
->mix_limit
= false;
3864 battery
->chg_limit_recovery_cable
= SEC_BATTERY_CABLE_NONE
;
3865 battery
->wc_heating_start_time
= 0;
3866 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
3867 cancel_delayed_work(&battery
->afc_work
);
3868 wake_unlock(&battery
->afc_wake_lock
);
3869 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
3870 USB_CURRENT_HIGH_SPEED
, USB_CURRENT_HIGH_SPEED
);
3871 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_TA
,
3872 battery
->pdata
->default_input_current
, battery
->pdata
->default_charging_current
);
3873 /* usb default current is 100mA before configured*/
3874 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_100MA
,
3875 (SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
|
3876 SEC_BAT_CURRENT_EVENT_AFC
|
3877 SEC_BAT_CURRENT_EVENT_USB_SUPER
|
3878 SEC_BAT_CURRENT_EVENT_USB_100MA
|
3879 SEC_BAT_CURRENT_EVENT_VBAT_OVP
|
3880 SEC_BAT_CURRENT_EVENT_VSYS_OVP
|
3881 SEC_BAT_CURRENT_EVENT_CHG_LIMIT
|
3882 SEC_BAT_CURRENT_EVENT_AICL
|
3883 SEC_BAT_CURRENT_EVENT_SELECT_PDO
));
3885 cancel_delayed_work(&battery
->slowcharging_work
);
3886 battery
->wc_cv_mode
= false;
3887 battery
->is_sysovlo
= false;
3888 battery
->is_vbatovlo
= false;
3889 battery
->is_abnormal_temp
= false;
3891 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
))
3892 goto end_of_cable_work
;
3893 } else if(battery
->slate_mode
) {
3894 dev_info(battery
->dev
,
3895 "%s:slate mode on\n",__func__
);
3896 battery
->is_recharging
= false;
3897 battery
->cable_type
= SEC_BATTERY_CABLE_NONE
;
3898 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3899 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
3900 sec_bat_set_charging_status(battery
,
3901 POWER_SUPPLY_STATUS_DISCHARGING
);
3902 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_BUCK_OFF
);
3904 #if defined(CONFIG_EN_OOPS)
3905 val
.intval
= battery
->cable_type
;
3906 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
3907 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN
, val
);
3909 /* Do NOT display the charging icon when OTG or HMT_CONNECTED is enabled */
3910 if (battery
->cable_type
== SEC_BATTERY_CABLE_OTG
||
3911 battery
->cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
3912 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
3913 battery
->status
= POWER_SUPPLY_STATUS_DISCHARGING
;
3914 } else if (!battery
->is_sysovlo
&& !battery
->is_vbatovlo
&& !battery
->is_abnormal_temp
&&
3915 (!battery
->charging_block
|| !battery
->swelling_mode
)) {
3916 if (battery
->pdata
->full_check_type
!=
3917 SEC_BATTERY_FULLCHARGED_NONE
)
3918 battery
->charging_mode
=
3919 SEC_BATTERY_CHARGING_1ST
;
3921 battery
->charging_mode
=
3922 SEC_BATTERY_CHARGING_2ND
;
3924 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
)
3925 sec_bat_set_charging_status(battery
,
3926 POWER_SUPPLY_STATUS_FULL
);
3928 sec_bat_set_charging_status(battery
,
3929 POWER_SUPPLY_STATUS_CHARGING
);
3932 if (!battery
->is_sysovlo
&& !battery
->is_vbatovlo
&& !battery
->is_abnormal_temp
)
3933 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
3935 if (battery
->cable_type
== SEC_BATTERY_CABLE_TA
||
3936 battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS
||
3937 battery
->cable_type
== SEC_BATTERY_CABLE_PMA_WIRELESS
) {
3938 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_AFC
, SEC_BAT_CURRENT_EVENT_AFC
);
3940 cancel_delayed_work(&battery
->afc_work
);
3941 wake_unlock(&battery
->afc_wake_lock
);
3942 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AFC
);
3945 if (battery
->cable_type
== SEC_BATTERY_CABLE_OTG
||
3946 battery
->cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
3947 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
))
3948 goto end_of_cable_work
;
3949 } else if (!battery
->is_sysovlo
&& !battery
->is_vbatovlo
&& !battery
->is_abnormal_temp
&&
3950 (!battery
->charging_block
|| !battery
->swelling_mode
)) {
3951 if (sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
))
3952 goto end_of_cable_work
;
3955 if (battery
->cable_type
== SEC_BATTERY_CABLE_USB
&& !lpcharge
)
3956 queue_delayed_work(battery
->monitor_wqueue
, &battery
->slowcharging_work
,
3957 msecs_to_jiffies(3000));
3959 #if defined(CONFIG_CALC_TIME_TO_FULL)
3961 cancel_delayed_work(&battery
->timetofull_work
);
3962 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
) {
3965 if (!is_wireless_type(battery
->cable_type
)) {
3966 work_delay
= battery
->pdata
->pre_afc_work_delay
;
3968 work_delay
= battery
->pdata
->pre_wc_afc_work_delay
;
3971 queue_delayed_work(battery
->monitor_wqueue
,
3972 &battery
->timetofull_work
, msecs_to_jiffies(work_delay
));
3978 /* set online(cable type) */
3979 val
.intval
= battery
->cable_type
;
3980 psy_do_property(battery
->pdata
->charger_name
, set
,
3981 POWER_SUPPLY_PROP_ONLINE
, val
);
3982 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
3983 POWER_SUPPLY_PROP_ONLINE
, val
);
3984 /* set charging current */
3985 psy_do_property(battery
->pdata
->charger_name
, get
,
3986 POWER_SUPPLY_PROP_CURRENT_AVG
, val
);
3987 battery
->aicl_current
= 0;
3988 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AICL
);
3989 battery
->input_current
= val
.intval
;
3990 /* to init battery type current when wireless charging -> battery case */
3991 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
)
3992 psy_do_property(battery
->pdata
->charger_name
, set
,
3993 POWER_SUPPLY_PROP_CURRENT_MAX
, val
);
3994 if (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
)
3995 sec_bat_check_input_voltage(battery
);
3996 sec_bat_set_charging_current(battery
);
3998 /* polling time should be reset when cable is changed
3999 * polling_in_sleep should be reset also
4000 * before polling time is re-calculated
4001 * to prevent from counting 1 for events
4002 * right after cable is connected
4004 battery
->polling_in_sleep
= false;
4005 sec_bat_get_polling_time(battery
);
4007 dev_info(battery
->dev
,
4008 "%s: Status:%s, Sleep:%s, Charging:%s, Short Poll:%s\n",
4009 __func__
, sec_bat_status_str
[battery
->status
],
4010 battery
->polling_in_sleep
? "Yes" : "No",
4011 (battery
->charging_mode
==
4012 SEC_BATTERY_CHARGING_NONE
) ? "No" : "Yes",
4013 battery
->polling_short
? "Yes" : "No");
4014 dev_info(battery
->dev
,
4015 "%s: Polling time is reset to %d sec.\n", __func__
,
4016 battery
->polling_time
);
4018 battery
->polling_count
= 1; /* initial value = 1 */
4020 wake_lock(&battery
->monitor_wake_lock
);
4021 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
4023 wake_unlock(&battery
->cable_wake_lock
);
4024 dev_info(battery
->dev
, "%s: End\n", __func__
);
4027 static void sec_bat_afc_work(struct work_struct
*work
)
4029 struct sec_battery_info
*battery
= container_of(work
,
4030 struct sec_battery_info
, afc_work
.work
);
4031 union power_supply_propval value
= {0, };
4033 psy_do_property(battery
->pdata
->charger_name
, get
,
4034 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
4035 battery
->current_max
= value
.intval
;
4037 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
) {
4038 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AFC
);
4039 if ((battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
&&
4040 battery
->current_max
>= battery
->pdata
->pre_wc_afc_input_current
) ||
4041 ((battery
->cable_type
== SEC_BATTERY_CABLE_TA
) &&
4042 battery
->current_max
>= battery
->pdata
->pre_afc_input_current
)) {
4043 sec_bat_set_charging_current(battery
);
4046 wake_unlock(&battery
->afc_wake_lock
);
4049 ssize_t
sec_bat_show_attrs(struct device
*dev
,
4050 struct device_attribute
*attr
, char *buf
)
4052 struct power_supply
*psy
= dev_get_drvdata(dev
);
4053 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
4054 const ptrdiff_t offset
= attr
- sec_battery_attrs
;
4055 union power_supply_propval value
= {0, };
4060 case BATT_RESET_SOC
:
4062 case BATT_READ_RAW_SOC
:
4065 SEC_FUELGAUGE_CAPACITY_TYPE_RAW
;
4066 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4067 POWER_SUPPLY_PROP_CAPACITY
, value
);
4069 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4073 case BATT_READ_ADJ_SOC
:
4076 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n",
4077 battery
->batt_type
);
4080 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4081 battery
->voltage_ocv
);
4084 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4085 battery
->inbat_adc
);
4087 case BATT_VOL_ADC_CAL
:
4091 case BATT_VOL_ADC_AVER
:
4094 case BATT_CURRENT_UA_NOW
:
4096 value
.intval
= SEC_BATTERY_CURRENT_UA
;
4097 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4098 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
4099 #if defined(CONFIG_SEC_FACTORY)
4100 pr_err("%s: batt_current_ua_now (%d)\n",
4101 __func__
, value
.intval
);
4103 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4107 case BATT_CURRENT_UA_AVG
:
4109 value
.intval
= SEC_BATTERY_CURRENT_UA
;
4110 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4111 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
4113 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4118 case BATT_FILTER_CFG
:
4120 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4121 POWER_SUPPLY_PROP_FILTER_CFG
, value
);
4123 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n",
4128 switch (battery
->pdata
->thermal_source
) {
4129 case SEC_BATTERY_THERMAL_SOURCE_FG
:
4130 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4131 POWER_SUPPLY_PROP_TEMP
, value
);
4133 case SEC_BATTERY_THERMAL_SOURCE_CALLBACK
:
4134 if (battery
->pdata
->get_temperature_callback
) {
4135 battery
->pdata
->get_temperature_callback(
4136 POWER_SUPPLY_PROP_TEMP
, &value
);
4139 case SEC_BATTERY_THERMAL_SOURCE_ADC
:
4140 sec_bat_get_value_by_adc(battery
,
4141 SEC_BAT_ADC_CHANNEL_TEMP
, &value
);
4146 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4151 If F/G is used for reading the temperature and
4152 compensation table is used,
4153 the raw value that isn't compensated can be read by
4154 POWER_SUPPLY_PROP_TEMP_AMBIENT
4156 switch (battery
->pdata
->thermal_source
) {
4157 case SEC_BATTERY_THERMAL_SOURCE_FG
:
4158 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4159 POWER_SUPPLY_PROP_TEMP_AMBIENT
, value
);
4160 battery
->temp_adc
= value
.intval
;
4165 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4168 case BATT_TEMP_AVER
:
4170 case BATT_TEMP_ADC_AVER
:
4173 if (battery
->pdata
->usb_thermal_source
) {
4174 sec_bat_get_value_by_adc(battery
,
4175 SEC_BAT_ADC_CHANNEL_USB_TEMP
, &value
);
4176 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4179 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4184 if (battery
->pdata
->usb_thermal_source
) {
4185 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4186 battery
->usb_temp_adc
);
4188 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4193 if (battery
->pdata
->chg_thermal_source
) {
4194 sec_bat_get_value_by_adc(battery
,
4195 SEC_BAT_ADC_CHANNEL_CHG_TEMP
, &value
);
4196 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4199 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4204 if (battery
->pdata
->chg_thermal_source
) {
4205 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4206 battery
->chg_temp_adc
);
4208 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4212 case SLAVE_CHG_TEMP
:
4213 if (battery
->pdata
->slave_thermal_source
) {
4214 sec_bat_get_value_by_adc(battery
,
4215 SEC_BAT_ADC_CHANNEL_SLAVE_CHG_TEMP
, &value
);
4216 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4219 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4223 case SLAVE_CHG_TEMP_ADC
:
4224 if (battery
->pdata
->slave_thermal_source
) {
4225 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4226 battery
->slave_chg_temp_adc
);
4228 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4234 case BATT_SLATE_MODE
:
4235 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4236 battery
->slate_mode
);
4239 case BATT_LP_CHARGING
:
4241 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4245 case SIOP_ACTIVATED
:
4248 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4249 battery
->siop_level
);
4252 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", 0);
4254 case BATT_CHARGING_SOURCE
:
4255 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4256 battery
->cable_type
);
4265 SEC_BATTERY_CAPACITY_DESIGNED
;
4266 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4267 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4269 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x ",
4273 SEC_BATTERY_CAPACITY_ABSOLUTE
;
4274 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4275 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4277 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x ",
4281 SEC_BATTERY_CAPACITY_TEMPERARY
;
4282 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4283 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4285 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x ",
4289 SEC_BATTERY_CAPACITY_CURRENT
;
4290 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4291 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4293 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%04x\n",
4300 struct power_supply
*psy_fg
= NULL
;
4301 psy_fg
= get_power_supply_by_name(battery
->pdata
->fuelgauge_name
);
4303 pr_err("%s: Fail to get psy (%s)\n",
4304 __func__
, battery
->pdata
->fuelgauge_name
);
4306 if (psy_fg
->desc
->get_property
!= NULL
) {
4307 ret
= psy_fg
->desc
->get_property(psy_fg
,
4308 POWER_SUPPLY_PROP_ENERGY_FULL
, &value
);
4310 pr_err("%s: Fail to %s get (%d=>%d)\n",
4311 __func__
, battery
->pdata
->fuelgauge_name
,
4312 POWER_SUPPLY_PROP_ENERGY_FULL
, ret
);
4317 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4322 case CHG_CURRENT_ADC
:
4323 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4324 battery
->current_adc
);
4329 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4330 is_wireless_type(battery
->cable_type
) ? 1: 0);
4333 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4334 battery
->wc_enable
);
4337 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4338 battery
->wc_enable
);
4340 case WC_CONTROL_CNT
:
4341 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4342 battery
->wc_enable_cnt_value
);
4345 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4346 battery
->led_cover
);
4348 case HV_CHARGER_STATUS
:
4351 if (is_hv_wire_12v_type(battery
->cable_type
) ||
4352 battery
->max_charge_power
>= HV_CHARGER_STATUS_STANDARD2
) /* 20000mW */
4354 else if (is_hv_wire_type(battery
->cable_type
) ||
4355 (battery
->cable_type
== SEC_BATTERY_CABLE_PDIC
&&
4356 battery
->pd_max_charge_power
>= HV_CHARGER_STATUS_STANDARD1
&&
4357 battery
->pdic_info
.sink_status
.available_pdo_num
> 1) ||
4358 battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_TA
||
4359 battery
->max_charge_power
>= HV_CHARGER_STATUS_STANDARD1
) /* 12000mW */
4362 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", check_val
);
4365 case HV_WC_CHARGER_STATUS
:
4366 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4367 is_hv_wireless_type(battery
->cable_type
) ? 1 : 0);
4369 case HV_CHARGER_SET
:
4372 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4373 battery
->factory_mode
);
4376 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4377 battery
->store_mode
);
4382 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4383 battery
->test_mode
);
4386 case BATT_EVENT_CALL
:
4387 case BATT_EVENT_2G_CALL
:
4388 case BATT_EVENT_TALK_GSM
:
4390 case BATT_EVENT_3G_CALL
:
4391 case BATT_EVENT_TALK_WCDMA
:
4393 case BATT_EVENT_MUSIC
:
4395 case BATT_EVENT_VIDEO
:
4397 case BATT_EVENT_BROWSER
:
4399 case BATT_EVENT_HOTSPOT
:
4401 case BATT_EVENT_CAMERA
:
4403 case BATT_EVENT_CAMCORDER
:
4405 case BATT_EVENT_DATA_CALL
:
4407 case BATT_EVENT_WIFI
:
4409 case BATT_EVENT_WIBRO
:
4411 case BATT_EVENT_LTE
:
4413 case BATT_EVENT_LCD
:
4415 case BATT_EVENT_GPS
:
4419 case BATT_TEMP_TABLE
:
4420 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
,
4421 "%d %d %d %d %d %d %d %d\n",
4422 battery
->pdata
->temp_high_threshold_normal
,
4423 battery
->pdata
->temp_high_recovery_normal
,
4424 battery
->pdata
->temp_low_threshold_normal
,
4425 battery
->pdata
->temp_low_recovery_normal
,
4426 battery
->pdata
->temp_high_threshold_lpm
,
4427 battery
->pdata
->temp_high_recovery_lpm
,
4428 battery
->pdata
->temp_low_threshold_lpm
,
4429 battery
->pdata
->temp_low_recovery_lpm
);
4431 case BATT_HIGH_CURRENT_USB
:
4432 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4433 battery
->is_hc_usb
);
4435 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
4436 case TEST_CHARGE_CURRENT
:
4438 psy_do_property(battery
->pdata
->charger_name
, get
,
4439 POWER_SUPPLY_PROP_CURRENT_NOW
, value
);
4440 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4445 case SET_STABILITY_TEST
:
4446 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4447 battery
->stability_test
);
4449 case BATT_CAPACITY_MAX
:
4450 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4451 POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN
, value
);
4452 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4454 case BATT_INBAT_VOLTAGE
:
4455 case BATT_INBAT_VOLTAGE_OCV
:
4456 if(battery
->pdata
->support_fgsrc_change
== true) {
4457 int j
, k
, ocv
, ocv_data
[10];
4459 psy_do_property(battery
->pdata
->fgsrc_switch_name
, set
,
4460 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4461 for (j
= 0; j
< 10; j
++) {
4463 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4464 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
4465 ocv_data
[j
] = value
.intval
;
4468 psy_do_property(battery
->pdata
->fgsrc_switch_name
, set
,
4469 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4470 for (j
= 1; j
< 10; j
++) {
4473 while (k
> 0 && ocv_data
[k
-1] > ocv
) {
4474 ocv_data
[k
] = ocv_data
[k
-1];
4480 for (j
= 2; j
< 8; j
++) {
4485 ret
= sec_bat_get_inbat_vol_by_adc(battery
);
4487 dev_info(battery
->dev
, "in-battery voltage ocv(%d)\n", ret
);
4488 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4491 case CHECK_SLAVE_CHG
:
4492 psy_do_property(battery
->pdata
->charger_name
, get
,
4493 POWER_SUPPLY_EXT_PROP_CHECK_SLAVE_I2C
, value
);
4494 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4496 pr_info("%s : CHECK_SLAVE_CHG=%d\n",__func__
,value
.intval
);
4498 case BATT_INBAT_WIRELESS_CS100
:
4499 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4500 POWER_SUPPLY_PROP_STATUS
, value
);
4501 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4503 case HMT_TA_CONNECTED
:
4504 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4505 (battery
->cable_type
== SEC_BATTERY_CABLE_HMT_CONNECTED
) ? 1 : 0);
4508 #if defined(CONFIG_CCIC_NOTIFIER)
4509 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4510 (battery
->current_event
& SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
) ? 0 : 1);
4512 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4513 (battery
->cable_type
== SEC_BATTERY_CABLE_HMT_CHARGE
) ? 1 : 0);
4516 #if defined(CONFIG_BATTERY_AGE_FORECAST)
4518 value
.intval
= SEC_BATTERY_CAPACITY_CYCLE
;
4519 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4520 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4521 value
.intval
= value
.intval
/ 100;
4522 dev_info(battery
->dev
, "fg cycle(%d)\n", value
.intval
);
4523 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4525 case FG_FULL_VOLTAGE
:
4526 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d %d\n",
4527 battery
->pdata
->chg_float_voltage
, battery
->pdata
->recharge_condition_vcell
);
4531 SEC_BATTERY_CAPACITY_AGEDCELL
;
4532 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4533 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4534 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4537 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", battery
->batt_cycle
);
4541 if (battery
->pdata
->wpc_thermal_source
) {
4542 sec_bat_get_value_by_adc(battery
,
4543 SEC_BAT_ADC_CHANNEL_WPC_TEMP
, &value
);
4544 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4547 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4551 case BATT_WPC_TEMP_ADC
:
4552 if (battery
->pdata
->wpc_thermal_source
) {
4553 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4554 battery
->wpc_temp_adc
);
4556 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4560 case BATT_COIL_TEMP
:
4561 if (battery
->pdata
->coil_thermal_source
) {
4562 sec_bat_get_value_by_adc(battery
,
4563 SEC_BAT_ADC_CHANNEL_WPC_TEMP
, &value
);
4564 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4567 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4571 case BATT_COIL_TEMP_ADC
:
4572 if (battery
->pdata
->coil_thermal_source
) {
4573 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4574 battery
->coil_temp_adc
);
4576 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4580 case BATT_WIRELESS_MST_SWITCH_TEST
:
4581 value
.intval
= SEC_WIRELESS_MST_SWITCH_VERIFY
;
4582 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4583 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4584 pr_info("%s MST switch verify. result: %x\n", __func__
, value
.intval
);
4585 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4587 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
4588 case BATT_WIRELESS_FIRMWARE_UPDATE
:
4589 value
.intval
= SEC_WIRELESS_OTP_FIRM_VERIFY
;
4590 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4591 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4592 pr_info("%s RX firmware verify. result: %d\n", __func__
, value
.intval
);
4593 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4595 case OTP_FIRMWARE_RESULT
:
4596 value
.intval
= SEC_WIRELESS_OTP_FIRM_RESULT
;
4597 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4598 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4599 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4602 value
.intval
= SEC_WIRELESS_IC_GRADE
;
4603 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4604 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4605 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%x ", value
.intval
);
4607 value
.intval
= SEC_WIRELESS_IC_REVISION
;
4608 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4609 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4610 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%x\n", value
.intval
);
4612 case OTP_FIRMWARE_VER_BIN
:
4613 value
.intval
= SEC_WIRELESS_OTP_FIRM_VER_BIN
;
4614 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4615 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4616 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4618 case OTP_FIRMWARE_VER
:
4619 value
.intval
= SEC_WIRELESS_OTP_FIRM_VER
;
4620 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4621 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4623 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4625 case TX_FIRMWARE_RESULT
:
4626 value
.intval
= SEC_WIRELESS_TX_FIRM_RESULT
;
4627 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4628 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4629 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4631 case TX_FIRMWARE_VER
:
4632 value
.intval
= SEC_WIRELESS_TX_FIRM_VER
;
4633 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4634 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4636 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4638 case BATT_TX_STATUS
:
4639 value
.intval
= SEC_TX_FIRMWARE
;
4640 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4641 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
4643 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%x\n", value
.intval
);
4647 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4648 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
4649 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4652 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4653 POWER_SUPPLY_PROP_ENERGY_AVG
, value
);
4654 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4656 case BATT_HV_WIRELESS_STATUS
:
4657 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4658 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
4659 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4661 case BATT_HV_WIRELESS_PAD_CTRL
:
4664 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4665 POWER_SUPPLY_EXT_PROP_WIRELESS_OP_FREQ
, value
);
4666 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n", value
.intval
);
4669 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4670 POWER_SUPPLY_EXT_PROP_WIRELESS_TX_CMD
, value
);
4671 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%02x ",
4674 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
4675 POWER_SUPPLY_EXT_PROP_WIRELESS_TX_VAL
, value
);
4676 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "0x%02x ",
4679 case BATT_TUNE_FLOAT_VOLTAGE
:
4680 ret
= battery
->pdata
->chg_float_voltage
;
4681 pr_info("%s float voltage = %d mA",__func__
, ret
);
4682 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4685 case BATT_TUNE_INPUT_CHARGE_CURRENT
:
4686 ret
= battery
->pdata
->charging_current
[i
].input_current_limit
;
4687 pr_info("%s input charge current = %d mA",__func__
, ret
);
4688 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4691 case BATT_TUNE_FAST_CHARGE_CURRENT
:
4692 ret
= battery
->pdata
->charging_current
[i
].fast_charging_current
;
4693 pr_info("%s fast charge current = %d mA",__func__
, ret
);
4694 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4697 case BATT_TUNE_UI_TERM_CURRENT_1ST
:
4698 ret
= battery
->pdata
->full_check_current_1st
;
4699 pr_info("%s ui term current = %d mA",__func__
, ret
);
4700 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4703 case BATT_TUNE_UI_TERM_CURRENT_2ND
:
4704 ret
= battery
->pdata
->full_check_current_2nd
;
4705 pr_info("%s ui term current = %d mA",__func__
, ret
);
4706 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4709 case BATT_TUNE_TEMP_HIGH_NORMAL
:
4710 ret
= battery
->pdata
->temp_high_threshold_normal
;
4711 pr_info("%s temp high normal block = %d ",__func__
, ret
);
4712 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4715 case BATT_TUNE_TEMP_HIGH_REC_NORMAL
:
4716 ret
= battery
->pdata
->temp_high_recovery_normal
;
4717 pr_info("%s temp high normal recover = %d ",__func__
, ret
);
4718 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4721 case BATT_TUNE_TEMP_LOW_NORMAL
:
4722 ret
= battery
->pdata
->temp_low_threshold_normal
;
4723 pr_info("%s temp low normal block = %d ",__func__
, ret
);
4724 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4727 case BATT_TUNE_TEMP_LOW_REC_NORMAL
:
4728 ret
= battery
->pdata
->temp_low_recovery_normal
;
4729 pr_info("%s temp low normal recover = %d ",__func__
, ret
);
4730 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4733 case BATT_TUNE_CHG_TEMP_HIGH
:
4734 ret
= battery
->pdata
->chg_high_temp
;
4735 pr_info("%s chg_high_temp = %d ",__func__
, ret
);
4736 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4739 case BATT_TUNE_CHG_TEMP_REC
:
4740 ret
= battery
->pdata
->chg_high_temp_recovery
;
4741 pr_info("%s chg_high_temp_recovery = %d ",__func__
, ret
);
4742 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4745 case BATT_TUNE_CHG_LIMMIT_CUR
:
4746 ret
= battery
->pdata
->chg_charging_limit_current
;
4747 pr_info("%s chg_charging_limit_current = %d ",__func__
, ret
);
4748 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4751 case BATT_TUNE_COIL_TEMP_HIGH
:
4753 case BATT_TUNE_COIL_TEMP_REC
:
4755 case BATT_TUNE_COIL_LIMMIT_CUR
:
4757 #if defined(CONFIG_UPDATE_BATTERY_DATA)
4758 case BATT_UPDATE_DATA
:
4759 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n",
4760 battery
->data_path
? "OK" : "NOK");
4763 case BATT_MISC_EVENT
:
4764 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4765 battery
->misc_event
);
4767 case BATT_EXT_DEV_CHG
:
4769 case BATT_WDT_CONTROL
:
4770 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4771 battery
->wdt_kick_disable
);
4774 value
.strval
= NULL
;
4775 psy_do_property(battery
->pdata
->charger_name
, get
,
4776 POWER_SUPPLY_EXT_PROP_MULTI_CHARGER_MODE
, value
);
4777 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n",
4778 (value
.strval
) ? value
.strval
: "master");
4780 case CHECK_PS_READY
:
4781 #if defined(CONFIG_CCIC_NOTIFIER)
4782 value
.intval
= battery
->pdic_ps_rdy
;
4783 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4785 pr_info("%s : CHECK_PS_READY=%d\n",__func__
,value
.intval
);
4789 psy_do_property(battery
->pdata
->charger_name
, get
,
4790 POWER_SUPPLY_EXT_PROP_CHIP_ID
, value
);
4791 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4794 case CISD_FULLCAPREP_MAX
:
4796 union power_supply_propval fullcaprep_val
;
4798 fullcaprep_val
.intval
= SEC_BATTERY_CAPACITY_FULL
;
4799 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4800 POWER_SUPPLY_PROP_ENERGY_NOW
, fullcaprep_val
);
4802 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4803 fullcaprep_val
.intval
);
4806 #if defined(CONFIG_BATTERY_CISD)
4809 struct cisd
*pcisd
= &battery
->cisd
;
4810 char temp_buf
[1024] = {0,};
4813 sprintf(temp_buf
+strlen(temp_buf
), "%d", pcisd
->data
[CISD_DATA_RESET_ALG
]);
4814 for (j
= CISD_DATA_RESET_ALG
+ 1; j
< CISD_DATA_MAX_PER_DAY
; j
++)
4815 sprintf(temp_buf
+strlen(temp_buf
), " %d", pcisd
->data
[j
]);
4816 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4819 case CISD_DATA_JSON
:
4821 struct cisd
*pcisd
= &battery
->cisd
;
4822 char temp_buf
[1920] = {0,};
4825 sprintf(temp_buf
+strlen(temp_buf
), "\"%s\":\"%d\"",
4826 cisd_data_str
[CISD_DATA_RESET_ALG
], pcisd
->data
[CISD_DATA_RESET_ALG
]);
4827 for (j
= CISD_DATA_RESET_ALG
+ 1; j
< CISD_DATA_MAX
; j
++)
4828 sprintf(temp_buf
+strlen(temp_buf
), ",\"%s\":\"%d\"", cisd_data_str
[j
], pcisd
->data
[j
]);
4829 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4832 case CISD_DATA_D_JSON
:
4834 struct cisd
*pcisd
= &battery
->cisd
;
4835 char temp_buf
[1920] = {0,};
4838 sprintf(temp_buf
+strlen(temp_buf
), "\"%s\":\"%d\"",
4839 cisd_data_str_d
[CISD_DATA_FULL_COUNT_PER_DAY
-CISD_DATA_MAX
],
4840 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
]);
4841 for (j
= CISD_DATA_FULL_COUNT_PER_DAY
+ 1; j
< CISD_DATA_MAX_PER_DAY
; j
++)
4842 sprintf(temp_buf
+strlen(temp_buf
), ",\"%s\":\"%d\"",
4843 cisd_data_str_d
[j
-CISD_DATA_MAX
], pcisd
->data
[j
]);
4845 /* Clear Daily Data */
4846 for (j
= CISD_DATA_FULL_COUNT_PER_DAY
; j
< CISD_DATA_MAX_PER_DAY
; j
++)
4849 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
] = 1;
4850 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX_PER_DAY
] = -300;
4851 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX_PER_DAY
] = -300;
4852 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX_PER_DAY
] = -300;
4853 pcisd
->data
[CISD_DATA_USB_TEMP_MAX_PER_DAY
] = -300;
4854 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN_PER_DAY
] = 1000;
4855 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN_PER_DAY
] = 1000;
4856 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN_PER_DAY
] = 1000;
4857 pcisd
->data
[CISD_DATA_USB_TEMP_MIN_PER_DAY
] = 1000;
4859 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY
] = -300;
4860 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY
] = -300;
4861 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX_PER_DAY
] = -300;
4862 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY
] = -300;
4863 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY
] = 1000;
4864 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY
] = 1000;
4865 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN_PER_DAY
] = 1000;
4866 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY
] = 1000;
4868 pcisd
->data
[CISD_DATA_CAP_MIN_PER_DAY
] = 0xFFFF;
4869 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4872 case CISD_WIRE_COUNT
:
4874 struct cisd
*pcisd
= &battery
->cisd
;
4875 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4876 pcisd
->data
[CISD_DATA_WIRE_COUNT
]);
4881 struct cisd
*pcisd
= &battery
->cisd
;
4882 struct pad_data
*pad_data
= pcisd
->pad_array
;
4883 char temp_buf
[1024] = {0,};
4886 sprintf(temp_buf
+strlen(temp_buf
), "%d %d",
4887 PAD_INDEX_VALUE
, pcisd
->pad_count
);
4888 while ((pad_data
!= NULL
) && ((pad_data
= pad_data
->next
) != NULL
) &&
4889 (pad_data
->id
< MAX_PAD_ID
) && (j
++ < pcisd
->pad_count
))
4890 sprintf(temp_buf
+strlen(temp_buf
), " 0x%02x:%d", pad_data
->id
, pad_data
->count
);
4891 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4894 case CISD_WC_DATA_JSON
:
4896 struct cisd
*pcisd
= &battery
->cisd
;
4897 struct pad_data
*pad_data
= pcisd
->pad_array
;
4898 char temp_buf
[1024] = {0,};
4901 sprintf(temp_buf
+strlen(temp_buf
), "\"%s\":\"%d\"",
4902 PAD_INDEX_STRING
, PAD_INDEX_VALUE
);
4903 while ((pad_data
!= NULL
) && ((pad_data
= pad_data
->next
) != NULL
) &&
4904 (pad_data
->id
< MAX_PAD_ID
) && (j
++ < pcisd
->pad_count
))
4905 sprintf(temp_buf
+strlen(temp_buf
), ",\"%s%02x\":\"%d\"",
4906 PAD_JSON_STRING
, pad_data
->id
, pad_data
->count
);
4907 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", temp_buf
);
4910 case PREV_BATTERY_DATA
:
4912 if (battery
->enable_update_data
)
4913 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d, %d, %d, %d\n",
4914 battery
->voltage_now
, battery
->temperature
,
4915 battery
->is_jig_on
, !battery
->charging_block
);
4918 case PREV_BATTERY_INFO
:
4920 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d,%d,%d,%d\n",
4921 battery
->prev_volt
, battery
->prev_temp
,
4922 battery
->prev_jig_on
, battery
->prev_chg_on
);
4923 pr_info("%s: Read Prev Battery Info : %d, %d, %d, %d\n", __func__
,
4924 battery
->prev_volt
, battery
->prev_temp
,
4925 battery
->prev_jig_on
, battery
->prev_chg_on
);
4929 #if defined(CONFIG_BATTERY_SBM_DATA)
4931 if (battery
->sbm_data
) {
4932 sec_bat_get_sbm_data_string(&value
);
4933 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%s\n", value
.strval
);
4934 battery
->sbm_data
= false;
4940 case SAFETY_TIMER_SET
:
4941 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4942 battery
->safety_timer_set
);
4944 case BATT_SWELLING_CONTROL
:
4945 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4946 battery
->skip_swelling
);
4948 case SAFETY_TIMER_INFO
:
4949 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%ld\n",
4950 battery
->cal_safety_time
);
4952 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
4953 case BATT_TEMP_TEST
:
4954 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d %d %d %d\n",
4955 battery
->temperature_test_battery
,
4956 battery
->temperature_test_usb
,
4957 battery
->temperature_test_wpc
,
4958 battery
->temperature_test_chg
);
4961 case BATT_CURRENT_EVENT
:
4962 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4963 battery
->current_event
);
4967 union power_supply_propval cc_val
;
4969 cc_val
.intval
= SEC_BATTERY_CAPACITY_QH
;
4970 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
4971 POWER_SUPPLY_PROP_ENERGY_NOW
, cc_val
);
4973 i
+= scnprintf(buf
+ i
, PAGE_SIZE
- i
, "%d\n",
4987 void update_external_temp_table(struct sec_battery_info
*battery
, int temp
[])
4989 battery
->pdata
->temp_high_threshold_normal
= temp
[0];
4990 battery
->pdata
->temp_high_recovery_normal
= temp
[1];
4991 battery
->pdata
->temp_low_threshold_normal
= temp
[2];
4992 battery
->pdata
->temp_low_recovery_normal
= temp
[3];
4993 battery
->pdata
->temp_high_threshold_lpm
= temp
[4];
4994 battery
->pdata
->temp_high_recovery_lpm
= temp
[5];
4995 battery
->pdata
->temp_low_threshold_lpm
= temp
[6];
4996 battery
->pdata
->temp_low_recovery_lpm
= temp
[7];
5000 ssize_t
sec_bat_store_attrs(
5002 struct device_attribute
*attr
,
5003 const char *buf
, size_t count
)
5005 struct power_supply
*psy
= dev_get_drvdata(dev
);
5006 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
5007 const ptrdiff_t offset
= attr
- sec_battery_attrs
;
5012 union power_supply_propval value
= {0, };
5015 case BATT_RESET_SOC
:
5016 /* Do NOT reset fuel gauge in charging mode */
5017 if ((battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) ||
5018 battery
->is_jig_on
) {
5019 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_BATT_RESET_SOC
, 0);
5022 SEC_FUELGAUGE_CAPACITY_TYPE_RESET
;
5023 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
5024 POWER_SUPPLY_PROP_CAPACITY
, value
);
5025 dev_info(battery
->dev
,"do reset SOC\n");
5026 /* update battery info */
5027 sec_bat_get_battery_info(battery
);
5031 case BATT_READ_RAW_SOC
:
5033 case BATT_READ_ADJ_SOC
:
5036 strncpy(battery
->batt_type
, buf
, sizeof(battery
->batt_type
) - 1);
5037 battery
->batt_type
[sizeof(battery
->batt_type
)-1] = '\0';
5044 case BATT_VOL_ADC_CAL
:
5048 case BATT_VOL_ADC_AVER
:
5050 case BATT_CURRENT_UA_NOW
:
5052 case BATT_CURRENT_UA_AVG
:
5054 case BATT_FILTER_CFG
:
5055 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5057 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
5058 POWER_SUPPLY_PROP_FILTER_CFG
, value
);
5063 #if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
5064 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5065 dev_info(battery
->dev
,
5066 "%s: cooldown mode %s \n", __func__
, (x
? "enable" : "disable"));
5068 battery
->cooldown_mode
= false;
5070 battery
->cooldown_mode
= true;
5077 case BATT_TEMP_AVER
:
5079 case BATT_TEMP_ADC_AVER
:
5089 case SLAVE_CHG_TEMP
:
5091 case SLAVE_CHG_TEMP_ADC
:
5095 case BATT_SLATE_MODE
:
5096 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5097 if (x
== battery
->slate_mode
) {
5098 dev_info(battery
->dev
,
5099 "%s : skip same slate mode : %d\n", __func__
, x
);
5101 } else if (x
== 1) {
5102 battery
->slate_mode
= true;
5103 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SLATE
, SEC_BAT_CURRENT_EVENT_SLATE
);
5104 dev_info(battery
->dev
,
5105 "%s: enable slate mode : %d\n", __func__
, x
);
5106 } else if (x
== 0) {
5107 battery
->slate_mode
= false;
5108 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_SLATE
);
5109 dev_info(battery
->dev
,
5110 "%s: disable slate mode : %d\n", __func__
, x
);
5112 dev_info(battery
->dev
,
5113 "%s: SLATE MODE unknown command\n", __func__
);
5116 wake_lock(&battery
->cable_wake_lock
);
5117 queue_delayed_work(battery
->monitor_wqueue
,
5118 &battery
->cable_work
, 0);
5122 case BATT_LP_CHARGING
:
5124 case SIOP_ACTIVATED
:
5127 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5128 dev_info(battery
->dev
,
5129 "%s: siop level: %d\n", __func__
, x
);
5131 battery
->wc_heating_start_time
= 0;
5132 if (x
== battery
->siop_level
) {
5133 dev_info(battery
->dev
,
5134 "%s: skip same siop level: %d\n", __func__
, x
);
5136 } else if (x
>= 0 && x
<= 100) {
5137 battery
->siop_level
= x
;
5139 battery
->siop_level
= 100;
5142 wake_lock(&battery
->siop_level_wake_lock
);
5143 queue_delayed_work(battery
->monitor_wqueue
, &battery
->siop_level_work
, 0);
5149 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5153 case BATT_CHARGING_SOURCE
:
5165 case CHG_CURRENT_ADC
:
5172 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5174 mutex_lock(&battery
->wclock
);
5175 battery
->wc_enable
= false;
5176 battery
->wc_enable_cnt
= 0;
5177 mutex_unlock(&battery
->wclock
);
5178 } else if (x
== 1) {
5179 mutex_lock(&battery
->wclock
);
5180 battery
->wc_enable
= true;
5181 battery
->wc_enable_cnt
= 0;
5182 mutex_unlock(&battery
->wclock
);
5184 dev_info(battery
->dev
,
5185 "%s: WPC ENABLE unknown command\n",
5189 wake_lock(&battery
->cable_wake_lock
);
5190 queue_delayed_work(battery
->monitor_wqueue
,
5191 &battery
->cable_work
, 0);
5196 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5197 if (battery
->pdata
->wpc_en
) {
5199 mutex_lock(&battery
->wclock
);
5200 battery
->wc_enable
= false;
5201 battery
->wc_enable_cnt
= 0;
5203 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5204 POWER_SUPPLY_EXT_PROP_WC_CONTROL
, value
);
5205 gpio_direction_output(battery
->pdata
->wpc_en
, 1);
5206 pr_info("%s: WC CONTROL: Disable", __func__
);
5207 mutex_unlock(&battery
->wclock
);
5208 } else if (x
== 1) {
5209 mutex_lock(&battery
->wclock
);
5210 battery
->wc_enable
= true;
5211 battery
->wc_enable_cnt
= 0;
5213 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5214 POWER_SUPPLY_EXT_PROP_WC_CONTROL
, value
);
5215 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
5216 pr_info("%s: WC CONTROL: Enable", __func__
);
5217 mutex_unlock(&battery
->wclock
);
5219 dev_info(battery
->dev
,
5220 "%s: WC CONTROL unknown command\n",
5228 case WC_CONTROL_CNT
:
5229 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5230 battery
->wc_enable_cnt_value
= x
;
5235 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5236 pr_info("%s: MFC, LED_COVER(%d)\n", __func__
, x
);
5237 battery
->led_cover
= x
;
5238 value
.intval
= battery
->led_cover
;
5239 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5240 POWER_SUPPLY_PROP_FILTER_CFG
, value
);
5244 case HV_CHARGER_STATUS
:
5246 case HV_WC_CHARGER_STATUS
:
5248 case HV_CHARGER_SET
:
5249 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5250 dev_info(battery
->dev
,
5251 "%s: HV_CHARGER_SET(%d)\n", __func__
, x
);
5253 battery
->wire_status
= SEC_BATTERY_CABLE_9V_TA
;
5254 wake_lock(&battery
->cable_wake_lock
);
5255 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5257 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
5258 wake_lock(&battery
->cable_wake_lock
);
5259 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5265 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5266 battery
->factory_mode
= x
? true : false;
5271 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5272 #if !defined(CONFIG_SEC_FACTORY)
5274 battery
->store_mode
= true;
5275 wake_lock(&battery
->parse_mode_dt_wake_lock
);
5276 queue_delayed_work(battery
->monitor_wqueue
,
5277 &battery
->parse_mode_dt_work
, 0);
5284 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5285 /* update battery info */
5286 sec_bat_get_battery_info(battery
);
5291 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5292 battery
->test_mode
= x
;
5293 wake_lock(&battery
->monitor_wake_lock
);
5294 queue_delayed_work(battery
->monitor_wqueue
,
5295 &battery
->monitor_work
, 0);
5300 case BATT_EVENT_CALL
:
5301 case BATT_EVENT_2G_CALL
:
5302 case BATT_EVENT_TALK_GSM
:
5303 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5307 case BATT_EVENT_3G_CALL
:
5308 case BATT_EVENT_TALK_WCDMA
:
5309 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5313 case BATT_EVENT_MUSIC
:
5314 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5318 case BATT_EVENT_VIDEO
:
5319 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5323 case BATT_EVENT_BROWSER
:
5324 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5328 case BATT_EVENT_HOTSPOT
:
5329 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5333 case BATT_EVENT_CAMERA
:
5334 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5338 case BATT_EVENT_CAMCORDER
:
5339 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5343 case BATT_EVENT_DATA_CALL
:
5344 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5348 case BATT_EVENT_WIFI
:
5349 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5353 case BATT_EVENT_WIBRO
:
5354 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5358 case BATT_EVENT_LTE
:
5359 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5363 case BATT_EVENT_LCD
:
5364 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5366 get_monotonic_boottime(&ts
);
5368 battery
->lcd_status
= true;
5370 battery
->lcd_status
= false;
5375 case BATT_EVENT_GPS
:
5376 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5380 case BATT_TEMP_TABLE
:
5381 if (sscanf(buf
, "%10d %10d %10d %10d %10d %10d %10d %10d\n",
5382 &t
[0], &t
[1], &t
[2], &t
[3], &t
[4], &t
[5], &t
[6], &t
[7]) == 8) {
5383 pr_info("%s: (new) %d %d %d %d %d %d %d %d\n",
5384 __func__
, t
[0], t
[1], t
[2], t
[3], t
[4], t
[5], t
[6], t
[7]);
5385 pr_info("%s: (default) %d %d %d %d %d %d %d %d\n",
5387 battery
->pdata
->temp_high_threshold_normal
,
5388 battery
->pdata
->temp_high_recovery_normal
,
5389 battery
->pdata
->temp_low_threshold_normal
,
5390 battery
->pdata
->temp_low_recovery_normal
,
5391 battery
->pdata
->temp_high_threshold_lpm
,
5392 battery
->pdata
->temp_high_recovery_lpm
,
5393 battery
->pdata
->temp_low_threshold_lpm
,
5394 battery
->pdata
->temp_low_recovery_lpm
);
5395 update_external_temp_table(battery
, t
);
5399 case BATT_HIGH_CURRENT_USB
:
5400 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5401 battery
->is_hc_usb
= x
? true : false;
5402 value
.intval
= battery
->is_hc_usb
;
5404 psy_do_property(battery
->pdata
->charger_name
, set
,
5405 POWER_SUPPLY_PROP_USB_HC
, value
);
5407 pr_info("%s: is_hc_usb (%d)\n", __func__
, battery
->is_hc_usb
);
5411 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
5412 case TEST_CHARGE_CURRENT
:
5413 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5414 if (x
>= 0 && x
<= 2000) {
5415 dev_err(battery
->dev
,
5416 "%s: BATT_TEST_CHARGE_CURRENT(%d)\n", __func__
, x
);
5417 battery
->pdata
->charging_current
[
5418 SEC_BATTERY_CABLE_USB
].input_current_limit
= x
;
5419 battery
->pdata
->charging_current
[
5420 SEC_BATTERY_CABLE_USB
].fast_charging_current
= x
;
5422 battery
->eng_not_full_status
= true;
5423 battery
->pdata
->temp_check_type
=
5424 SEC_BATTERY_TEMP_CHECK_NONE
;
5426 if (battery
->cable_type
== SEC_BATTERY_CABLE_USB
) {
5428 psy_do_property(battery
->pdata
->charger_name
, set
,
5429 POWER_SUPPLY_PROP_CURRENT_NOW
,
5437 case SET_STABILITY_TEST
:
5438 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5439 dev_err(battery
->dev
,
5440 "%s: BATT_STABILITY_TEST(%d)\n", __func__
, x
);
5442 battery
->stability_test
= true;
5443 battery
->eng_not_full_status
= true;
5446 battery
->stability_test
= false;
5447 battery
->eng_not_full_status
= false;
5452 case BATT_CAPACITY_MAX
:
5453 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5454 dev_err(battery
->dev
,
5455 "%s: BATT_CAPACITY_MAX(%d), fg_reset(%d)\n", __func__
, x
, fg_reset
);
5456 if (!fg_reset
&& !battery
->store_mode
) {
5458 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
5459 POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN
, value
);
5463 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
5464 POWER_SUPPLY_PROP_CAPACITY
, value
);
5465 battery
->capacity
= value
.intval
;
5467 #if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
5468 battery
->fg_reset
= 1;
5474 case BATT_INBAT_VOLTAGE
:
5476 case BATT_INBAT_VOLTAGE_OCV
:
5478 case CHECK_SLAVE_CHG
:
5480 case BATT_INBAT_WIRELESS_CS100
:
5481 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5482 pr_info("%s send cs100 command \n",__func__
);
5483 value
.intval
= POWER_SUPPLY_STATUS_FULL
;
5484 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5485 POWER_SUPPLY_PROP_STATUS
, value
);
5489 case HMT_TA_CONNECTED
:
5490 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5491 #if !defined(CONFIG_CCIC_NOTIFIER)
5492 dev_info(battery
->dev
,
5493 "%s: HMT_TA_CONNECTED(%d)\n", __func__
, x
);
5495 value
.intval
= false;
5496 psy_do_property(battery
->pdata
->charger_name
, set
,
5497 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5499 dev_info(battery
->dev
,
5500 "%s: changed to OTG cable detached\n", __func__
);
5502 battery
->wire_status
= SEC_BATTERY_CABLE_HMT_CONNECTED
;
5503 wake_lock(&battery
->cable_wake_lock
);
5504 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5506 value
.intval
= true;
5507 psy_do_property(battery
->pdata
->charger_name
, set
,
5508 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5510 dev_info(battery
->dev
,
5511 "%s: changed to OTG cable attached\n", __func__
);
5513 battery
->wire_status
= SEC_BATTERY_CABLE_OTG
;
5514 wake_lock(&battery
->cable_wake_lock
);
5515 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5522 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5523 #if defined(CONFIG_CCIC_NOTIFIER)
5524 dev_info(battery
->dev
,
5525 "%s: HMT_TA_CHARGE(%d)\n", __func__
, x
);
5527 /* do not charge off without cable type, since wdt could be expired */
5528 if (x
&& (battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
)
5529 && (battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
)) {
5530 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
);
5531 /* No charging when FULL & NONE */
5532 if (!((battery
->status
== POWER_SUPPLY_STATUS_FULL
) &&
5533 (battery
->charging_mode
== SEC_BATTERY_CHARGING_NONE
))) {
5534 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING
);
5537 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
,
5538 SEC_BAT_CURRENT_EVENT_CHARGE_DISABLE
);
5539 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
5541 dev_info(battery
->dev
, "%s: Wrong HMT control\n", __func__
);
5545 dev_info(battery
->dev
,
5546 "%s: HMT_TA_CHARGE(%d)\n", __func__
, x
);
5547 psy_do_property(battery
->pdata
->charger_name
, get
,
5548 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
5550 dev_info(battery
->dev
,
5551 "%s: ignore HMT_TA_CHARGE(%d)\n", __func__
, x
);
5554 value
.intval
= false;
5555 psy_do_property(battery
->pdata
->charger_name
, set
,
5556 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5558 dev_info(battery
->dev
,
5559 "%s: changed to OTG cable detached\n", __func__
);
5560 battery
->wire_status
= SEC_BATTERY_CABLE_HMT_CHARGE
;
5561 wake_lock(&battery
->cable_wake_lock
);
5562 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5564 value
.intval
= false;
5565 psy_do_property(battery
->pdata
->charger_name
, set
,
5566 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5568 dev_info(battery
->dev
,
5569 "%s: changed to OTG cable detached\n", __func__
);
5570 battery
->wire_status
= SEC_BATTERY_CABLE_HMT_CONNECTED
;
5571 wake_lock(&battery
->cable_wake_lock
);
5572 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
5579 #if defined(CONFIG_BATTERY_AGE_FORECAST)
5582 case FG_FULL_VOLTAGE
:
5587 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5588 dev_info(battery
->dev
, "%s: BATTERY_CYCLE(%d)\n", __func__
, x
);
5590 int prev_battery_cycle
= battery
->batt_cycle
;
5591 battery
->batt_cycle
= x
;
5592 #if defined(CONFIG_BATTERY_CISD)
5593 battery
->cisd
.data
[CISD_DATA_CYCLE
] = x
;
5595 if (prev_battery_cycle
< 0) {
5596 sec_bat_aging_check(battery
);
5604 case BATT_WPC_TEMP_ADC
:
5605 case BATT_COIL_TEMP
:
5606 case BATT_COIL_TEMP_ADC
:
5608 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
5609 case BATT_WIRELESS_FIRMWARE_UPDATE
:
5610 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5611 if (x
== SEC_WIRELESS_RX_SDCARD_MODE
) {
5612 pr_info("%s fw mode is SDCARD \n", __func__
);
5613 sec_bat_fw_update_work(battery
, SEC_WIRELESS_RX_SDCARD_MODE
);
5614 } else if (x
== SEC_WIRELESS_RX_BUILT_IN_MODE
) {
5615 pr_info("%s fw mode is BUILD IN \n", __func__
);
5616 sec_bat_fw_update_work(battery
, SEC_WIRELESS_RX_BUILT_IN_MODE
);
5617 } else if (x
== SEC_WIRELESS_TX_ON_MODE
) {
5618 pr_info("%s tx mode is on \n", __func__
);
5619 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_ON_MODE
);
5620 } else if (x
== SEC_WIRELESS_TX_OFF_MODE
) {
5621 pr_info("%s tx mode is off \n", __func__
);
5622 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_OFF_MODE
);
5624 dev_info(battery
->dev
, "%s: wireless firmware unknown command\n", __func__
);
5630 case OTP_FIRMWARE_RESULT
:
5631 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5634 pr_info("%s RX firmware update ready!\n", __func__
);
5635 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5636 POWER_SUPPLY_PROP_MANUFACTURER
, value
);
5638 dev_info(battery
->dev
, "%s: firmware unknown command\n", __func__
);
5645 case OTP_FIRMWARE_VER_BIN
:
5646 case OTP_FIRMWARE_VER
:
5647 case TX_FIRMWARE_RESULT
:
5648 case TX_FIRMWARE_VER
:
5650 case BATT_TX_STATUS
:
5651 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5652 if (x
== SEC_TX_OFF
) {
5653 pr_info("%s TX mode is off \n", __func__
);
5654 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_OFF_MODE
);
5655 } else if (x
== SEC_TX_STANDBY
) {
5656 pr_info("%s TX mode is on \n", __func__
);
5657 sec_bat_fw_update_work(battery
, SEC_WIRELESS_TX_ON_MODE
);
5659 dev_info(battery
->dev
, "%s: TX firmware unknown command\n", __func__
);
5669 case BATT_HV_WIRELESS_STATUS
:
5670 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5671 if (x
== 1 && is_hv_wireless_type(battery
->cable_type
)) {
5672 wake_lock(&battery
->cable_wake_lock
);
5673 #ifdef CONFIG_SEC_FACTORY
5674 pr_info("%s change cable type HV WIRELESS -> WIRELESS \n", __func__
);
5675 battery
->wc_status
= SEC_WIRELESS_PAD_WPC
;
5676 battery
->cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
5677 sec_bat_set_charging_current(battery
);
5679 pr_info("%s HV_WIRELESS_STATUS set to 1. Vout set to 5V. \n", __func__
);
5680 value
.intval
= WIRELESS_VOUT_5V
;
5681 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5682 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5683 wake_unlock(&battery
->cable_wake_lock
);
5684 } else if (x
== 3 && is_hv_wireless_type(battery
->cable_type
)) {
5685 pr_info("%s HV_WIRELESS_STATUS set to 3. Vout set to 10V. \n", __func__
);
5686 value
.intval
= WIRELESS_VOUT_10V
;
5687 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5688 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5690 dev_info(battery
->dev
, "%s: HV_WIRELESS_STATUS unknown command\n", __func__
);
5696 case BATT_HV_WIRELESS_PAD_CTRL
:
5697 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5699 pr_err("%s: x : %d\n", __func__
, x
);
5702 ret
= sec_set_param(CM_OFFSET
, '1');
5704 pr_err("%s:sec_set_param failed\n", __func__
);
5707 pr_info("%s: hv wirelee charging is disabled\n", __func__
);
5710 } else if (x
== 2) {
5711 ret
= sec_set_param(CM_OFFSET
, '0');
5713 pr_err("%s: sec_set_param failed\n", __func__
);
5716 pr_info("%s: hv wireless charging is enabled\n", __func__
);
5719 } else if (x
== 3) {
5720 pr_info("%s led off \n", __func__
);
5721 value
.intval
= WIRELESS_PAD_LED_OFF
;
5722 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5723 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5724 } else if (x
== 4) {
5725 pr_info("%s led on \n", __func__
);
5726 value
.intval
= WIRELESS_PAD_LED_ON
;
5727 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
5728 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
5730 dev_info(battery
->dev
, "%s: BATT_HV_WIRELESS_PAD_CTRL unknown command\n", __func__
);
5736 case BATT_TUNE_FLOAT_VOLTAGE
:
5737 sscanf(buf
, "%10d\n", &x
);
5738 pr_info("%s float voltage = %d mV",__func__
, x
);
5740 if(x
> 4000 && x
<= 4400 ){
5742 psy_do_property(battery
->pdata
->charger_name
, set
,
5743 POWER_SUPPLY_PROP_VOLTAGE_MAX
, value
);
5746 case BATT_TUNE_INPUT_CHARGE_CURRENT
:
5747 sscanf(buf
, "%10d\n", &x
);
5748 pr_info("%s input charge current = %d mA",__func__
, x
);
5750 if(x
>= 0 && x
<= 4000 ){
5751 for(i
=0; i
< SEC_BATTERY_CABLE_MAX
; i
++)
5752 battery
->pdata
->charging_current
[i
].input_current_limit
= x
;
5755 psy_do_property(battery
->pdata
->charger_name
, set
,
5756 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
5759 case BATT_TUNE_FAST_CHARGE_CURRENT
:
5760 sscanf(buf
, "%10d\n", &x
);
5761 pr_info("%s fast charge current = %d mA",__func__
, x
);
5762 if(x
>= 0 && x
<= 4000 ){
5763 for(i
=0; i
< SEC_BATTERY_CABLE_MAX
; i
++)
5764 battery
->pdata
->charging_current
[i
].fast_charging_current
= x
;
5767 psy_do_property(battery
->pdata
->charger_name
, set
,
5768 POWER_SUPPLY_PROP_CURRENT_AVG
, value
);
5771 case BATT_TUNE_UI_TERM_CURRENT_1ST
:
5772 sscanf(buf
, "%10d\n", &x
);
5773 pr_info("%s ui term current = %d mA",__func__
, x
);
5775 if(x
> 0 && x
< 1000 ){
5776 battery
->pdata
->full_check_current_1st
= x
;
5779 case BATT_TUNE_UI_TERM_CURRENT_2ND
:
5780 sscanf(buf
, "%10d\n", &x
);
5781 pr_info("%s ui term current = %d mA",__func__
, x
);
5783 if(x
> 0 && x
< 1000 ){
5784 battery
->pdata
->full_check_current_2nd
= x
;
5787 case BATT_TUNE_TEMP_HIGH_NORMAL
:
5788 sscanf(buf
, "%10d\n", &x
);
5789 pr_info("%s temp high normal block = %d ",__func__
, x
);
5790 if(x
< 1000 && x
>= -200)
5791 battery
->pdata
->temp_high_threshold_normal
= x
;
5793 case BATT_TUNE_TEMP_HIGH_REC_NORMAL
:
5794 sscanf(buf
, "%10d\n", &x
);
5795 pr_info("%s temp high normal recover = %d ",__func__
, x
);
5796 if(x
< 1000 && x
>= -200)
5797 battery
->pdata
->temp_high_recovery_normal
= x
;
5799 case BATT_TUNE_TEMP_LOW_NORMAL
:
5800 sscanf(buf
, "%10d\n", &x
);
5801 pr_info("%s temp low normal block = %d ",__func__
, x
);
5802 if(x
< 1000 && x
>= -200)
5803 battery
->pdata
->temp_low_threshold_normal
= x
;
5805 case BATT_TUNE_TEMP_LOW_REC_NORMAL
:
5806 sscanf(buf
, "%10d\n", &x
);
5807 pr_info("%s temp low normal recover = %d ",__func__
, x
);
5808 if(x
< 1000 && x
>= -200)
5809 battery
->pdata
->temp_low_recovery_normal
= x
;
5811 case BATT_TUNE_CHG_TEMP_HIGH
:
5812 sscanf(buf
, "%10d\n", &x
);
5813 pr_info("%s chg_high_temp = %d ",__func__
, x
);
5814 if(x
< 1000 && x
>= -200)
5815 battery
->pdata
->chg_high_temp
= x
;
5817 case BATT_TUNE_CHG_TEMP_REC
:
5818 sscanf(buf
, "%10d\n", &x
);
5819 pr_info("%s chg_high_temp_recovery = %d ",__func__
, x
);
5820 if(x
< 1000 && x
>= -200)
5821 battery
->pdata
->chg_high_temp_recovery
= x
;
5823 case BATT_TUNE_CHG_LIMMIT_CUR
:
5824 sscanf(buf
, "%10d\n", &x
);
5825 pr_info("%s chg_charging_limit_current = %d ",__func__
, x
);
5826 if(x
< 3000 && x
> 0)
5828 battery
->pdata
->chg_charging_limit_current
= x
;
5829 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_ERR
].input_current_limit
= x
;
5830 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_UNKNOWN
].input_current_limit
= x
;
5831 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_TA
].input_current_limit
= x
;
5834 case BATT_TUNE_COIL_TEMP_HIGH
:
5836 case BATT_TUNE_COIL_TEMP_REC
:
5838 case BATT_TUNE_COIL_LIMMIT_CUR
:
5839 sscanf(buf
, "%10d\n", &x
);
5840 pr_info("%s wpc_charging_limit_current = %d ",__func__
, x
);
5841 if(x
< 3000 && x
> 0)
5843 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_ERR
].input_current_limit
= x
;
5844 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_UNKNOWN
].input_current_limit
= x
;
5845 battery
->pdata
->charging_current
[SEC_BATTERY_CABLE_9V_TA
].input_current_limit
= x
;
5848 #if defined(CONFIG_UPDATE_BATTERY_DATA)
5849 case BATT_UPDATE_DATA
:
5850 if (!battery
->data_path
&& (count
* sizeof(char)) < 256) {
5851 battery
->data_path
= kzalloc((count
* sizeof(char) + 1), GFP_KERNEL
);
5852 if (battery
->data_path
) {
5853 sscanf(buf
, "%s\n", battery
->data_path
);
5854 cancel_delayed_work(&battery
->batt_data_work
);
5855 wake_lock(&battery
->batt_data_wake_lock
);
5856 queue_delayed_work(battery
->monitor_wqueue
,
5857 &battery
->batt_data_work
, msecs_to_jiffies(100));
5859 pr_info("%s: failed to alloc data_path buffer\n", __func__
);
5865 case BATT_MISC_EVENT
:
5867 case BATT_EXT_DEV_CHG
:
5868 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5869 pr_info("%s: Connect Ext Device : %d ",__func__
, x
);
5873 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
5876 case EXT_DEV_GAMEPAD_CHG
:
5877 battery
->wire_status
= SEC_BATTERY_CABLE_TA
;
5880 case EXT_DEV_GAMEPAD_OTG
:
5881 battery
->wire_status
= SEC_BATTERY_CABLE_OTG
;
5888 psy_do_property(battery
->pdata
->charger_name
, set
,
5889 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
5892 queue_delayed_work(battery
->monitor_wqueue
,
5893 &battery
->cable_work
, 0);
5897 case BATT_WDT_CONTROL
:
5898 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5899 pr_info("%s: Charger WDT Set : %d\n", __func__
, x
);
5900 battery
->wdt_kick_disable
= x
;
5905 if (sscanf(buf
, "%10d\n", &x
) == 1) {
5907 psy_do_property(battery
->pdata
->charger_name
, set
,
5908 POWER_SUPPLY_EXT_PROP_MULTI_CHARGER_MODE
, value
);
5912 case CHECK_PS_READY
:
5915 case CISD_FULLCAPREP_MAX
:
5917 #if defined(CONFIG_BATTERY_CISD)
5920 struct cisd
*pcisd
= &battery
->cisd
;
5921 int temp_data
[CISD_DATA_MAX_PER_DAY
] = {0,};
5923 sscanf(buf
, "%10d\n", &temp_data
[0]);
5925 if (temp_data
[CISD_DATA_RESET_ALG
] > 0) {
5926 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",
5927 &temp_data
[0], &temp_data
[1], &temp_data
[2],
5928 &temp_data
[3], &temp_data
[4], &temp_data
[5],
5929 &temp_data
[6], &temp_data
[7], &temp_data
[8],
5930 &temp_data
[9], &temp_data
[10], &temp_data
[11],
5931 &temp_data
[12], &temp_data
[13], &temp_data
[14],
5932 &temp_data
[15], &temp_data
[16], &temp_data
[17],
5933 &temp_data
[18], &temp_data
[19], &temp_data
[20],
5934 &temp_data
[21], &temp_data
[22], &temp_data
[23],
5935 &temp_data
[24], &temp_data
[25], &temp_data
[26],
5936 &temp_data
[27], &temp_data
[28], &temp_data
[29],
5937 &temp_data
[30], &temp_data
[31], &temp_data
[32],
5938 &temp_data
[33], &temp_data
[34], &temp_data
[35],
5939 &temp_data
[36], &temp_data
[37], &temp_data
[38],
5940 &temp_data
[39], &temp_data
[40], &temp_data
[41],
5941 &temp_data
[42], &temp_data
[43], &temp_data
[44],
5942 &temp_data
[45], &temp_data
[46], &temp_data
[47],
5943 &temp_data
[48], &temp_data
[49], &temp_data
[50],
5944 &temp_data
[51], &temp_data
[52], &temp_data
[53],
5945 &temp_data
[54], &temp_data
[55], &temp_data
[56],
5946 &temp_data
[57], &temp_data
[58], &temp_data
[59],
5947 &temp_data
[60], &temp_data
[61], &temp_data
[62],
5948 &temp_data
[63], &temp_data
[64], &temp_data
[65],
5949 &temp_data
[66], &temp_data
[67], &temp_data
[68],
5950 &temp_data
[69], &temp_data
[70], &temp_data
[71],
5951 &temp_data
[72], &temp_data
[73], &temp_data
[74],
5952 &temp_data
[75], &temp_data
[76]) <= CISD_DATA_MAX_PER_DAY
) {
5953 for (i
= 0; i
< CISD_DATA_MAX_PER_DAY
; i
++)
5955 pcisd
->data
[CISD_DATA_ALG_INDEX
] = battery
->pdata
->cisd_alg_index
;
5956 pcisd
->data
[CISD_DATA_FULL_COUNT
] = temp_data
[0];
5957 pcisd
->data
[CISD_DATA_CAP_MAX
] = temp_data
[1];
5958 pcisd
->data
[CISD_DATA_CAP_MIN
] = temp_data
[2];
5959 pcisd
->data
[CISD_DATA_VALERT_COUNT
] = temp_data
[16];
5960 pcisd
->data
[CISD_DATA_CYCLE
] = temp_data
[17];
5961 pcisd
->data
[CISD_DATA_WIRE_COUNT
] = temp_data
[18];
5962 pcisd
->data
[CISD_DATA_WIRELESS_COUNT
] = temp_data
[19];
5963 pcisd
->data
[CISD_DATA_HIGH_TEMP_SWELLING
] = temp_data
[20];
5964 pcisd
->data
[CISD_DATA_LOW_TEMP_SWELLING
] = temp_data
[21];
5965 pcisd
->data
[CISD_DATA_SWELLING_CHARGING_COUNT
] = temp_data
[22];
5966 pcisd
->data
[CISD_DATA_AICL_COUNT
] = temp_data
[26];
5967 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX
] = temp_data
[27];
5968 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN
] = temp_data
[28];
5969 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX
] = temp_data
[29];
5970 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN
] = temp_data
[30];
5971 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX
] = temp_data
[31];
5972 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN
] = temp_data
[32];
5973 pcisd
->data
[CISD_DATA_UNSAFETY_VOLTAGE
] = temp_data
[33];
5974 pcisd
->data
[CISD_DATA_UNSAFETY_TEMPERATURE
] = temp_data
[34];
5975 pcisd
->data
[CISD_DATA_SAFETY_TIMER
] = temp_data
[35];
5976 pcisd
->data
[CISD_DATA_VSYS_OVP
] = temp_data
[36];
5977 pcisd
->data
[CISD_DATA_VBAT_OVP
] = temp_data
[37];
5978 pcisd
->data
[CISD_DATA_AFC_FAIL
] = temp_data
[39];
5979 pcisd
->data
[CISD_DATA_WATER_DETECT
] = temp_data
[38];
5982 const char *p
= buf
;
5984 pr_info("%s: %s\n", __func__
, buf
);
5985 for (i
= CISD_DATA_RESET_ALG
; i
< CISD_DATA_MAX_PER_DAY
; i
++) {
5986 if (sscanf(p
, "%10d%n", &pcisd
->data
[i
], &x
) > 0)
5989 pr_info("%s: NO DATA (cisd_data)\n", __func__
);
5990 temp_data
[CISD_DATA_RESET_ALG
] = -1;
5995 pr_info("%s: %s cisd data\n", __func__
,
5996 ((temp_data
[CISD_DATA_RESET_ALG
] < 0 || battery
->fg_reset
) ? "init" : "update"));
5998 if (temp_data
[CISD_DATA_RESET_ALG
] < 0 || battery
->fg_reset
) {
5999 /* initialize data */
6000 for (i
= CISD_DATA_RESET_ALG
; i
< CISD_DATA_MAX_PER_DAY
; i
++)
6003 battery
->fg_reset
= 0;
6005 pcisd
->data
[CISD_DATA_ALG_INDEX
] = battery
->pdata
->cisd_alg_index
;
6007 pcisd
->data
[CISD_DATA_FULL_COUNT
] = 1;
6008 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX
] = -300;
6009 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX
] = -300;
6010 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX
] = -300;
6011 pcisd
->data
[CISD_DATA_USB_TEMP_MAX
] = -300;
6012 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN
] = 1000;
6013 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN
] = 1000;
6014 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN
] = 1000;
6015 pcisd
->data
[CISD_DATA_USB_TEMP_MIN
] = 1000;
6016 pcisd
->data
[CISD_DATA_CAP_MIN
] = 0xFFFF;
6018 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
] = 1;
6019 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX_PER_DAY
] = -300;
6020 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX_PER_DAY
] = -300;
6021 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX_PER_DAY
] = -300;
6022 pcisd
->data
[CISD_DATA_USB_TEMP_MAX_PER_DAY
] = -300;
6023 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN_PER_DAY
] = 1000;
6024 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN_PER_DAY
] = 1000;
6025 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN_PER_DAY
] = 1000;
6026 pcisd
->data
[CISD_DATA_USB_TEMP_MIN_PER_DAY
] = 1000;
6028 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX
] = -300;
6029 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX
] = -300;
6030 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX
] = -300;
6031 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX
] = -300;
6032 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN
] = 1000;
6033 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN
] = 1000;
6034 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN
] = 1000;
6035 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN
] = 1000;
6037 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY
] = -300;
6038 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY
] = -300;
6039 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX_PER_DAY
] = -300;
6040 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY
] = -300;
6041 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY
] = 1000;
6042 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY
] = 1000;
6043 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN_PER_DAY
] = 1000;
6044 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY
] = 1000;
6046 pcisd
->data
[CISD_DATA_CAP_MIN_PER_DAY
] = 0xFFFF;
6049 /* initialize pad data */
6050 init_cisd_pad_data(&battery
->cisd
);
6054 wake_lock(&battery
->monitor_wake_lock
);
6055 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
6058 case CISD_DATA_JSON
:
6061 struct cisd
*pcisd
= &battery
->cisd
;
6063 if (sscanf(buf
, "%1c\n", &tc
) == 1) {
6065 for (i
= 0; i
< CISD_DATA_MAX
; i
++)
6068 pcisd
->data
[CISD_DATA_FULL_COUNT
] = 1;
6069 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX
] = -300;
6070 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX
] = -300;
6071 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX
] = -300;
6072 pcisd
->data
[CISD_DATA_USB_TEMP_MAX
] = -300;
6073 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN
] = 1000;
6074 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN
] = 1000;
6075 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN
] = 1000;
6076 pcisd
->data
[CISD_DATA_USB_TEMP_MIN
] = 1000;
6077 pcisd
->data
[CISD_DATA_CAP_MIN
] = 0xFFFF;
6079 pcisd
->data
[CISD_DATA_FULL_COUNT_PER_DAY
] = 1;
6080 pcisd
->data
[CISD_DATA_BATT_TEMP_MAX_PER_DAY
] = -300;
6081 pcisd
->data
[CISD_DATA_CHG_TEMP_MAX_PER_DAY
] = -300;
6082 pcisd
->data
[CISD_DATA_WPC_TEMP_MAX_PER_DAY
] = -300;
6083 pcisd
->data
[CISD_DATA_USB_TEMP_MAX_PER_DAY
] = -300;
6084 pcisd
->data
[CISD_DATA_BATT_TEMP_MIN_PER_DAY
] = 1000;
6085 pcisd
->data
[CISD_DATA_CHG_TEMP_MIN_PER_DAY
] = 1000;
6086 pcisd
->data
[CISD_DATA_WPC_TEMP_MIN_PER_DAY
] = 1000;
6087 pcisd
->data
[CISD_DATA_USB_TEMP_MIN_PER_DAY
] = 1000;
6089 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX
] = -300;
6090 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX
] = -300;
6091 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX
] = -300;
6092 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX
] = -300;
6093 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN
] = 1000;
6094 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN
] = 1000;
6095 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN
] = 1000;
6096 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN
] = 1000;
6098 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MAX_PER_DAY
] = -300;
6099 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MAX_PER_DAY
] = -300;
6100 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MAX_PER_DAY
] = -300;
6101 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MAX_PER_DAY
] = -300;
6102 pcisd
->data
[CISD_DATA_CHG_BATT_TEMP_MIN_PER_DAY
] = 1000;
6103 pcisd
->data
[CISD_DATA_CHG_CHG_TEMP_MIN_PER_DAY
] = 1000;
6104 pcisd
->data
[CISD_DATA_CHG_WPC_TEMP_MIN_PER_DAY
] = 1000;
6105 pcisd
->data
[CISD_DATA_CHG_USB_TEMP_MIN_PER_DAY
] = 1000;
6107 pcisd
->data
[CISD_DATA_CAP_MIN_PER_DAY
] = 0xFFFF;
6114 case CISD_DATA_D_JSON
:
6116 case CISD_WIRE_COUNT
:
6117 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6118 struct cisd
*pcisd
= &battery
->cisd
;
6119 pr_info("%s: Wire Count : %d\n", __func__
, x
);
6120 pcisd
->data
[CISD_DATA_WIRE_COUNT
] = x
;
6121 pcisd
->data
[CISD_DATA_WIRE_COUNT_PER_DAY
]++;
6126 set_cisd_pad_data(battery
, buf
);
6129 case CISD_WC_DATA_JSON
:
6131 case PREV_BATTERY_DATA
:
6132 if (sscanf(buf
, "%10d, %10d, %10d, %10d\n",
6133 &battery
->prev_volt
, &battery
->prev_temp
,
6134 &battery
->prev_jig_on
, &battery
->prev_chg_on
) >= 4) {
6135 pr_info("%s: prev voltage : %d, prev_temp : %d, prev_jig_on : %d, prev_chg_on : %d\n",
6136 __func__
, battery
->prev_volt
, battery
->prev_temp
,
6137 battery
->prev_jig_on
, battery
->prev_chg_on
);
6139 if (battery
->prev_volt
>= 3700 && battery
->prev_temp
>= 150 &&
6140 !battery
->prev_jig_on
&& battery
->fg_reset
)
6141 pr_info("%s: Battery have been Removed\n", __func__
);
6145 battery
->enable_update_data
= 1;
6147 case PREV_BATTERY_INFO
:
6150 #if defined(CONFIG_BATTERY_SBM_DATA)
6154 case SAFETY_TIMER_SET
:
6155 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6157 battery
->safety_timer_set
= true;
6159 battery
->safety_timer_set
= false;
6164 case BATT_SWELLING_CONTROL
:
6165 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6167 pr_info("%s : 15TEST START!! SWELLING MODE DISABLE\n", __func__
);
6168 battery
->skip_swelling
= true;
6170 pr_info("%s : 15TEST END!! SWELLING MODE END\n", __func__
);
6171 battery
->skip_swelling
= false;
6176 case SAFETY_TIMER_INFO
:
6178 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
6179 case BATT_TEMP_TEST
:
6182 if (sscanf(buf
, "%c %10d\n", &tc
, &x
) == 2) {
6183 pr_info("%s : temperature t: %c, temp: %d\n", __func__
, tc
, x
);
6185 battery
->temperature_test_usb
= x
;
6186 } else if (tc
== 'w') {
6187 battery
->temperature_test_wpc
= x
;
6188 } else if (tc
== 'b') {
6189 battery
->temperature_test_battery
= x
;
6190 } else if (tc
== 'c') {
6191 battery
->temperature_test_chg
= x
;
6198 case BATT_CURRENT_EVENT
:
6203 if (sscanf(buf
, "%10d\n", &x
) == 1) {
6204 dev_info(battery
->dev
,
6205 "%s: ext event 0x%x \n", __func__
, x
);
6206 battery
->ext_event
= x
;
6207 wake_lock(&battery
->ext_event_wake_lock
);
6208 queue_delayed_work(battery
->monitor_wqueue
, &battery
->ext_event_work
, 0);
6220 static int sec_bat_create_attrs(struct device
*dev
)
6222 unsigned long i
= 0;
6225 for (i
= 0; i
< ARRAY_SIZE(sec_battery_attrs
); i
++) {
6226 rc
= device_create_file(dev
, &sec_battery_attrs
[i
]);
6228 goto create_attrs_failed
;
6230 goto create_attrs_succeed
;
6232 create_attrs_failed
:
6234 device_remove_file(dev
, &sec_battery_attrs
[i
]);
6235 create_attrs_succeed
:
6239 static int sec_bat_set_property(struct power_supply
*psy
,
6240 enum power_supply_property psp
,
6241 const union power_supply_propval
*val
)
6243 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6244 int current_cable_type
= SEC_BATTERY_CABLE_NONE
;
6245 int full_check_type
= SEC_BATTERY_FULLCHARGED_NONE
;
6246 union power_supply_propval value
= {0, };
6247 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6249 dev_dbg(battery
->dev
,
6250 "%s: (%d,%d)\n", __func__
, psp
, val
->intval
);
6253 case POWER_SUPPLY_PROP_STATUS
:
6254 if (battery
->charging_mode
== SEC_BATTERY_CHARGING_1ST
)
6255 full_check_type
= battery
->pdata
->full_check_type
;
6257 full_check_type
= battery
->pdata
->full_check_type_2nd
;
6258 if ((full_check_type
== SEC_BATTERY_FULLCHARGED_CHGINT
) &&
6259 (val
->intval
== POWER_SUPPLY_STATUS_FULL
))
6260 sec_bat_do_fullcharged(battery
);
6261 sec_bat_set_charging_status(battery
, val
->intval
);
6263 case POWER_SUPPLY_PROP_HEALTH
:
6264 sec_bat_ovp_uvlo_result(battery
, val
->intval
);
6266 case POWER_SUPPLY_PROP_ONLINE
:
6267 current_cable_type
= val
->intval
;
6268 #if !defined(CONFIG_CCIC_NOTIFIER)
6269 if ((battery
->muic_cable_type
!= ATTACHED_DEV_SMARTDOCK_TA_MUIC
)
6270 && ((current_cable_type
== SEC_BATTERY_CABLE_SMART_OTG
) ||
6271 (current_cable_type
== SEC_BATTERY_CABLE_SMART_NOTG
)))
6275 if (current_cable_type
< 0) {
6276 dev_info(battery
->dev
,
6277 "%s: ignore event(%d)\n",
6278 __func__
, current_cable_type
);
6279 } else if (current_cable_type
== SEC_BATTERY_CABLE_OTG
) {
6280 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
6281 battery
->is_recharging
= false;
6282 sec_bat_set_charging_status(battery
,
6283 POWER_SUPPLY_STATUS_DISCHARGING
);
6284 battery
->cable_type
= current_cable_type
;
6285 wake_lock(&battery
->monitor_wake_lock
);
6286 queue_delayed_work(battery
->monitor_wqueue
,
6287 &battery
->monitor_work
, 0);
6290 battery
->wire_status
= current_cable_type
;
6291 if ((battery
->wire_status
== SEC_BATTERY_CABLE_NONE
) &&
6292 (battery
->wc_status
!= SEC_WIRELESS_PAD_NONE
) )
6293 current_cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
6295 dev_info(battery
->dev
,
6296 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
6297 __func__
, current_cable_type
, battery
->wc_status
,
6298 battery
->wire_status
);
6300 /* cable is attached or detached
6301 * if current_cable_type is minus value,
6302 * check cable by sec_bat_get_cable_type()
6303 * although SEC_BATTERY_CABLE_SOURCE_EXTERNAL is set
6304 * (0 is SEC_BATTERY_CABLE_UNKNOWN)
6306 if ((current_cable_type
>= 0) &&
6307 (current_cable_type
< SEC_BATTERY_CABLE_MAX
) &&
6308 (battery
->pdata
->cable_source_type
&
6309 SEC_BATTERY_CABLE_SOURCE_EXTERNAL
)) {
6311 wake_lock(&battery
->cable_wake_lock
);
6312 queue_delayed_work(battery
->monitor_wqueue
,
6313 &battery
->cable_work
,0);
6315 if (sec_bat_get_cable_type(battery
,
6316 battery
->pdata
->cable_source_type
)) {
6317 wake_lock(&battery
->cable_wake_lock
);
6318 queue_delayed_work(battery
->monitor_wqueue
,
6319 &battery
->cable_work
,0);
6323 case POWER_SUPPLY_PROP_CAPACITY
:
6324 battery
->capacity
= val
->intval
;
6325 power_supply_changed(battery
->psy_bat
);
6327 case POWER_SUPPLY_PROP_VOLTAGE_NOW
:
6328 /* If JIG is attached, the voltage is set as 1079 */
6329 pr_info("%s : set to the battery history : (%d)\n",__func__
, val
->intval
);
6330 if(val
->intval
== 1079) {
6331 battery
->voltage_now
= 1079;
6332 battery
->voltage_avg
= 1079;
6333 power_supply_changed(battery
->psy_bat
);
6336 case POWER_SUPPLY_PROP_CHARGE_TYPE
:
6337 wake_lock(&battery
->monitor_wake_lock
);
6338 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
6340 case POWER_SUPPLY_PROP_PRESENT
:
6341 battery
->present
= val
->intval
;
6343 wake_lock(&battery
->monitor_wake_lock
);
6344 queue_delayed_work(battery
->monitor_wqueue
,
6345 &battery
->monitor_work
, 0);
6347 #if defined(CONFIG_BATTERY_SWELLING)
6348 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT
:
6351 case POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
:
6352 case POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW
:
6354 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
6355 value
.intval
= val
->intval
;
6356 pr_info("%s: CHGIN-OTG %s\n", __func__
, value
.intval
> 0 ? "on" : "off");
6357 psy_do_property(battery
->pdata
->charger_name
, set
,
6358 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6360 case POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
:
6361 value
.intval
= val
->intval
;
6362 pr_info("%s: WCIN-UNO %s\n", __func__
, value
.intval
> 0 ? "on" : "off");
6363 psy_do_property(battery
->pdata
->charger_name
, set
,
6364 POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
, value
);
6366 #if defined(CONFIG_UPDATE_BATTERY_DATA)
6367 case POWER_SUPPLY_PROP_POWER_DESIGN
:
6368 sec_bat_parse_dt(battery
->dev
, battery
);
6371 #if defined(CONFIG_BATTERY_CISD)
6372 case POWER_SUPPLY_PROP_VOLTAGE_MIN
:
6373 pr_info("%s: Valert was occured! run monitor work for updating cisd data!\n", __func__
);
6374 battery
->cisd
.data
[CISD_DATA_VALERT_COUNT
]++;
6375 battery
->cisd
.data
[CISD_DATA_VALERT_COUNT_PER_DAY
]++;
6376 wake_lock(&battery
->monitor_wake_lock
);
6377 queue_delayed_work_on(0, battery
->monitor_wqueue
,
6378 &battery
->monitor_work
, 0);
6381 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6383 case POWER_SUPPLY_EXT_PROP_AICL_CURRENT
:
6384 battery
->aicl_current
= val
->intval
;
6385 battery
->max_charge_power
= battery
->charge_power
= battery
->input_voltage
* val
->intval
;
6386 pr_info("%s: aicl : %dmA, %dmW)\n", __func__
,
6387 battery
->aicl_current
, battery
->charge_power
);
6389 if (is_wired_type(battery
->cable_type
))
6390 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_AICL
,
6391 SEC_BAT_CURRENT_EVENT_AICL
);
6393 #if defined(CONFIG_BATTERY_CISD)
6394 battery
->cisd
.data
[CISD_DATA_AICL_COUNT
]++;
6395 battery
->cisd
.data
[CISD_DATA_AICL_COUNT_PER_DAY
]++;
6398 case POWER_SUPPLY_EXT_PROP_SYSOVLO
:
6399 if (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
) {
6400 pr_info("%s: Vsys is ovlo !!\n", __func__
);
6401 battery
->is_sysovlo
= true;
6402 battery
->is_recharging
= false;
6403 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
6404 battery
->health
= POWER_SUPPLY_HEALTH_VSYS_OVP
;
6405 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_VSYS_OVP
, SEC_BAT_CURRENT_EVENT_VSYS_OVP
);
6406 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
6407 #if defined(CONFIG_BATTERY_CISD)
6408 battery
->cisd
.data
[CISD_DATA_VSYS_OVP
]++;
6409 battery
->cisd
.data
[CISD_DATA_VSYS_OVP_PER_DAY
]++;
6411 #if defined(CONFIG_SEC_ABC)
6412 sec_abc_send_event("MODULE=battery@ERROR=vsys_ovp");
6414 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
6415 wake_lock(&battery
->monitor_wake_lock
);
6416 queue_delayed_work(battery
->monitor_wqueue
,
6417 &battery
->monitor_work
, 0);
6420 case POWER_SUPPLY_EXT_PROP_VBAT_OVP
:
6421 if (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
) {
6422 pr_info("%s: Vbat is ovlo !!\n", __func__
);
6423 battery
->is_vbatovlo
= true;
6424 battery
->is_recharging
= false;
6425 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
6426 battery
->health
= POWER_SUPPLY_HEALTH_VBAT_OVP
;
6427 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_VBAT_OVP
, SEC_BAT_CURRENT_EVENT_VBAT_OVP
);
6428 sec_bat_set_charging_status(battery
, POWER_SUPPLY_STATUS_NOT_CHARGING
);
6430 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
6431 wake_lock(&battery
->monitor_wake_lock
);
6432 queue_delayed_work(battery
->monitor_wqueue
,
6433 &battery
->monitor_work
, 0);
6436 case POWER_SUPPLY_EXT_PROP_USB_CONFIGURE
:
6437 if (battery
->pdic_info
.sink_status
.rp_currentlvl
> RP_CURRENT_LEVEL_DEFAULT
)
6439 pr_info("%s: usb configured %d\n", __func__
, val
->intval
);
6440 if (val
->intval
== USB_CURRENT_UNCONFIGURED
) {
6441 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_100MA
,
6442 (SEC_BAT_CURRENT_EVENT_USB_100MA
| SEC_BAT_CURRENT_EVENT_USB_SUPER
));
6443 } else if (val
->intval
== USB_CURRENT_HIGH_SPEED
) {
6444 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
, 1);
6445 sec_bat_set_current_event(battery
, 0,
6446 (SEC_BAT_CURRENT_EVENT_USB_100MA
| SEC_BAT_CURRENT_EVENT_USB_SUPER
));
6447 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
6448 USB_CURRENT_HIGH_SPEED
, USB_CURRENT_HIGH_SPEED
);
6449 } else if (val
->intval
== USB_CURRENT_SUPER_SPEED
) {
6450 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
, 1);
6451 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_SUPER
,
6452 (SEC_BAT_CURRENT_EVENT_USB_100MA
| SEC_BAT_CURRENT_EVENT_USB_SUPER
));
6453 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
6454 USB_CURRENT_SUPER_SPEED
, USB_CURRENT_SUPER_SPEED
);
6456 sec_bat_set_charging_current(battery
);
6458 case POWER_SUPPLY_EXT_PROP_HV_DISABLE
:
6459 pr_info("HV wired charging mode is %s\n", (val
->intval
== CH_MODE_AFC_DISABLE_VAL
? "Disabled" : "Enabled"));
6460 sec_bat_set_current_event(battery
, (val
->intval
== CH_MODE_AFC_DISABLE_VAL
?
6461 SEC_BAT_CURRENT_EVENT_HV_DISABLE
: 0), SEC_BAT_CURRENT_EVENT_HV_DISABLE
);
6463 case POWER_SUPPLY_EXT_PROP_WC_CONTROL
:
6464 pr_info("%s: Recover MFC IC (wc_enable: %d)\n",
6465 __func__
, battery
->wc_enable
);
6467 if (battery
->pdata
->wpc_en
) {
6468 mutex_lock(&battery
->wclock
);
6469 if (battery
->wc_enable
) {
6470 gpio_direction_output(battery
->pdata
->wpc_en
, 1);
6472 gpio_direction_output(battery
->pdata
->wpc_en
, 0);
6474 mutex_unlock(&battery
->wclock
);
6476 #if defined(CONFIG_BATTERY_CISD)
6477 increase_cisd_count(CISD_DATA_DROP_VALUE
);
6491 static int sec_bat_get_property(struct power_supply
*psy
,
6492 enum power_supply_property psp
,
6493 union power_supply_propval
*val
)
6495 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6496 union power_supply_propval value
= {0, };
6497 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6500 case POWER_SUPPLY_PROP_STATUS
:
6501 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
) ||
6502 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) {
6503 val
->intval
= POWER_SUPPLY_STATUS_DISCHARGING
;
6505 if ((battery
->pdata
->cable_check_type
&
6506 SEC_BATTERY_CABLE_CHECK_NOUSBCHARGE
) &&
6508 switch (battery
->cable_type
) {
6509 case SEC_BATTERY_CABLE_USB
:
6510 case SEC_BATTERY_CABLE_USB_CDP
:
6512 POWER_SUPPLY_STATUS_DISCHARGING
;
6516 #if defined(CONFIG_STORE_MODE)
6517 if (battery
->store_mode
&& !lpcharge
&&
6518 battery
->cable_type
!= SEC_BATTERY_CABLE_NONE
&&
6519 battery
->cable_type
!= SEC_BATTERY_CABLE_OTG
&&
6520 battery
->status
== POWER_SUPPLY_STATUS_DISCHARGING
) {
6521 val
->intval
= POWER_SUPPLY_STATUS_CHARGING
;
6524 val
->intval
= battery
->status
;
6527 case POWER_SUPPLY_PROP_CHARGE_TYPE
:
6528 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) {
6529 val
->intval
= POWER_SUPPLY_CHARGE_TYPE_NONE
;
6531 psy_do_property(battery
->pdata
->charger_name
, get
,
6532 POWER_SUPPLY_PROP_CHARGE_TYPE
, value
);
6533 if (value
.intval
== SEC_BATTERY_CABLE_UNKNOWN
)
6534 /* if error in CHARGE_TYPE of charger
6535 * set CHARGE_TYPE as NONE
6537 val
->intval
= POWER_SUPPLY_CHARGE_TYPE_NONE
;
6539 val
->intval
= value
.intval
;
6542 case POWER_SUPPLY_PROP_HEALTH
:
6543 if (battery
->health
>= POWER_SUPPLY_HEALTH_MAX
)
6544 val
->intval
= POWER_SUPPLY_HEALTH_UNKNOWN
;
6546 val
->intval
= battery
->health
;
6548 case POWER_SUPPLY_PROP_PRESENT
:
6549 val
->intval
= battery
->present
;
6551 case POWER_SUPPLY_PROP_ONLINE
:
6552 if (is_hv_wireless_type(battery
->cable_type
) ||
6553 (battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_WIRELESS_HV
)) {
6554 if (sec_bat_hv_wc_normal_mode_check(battery
))
6555 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6557 val
->intval
= SEC_BATTERY_CABLE_HV_WIRELESS_ETX
;
6559 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
)
6560 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6561 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
)
6562 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6563 else if(battery
->cable_type
== SEC_BATTERY_CABLE_PMA_WIRELESS
)
6564 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6565 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_VEHICLE
)
6566 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6567 else if(battery
->cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
)
6568 val
->intval
= SEC_BATTERY_CABLE_WIRELESS
;
6570 val
->intval
= battery
->cable_type
;
6571 pr_info("%s cable type = %d sleep_mode = %d\n", __func__
, val
->intval
, sleep_mode
);
6573 case POWER_SUPPLY_PROP_TECHNOLOGY
:
6574 val
->intval
= battery
->pdata
->technology
;
6576 case POWER_SUPPLY_PROP_VOLTAGE_NOW
:
6577 #ifdef CONFIG_SEC_FACTORY
6578 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
6579 POWER_SUPPLY_PROP_VOLTAGE_NOW
, value
);
6580 battery
->voltage_now
= value
.intval
;
6581 dev_err(battery
->dev
,
6582 "%s: voltage now(%d)\n", __func__
, battery
->voltage_now
);
6584 /* voltage value should be in uV */
6585 val
->intval
= battery
->voltage_now
* 1000;
6587 case POWER_SUPPLY_PROP_VOLTAGE_AVG
:
6588 #ifdef CONFIG_SEC_FACTORY
6589 value
.intval
= SEC_BATTERY_VOLTAGE_AVERAGE
;
6590 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
6591 POWER_SUPPLY_PROP_VOLTAGE_AVG
, value
);
6592 battery
->voltage_avg
= value
.intval
;
6593 dev_err(battery
->dev
,
6594 "%s: voltage avg(%d)\n", __func__
, battery
->voltage_avg
);
6596 /* voltage value should be in uV */
6597 val
->intval
= battery
->voltage_avg
* 1000;
6599 case POWER_SUPPLY_PROP_CURRENT_NOW
:
6600 val
->intval
= battery
->current_now
;
6602 case POWER_SUPPLY_PROP_CURRENT_AVG
:
6603 val
->intval
= battery
->current_avg
;
6605 case POWER_SUPPLY_PROP_CHARGE_FULL
:
6606 #if defined(CONFIG_BATTERY_CISD)
6607 val
->intval
= battery
->pdata
->battery_full_capacity
* 1000;
6612 /* charging mode (differ from power supply) */
6613 case POWER_SUPPLY_PROP_CHARGE_NOW
:
6614 val
->intval
= battery
->charging_mode
;
6616 case POWER_SUPPLY_PROP_CAPACITY
:
6617 if (battery
->pdata
->fake_capacity
) {
6619 pr_info("%s : capacity(%d)\n", __func__
, val
->intval
);
6621 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
6622 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
) {
6623 if(battery
->eng_not_full_status
)
6624 val
->intval
= battery
->capacity
;
6628 val
->intval
= battery
->capacity
;
6631 if (battery
->status
== POWER_SUPPLY_STATUS_FULL
)
6634 val
->intval
= battery
->capacity
;
6638 case POWER_SUPPLY_PROP_TEMP
:
6639 val
->intval
= battery
->temperature
;
6641 case POWER_SUPPLY_PROP_TEMP_AMBIENT
:
6642 val
->intval
= battery
->temper_amb
;
6644 #if defined(CONFIG_CALC_TIME_TO_FULL)
6645 case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW
:
6646 if (battery
->capacity
== 100) {
6651 if (((battery
->status
== POWER_SUPPLY_STATUS_CHARGING
) ||
6652 (battery
->status
== POWER_SUPPLY_STATUS_FULL
&& battery
->capacity
!= 100)) &&
6653 !battery
->swelling_mode
)
6654 val
->intval
= battery
->timetofull
;
6659 #if defined(CONFIG_BATTERY_SWELLING)
6660 case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT
:
6661 if (battery
->swelling_mode
)
6667 case POWER_SUPPLY_PROP_CHARGE_COUNTER_SHADOW
:
6668 val
->intval
= battery
->wire_status
;
6670 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
6671 case POWER_SUPPLY_PROP_CHARGE_UNO_CONTROL
:
6673 case POWER_SUPPLY_PROP_POWER_NOW
:
6674 val
->intval
= battery
->charge_power
;
6676 case POWER_SUPPLY_PROP_CHARGE_COUNTER
:
6677 val
->intval
= battery
->charge_counter
;
6679 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6681 case POWER_SUPPLY_EXT_PROP_SUB_PBA_TEMP_REC
:
6682 val
->intval
= !battery
->vbus_limit
;
6694 static int sec_usb_get_property(struct power_supply
*psy
,
6695 enum power_supply_property psp
,
6696 union power_supply_propval
*val
)
6698 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6701 case POWER_SUPPLY_PROP_ONLINE
:
6703 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
6705 val
->intval
= battery
->input_voltage
* 1000000;
6707 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6709 val
->intval
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
* 1000;
6715 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
) ||
6716 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) {
6720 /* Set enable=1 only if the USB charger is connected */
6721 switch (battery
->wire_status
) {
6722 case SEC_BATTERY_CABLE_USB
:
6723 case SEC_BATTERY_CABLE_USB_CDP
:
6726 case SEC_BATTERY_CABLE_PDIC
:
6727 val
->intval
= (battery
->pd_usb_attached
) ? 1:0;
6734 if (battery
->slate_mode
)
6739 static int sec_ac_get_property(struct power_supply
*psy
,
6740 enum power_supply_property psp
,
6741 union power_supply_propval
*val
)
6743 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6744 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6747 case POWER_SUPPLY_PROP_ONLINE
:
6748 if ((battery
->health
== POWER_SUPPLY_HEALTH_OVERVOLTAGE
) ||
6749 (battery
->health
== POWER_SUPPLY_HEALTH_UNDERVOLTAGE
)) {
6754 /* Set enable=1 only if the AC charger is connected */
6755 switch (battery
->cable_type
) {
6756 case SEC_BATTERY_CABLE_TA
:
6757 case SEC_BATTERY_CABLE_UARTOFF
:
6758 case SEC_BATTERY_CABLE_LAN_HUB
:
6759 case SEC_BATTERY_CABLE_UNKNOWN
:
6760 case SEC_BATTERY_CABLE_PREPARE_TA
:
6761 case SEC_BATTERY_CABLE_9V_ERR
:
6762 case SEC_BATTERY_CABLE_9V_UNKNOWN
:
6763 case SEC_BATTERY_CABLE_9V_TA
:
6764 case SEC_BATTERY_CABLE_12V_TA
:
6765 case SEC_BATTERY_CABLE_HMT_CONNECTED
:
6766 case SEC_BATTERY_CABLE_HMT_CHARGE
:
6767 case SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT
:
6768 case SEC_BATTERY_CABLE_QC20
:
6769 case SEC_BATTERY_CABLE_QC30
:
6770 case SEC_BATTERY_CABLE_TIMEOUT
:
6771 case SEC_BATTERY_CABLE_SMART_OTG
:
6772 case SEC_BATTERY_CABLE_SMART_NOTG
:
6775 case SEC_BATTERY_CABLE_PDIC
:
6776 val
->intval
= (battery
->pd_usb_attached
) ? 0:1;
6783 case POWER_SUPPLY_PROP_TEMP
:
6784 val
->intval
= battery
->chg_temp
;
6786 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
6788 val
->intval
= battery
->input_voltage
* 1000000;
6790 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6792 val
->intval
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
* 1000;
6794 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6796 case POWER_SUPPLY_EXT_PROP_WATER_DETECT
:
6797 if (battery
->misc_event
& (BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
|
6798 BATT_MISC_EVENT_HICCUP_TYPE
)) {
6800 pr_info("%s: Water Detect\n", __func__
);
6813 if (lpcharge
&& (battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
)) {
6820 static int sec_wireless_get_property(struct power_supply
*psy
,
6821 enum power_supply_property psp
,
6822 union power_supply_propval
*val
)
6824 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6827 case POWER_SUPPLY_PROP_ONLINE
:
6828 val
->intval
= is_wireless_type(battery
->cable_type
) ?
6831 case POWER_SUPPLY_PROP_PRESENT
:
6832 val
->intval
= (battery
->pdata
->wireless_charger_name
) ?
6835 case POWER_SUPPLY_PROP_VOLTAGE_MAX
:
6837 val
->intval
= battery
->input_voltage
* 1000000;
6839 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6841 val
->intval
= battery
->pdata
->charging_current
[battery
->cable_type
].input_current_limit
* 1000;
6850 static int sec_wireless_set_property(struct power_supply
*psy
,
6851 enum power_supply_property psp
,
6852 const union power_supply_propval
*val
)
6854 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6855 enum power_supply_ext_property ext_psp
= (enum power_supply_ext_property
) psp
;
6858 case POWER_SUPPLY_PROP_ONLINE
:
6859 #if defined(CONFIG_BATTERY_CISD)
6860 if (val
->intval
!= SEC_WIRELESS_PAD_NONE
&& battery
->wc_status
== SEC_WIRELESS_PAD_NONE
) {
6861 battery
->cisd
.data
[CISD_DATA_WIRELESS_COUNT
]++;
6862 battery
->cisd
.data
[CISD_DATA_WIRELESS_COUNT_PER_DAY
]++;
6865 /* Clear the FOD State */
6866 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_WIRELESS_FOD
, 1);
6868 if (val
->intval
== SEC_WIRELESS_PAD_A4WP
)
6869 battery
->wc_status
= SEC_WIRELESS_PAD_WPC
;
6871 battery
->wc_status
= val
->intval
;
6873 if ((battery
->ext_event
& BATT_EXT_EVENT_CALL
) &&
6874 (battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK
||
6875 battery
->wc_status
== SEC_WIRELESS_PAD_WPC_PACK_HV
||
6876 battery
->wc_status
== SEC_WIRELESS_PAD_TX
)) {
6877 battery
->wc_rx_phm_mode
= true;
6880 wake_lock(&battery
->cable_wake_lock
);
6881 queue_delayed_work(battery
->monitor_wqueue
,
6882 &battery
->cable_work
, 0);
6884 case POWER_SUPPLY_PROP_AUTHENTIC
:
6885 #if defined(CONFIG_BATTERY_CISD)
6886 pr_info("%s : tx_type(0x%x)\n", __func__
, val
->intval
);
6887 count_cisd_pad_data(&battery
->cisd
, val
->intval
);
6890 case POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
:
6892 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
,
6893 SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
);
6895 sec_bat_set_current_event(battery
, 0,
6896 SEC_BAT_CURRENT_EVENT_WPC_VOUT_LOCK
);
6899 if (is_hv_wireless_type(battery
->cable_type
)) {
6900 union power_supply_propval value
= {0, };
6903 mutex_lock(&battery
->iolock
);
6904 value
.intval
= (val
->intval
) ? WIRELESS_VOUT_5V
:
6905 battery
->wpc_vout_level
;
6906 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
6907 POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION
, value
);
6908 battery
->aicl_current
= 0; /* reset aicl current */
6909 mutex_unlock(&battery
->iolock
);
6911 for (cnt
= 0; cnt
< 5; cnt
++) {
6913 psy_do_property(battery
->pdata
->wireless_charger_name
, get
,
6914 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
6915 if (value
.intval
<= 6000) {
6916 pr_info("%s: wireless vout goes to 5V Vout(%d).\n",
6917 __func__
, value
.intval
);
6923 case POWER_SUPPLY_PROP_CURRENT_MAX
:
6924 battery
->aicl_current
= 0; /* reset aicl current */
6925 pr_info("%s: reset aicl\n", __func__
);
6927 case POWER_SUPPLY_PROP_MAX
... POWER_SUPPLY_EXT_PROP_MAX
:
6929 case POWER_SUPPLY_EXT_PROP_WIRELESS_TX_CHG_ERR
:
6930 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_WIRELESS_FOD
, !val
->intval
);
6932 case POWER_SUPPLY_EXT_PROP_CALL_EVENT
:
6933 if(val
->intval
== 1) {
6934 pr_info("%s : PHM enabled\n",__func__
);
6935 battery
->wc_rx_phm_mode
= true;
6949 static int sec_ps_set_property(struct power_supply
*psy
,
6950 enum power_supply_property psp
,
6951 const union power_supply_propval
*val
)
6953 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
6954 union power_supply_propval value
;
6957 case POWER_SUPPLY_PROP_STATUS
:
6958 if (val
->intval
== 0 && battery
->ps_enable
== true) {
6959 battery
->ps_enable
= false;
6960 value
.intval
= val
->intval
;
6961 psy_do_property(battery
->pdata
->charger_name
, set
,
6962 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6963 } else if ((val
->intval
== 1) && (battery
->ps_enable
== false) &&
6964 (battery
->ps_status
== true)) {
6965 battery
->ps_enable
= true;
6966 value
.intval
= val
->intval
;
6967 psy_do_property(battery
->pdata
->charger_name
, set
,
6968 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6970 dev_err(battery
->dev
,
6971 "%s: invalid setting (%d)\n", __func__
, val
->intval
);
6974 case POWER_SUPPLY_PROP_ONLINE
:
6975 if (val
->intval
== SEC_BATTERY_CABLE_POWER_SHARING
) {
6976 battery
->ps_status
= true;
6977 battery
->ps_enable
= true;
6978 value
.intval
= battery
->ps_enable
;
6979 psy_do_property(battery
->pdata
->charger_name
, set
,
6980 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6982 battery
->ps_status
= false;
6983 battery
->ps_enable
= false;
6984 value
.intval
= battery
->ps_enable
;
6985 psy_do_property(battery
->pdata
->charger_name
, set
,
6986 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
6996 static int sec_ps_get_property(struct power_supply
*psy
,
6997 enum power_supply_property psp
,
6998 union power_supply_propval
*val
)
7000 struct sec_battery_info
*battery
= power_supply_get_drvdata(psy
);
7003 case POWER_SUPPLY_PROP_STATUS
:
7004 val
->intval
= (battery
->ps_enable
) ? 1 : 0;
7006 case POWER_SUPPLY_PROP_ONLINE
:
7007 val
->intval
= (battery
->ps_status
) ? 1 : 0;
7016 #if defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER) || defined(CONFIG_MUIC_NOTIFIER)
7017 static int sec_bat_cable_check(struct sec_battery_info
*battery
,
7018 muic_attached_dev_t attached_dev
)
7020 int current_cable_type
= -1;
7021 union power_supply_propval val
= {0, };
7023 pr_info("[%s]ATTACHED(%d)\n", __func__
, attached_dev
);
7025 switch (attached_dev
)
7027 case ATTACHED_DEV_JIG_UART_OFF_MUIC
:
7028 case ATTACHED_DEV_JIG_UART_ON_MUIC
:
7029 battery
->is_jig_on
= true;
7030 #if defined(CONFIG_BATTERY_CISD)
7031 battery
->skip_cisd
= true;
7033 case ATTACHED_DEV_SMARTDOCK_MUIC
:
7034 case ATTACHED_DEV_DESKDOCK_MUIC
:
7035 case ATTACHED_DEV_JIG_USB_ON_MUIC
:
7036 current_cable_type
= SEC_BATTERY_CABLE_NONE
;
7038 case ATTACHED_DEV_UNDEFINED_CHARGING_MUIC
:
7039 case ATTACHED_DEV_UNDEFINED_RANGE_MUIC
:
7040 current_cable_type
= SEC_BATTERY_CABLE_NONE
;
7041 #if defined(CONFIG_BATTERY_CISD)
7042 battery
->cisd
.data
[CISD_DATA_WATER_DETECT
]++;
7043 battery
->cisd
.data
[CISD_DATA_WATER_DETECT_PER_DAY
]++;
7045 #if defined(CONFIG_SEC_ABC)
7046 sec_abc_send_event("MODULE=battery@ERROR=water_detect");
7049 case ATTACHED_DEV_OTG_MUIC
:
7050 case ATTACHED_DEV_JIG_UART_OFF_VB_OTG_MUIC
:
7051 case ATTACHED_DEV_HMT_MUIC
:
7052 current_cable_type
= SEC_BATTERY_CABLE_OTG
;
7054 case ATTACHED_DEV_TIMEOUT_OPEN_MUIC
:
7055 current_cable_type
= SEC_BATTERY_CABLE_TIMEOUT
;
7057 case ATTACHED_DEV_USB_MUIC
:
7058 case ATTACHED_DEV_JIG_USB_OFF_MUIC
:
7059 case ATTACHED_DEV_SMARTDOCK_USB_MUIC
:
7060 case ATTACHED_DEV_UNOFFICIAL_ID_USB_MUIC
:
7061 current_cable_type
= SEC_BATTERY_CABLE_USB
;
7063 case ATTACHED_DEV_JIG_UART_ON_VB_MUIC
:
7064 case ATTACHED_DEV_JIG_UART_OFF_VB_MUIC
:
7065 case ATTACHED_DEV_JIG_UART_OFF_VB_FG_MUIC
:
7066 current_cable_type
= SEC_BATTERY_CABLE_UARTOFF
;
7068 case ATTACHED_DEV_RDU_TA_MUIC
:
7069 battery
->store_mode
= true;
7070 wake_lock(&battery
->parse_mode_dt_wake_lock
);
7071 queue_delayed_work(battery
->monitor_wqueue
, &battery
->parse_mode_dt_work
, 0);
7072 case ATTACHED_DEV_TA_MUIC
:
7073 case ATTACHED_DEV_CARDOCK_MUIC
:
7074 case ATTACHED_DEV_DESKDOCK_VB_MUIC
:
7075 case ATTACHED_DEV_SMARTDOCK_TA_MUIC
:
7076 case ATTACHED_DEV_UNOFFICIAL_TA_MUIC
:
7077 case ATTACHED_DEV_UNOFFICIAL_ID_TA_MUIC
:
7078 case ATTACHED_DEV_UNOFFICIAL_ID_ANY_MUIC
:
7079 case ATTACHED_DEV_UNSUPPORTED_ID_VB_MUIC
:
7080 current_cable_type
= SEC_BATTERY_CABLE_TA
;
7082 case ATTACHED_DEV_AFC_CHARGER_5V_MUIC
:
7083 case ATTACHED_DEV_QC_CHARGER_5V_MUIC
:
7084 case ATTACHED_DEV_AFC_CHARGER_5V_DUPLI_MUIC
:
7085 if (is_hv_wire_type(battery
->cable_type
) &&
7086 (battery
->chg_limit
|| battery
->vbus_chg_by_siop
)) {
7087 current_cable_type
= SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT
;
7088 } else if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_AFC
&&
7089 battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL_DEFAULT
) {
7090 current_cable_type
= SEC_BATTERY_CABLE_PREPARE_TA
;
7092 current_cable_type
= SEC_BATTERY_CABLE_TA
;
7095 case ATTACHED_DEV_CDP_MUIC
:
7096 case ATTACHED_DEV_UNOFFICIAL_ID_CDP_MUIC
:
7097 current_cable_type
= SEC_BATTERY_CABLE_USB_CDP
;
7099 case ATTACHED_DEV_USB_LANHUB_MUIC
:
7100 current_cable_type
= SEC_BATTERY_CABLE_LAN_HUB
;
7102 case ATTACHED_DEV_CHARGING_CABLE_MUIC
:
7103 current_cable_type
= SEC_BATTERY_CABLE_POWER_SHARING
;
7105 case ATTACHED_DEV_AFC_CHARGER_PREPARE_MUIC
:
7106 case ATTACHED_DEV_QC_CHARGER_PREPARE_MUIC
:
7107 current_cable_type
= SEC_BATTERY_CABLE_PREPARE_TA
;
7109 case ATTACHED_DEV_AFC_CHARGER_9V_MUIC
:
7110 case ATTACHED_DEV_QC_CHARGER_9V_MUIC
:
7111 case ATTACHED_DEV_AFC_CHARGER_9V_DUPLI_MUIC
:
7112 current_cable_type
= SEC_BATTERY_CABLE_9V_TA
;
7114 #if defined(CONFIG_MUIC_HV_12V)
7115 case ATTACHED_DEV_AFC_CHARGER_12V_MUIC
:
7116 case ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC
:
7117 current_cable_type
= SEC_BATTERY_CABLE_12V_TA
;
7120 case ATTACHED_DEV_AFC_CHARGER_ERR_V_MUIC
:
7121 case ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC
:
7122 case ATTACHED_DEV_QC_CHARGER_ERR_V_MUIC
:
7123 current_cable_type
= SEC_BATTERY_CABLE_9V_ERR
;
7124 #if defined(CONFIG_BATTERY_CISD)
7125 battery
->cisd
.data
[CISD_DATA_AFC_FAIL
]++;
7126 battery
->cisd
.data
[CISD_DATA_AFC_FAIL_PER_DAY
]++;
7128 #if defined(CONFIG_SEC_ABC)
7129 sec_abc_send_event("MODULE=battery@ERROR=afc_fail");
7132 case ATTACHED_DEV_HV_ID_ERR_UNDEFINED_MUIC
:
7133 case ATTACHED_DEV_HV_ID_ERR_UNSUPPORTED_MUIC
:
7134 case ATTACHED_DEV_HV_ID_ERR_SUPPORTED_MUIC
:
7135 current_cable_type
= SEC_BATTERY_CABLE_9V_UNKNOWN
;
7136 #if defined(CONFIG_BATTERY_CISD)
7137 battery
->cisd
.data
[CISD_DATA_AFC_FAIL
]++;
7138 battery
->cisd
.data
[CISD_DATA_AFC_FAIL_PER_DAY
]++;
7140 #if defined(CONFIG_SEC_ABC)
7141 sec_abc_send_event("MODULE=battery@ERROR=afc_fail");
7144 case ATTACHED_DEV_VZW_INCOMPATIBLE_MUIC
:
7145 current_cable_type
= SEC_BATTERY_CABLE_UNKNOWN
;
7148 pr_err("%s: invalid type for charger:%d\n",
7149 __func__
, attached_dev
);
7153 if (battery
->is_jig_on
&& !battery
->pdata
->support_fgsrc_change
)
7154 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
7155 POWER_SUPPLY_PROP_ENERGY_NOW
, val
);
7157 return current_cable_type
;
7161 #if defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
7162 #if defined(CONFIG_CCIC_NOTIFIER)
7163 static int sec_bat_get_pd_list_index(PDIC_SINK_STATUS
*sink_status
, struct sec_bat_pdic_list
*pd_list
)
7167 for (i
= 0; i
< pd_list
->max_pd_count
; i
++) {
7168 if (pd_list
->pd_info
[i
].pdo_index
== sink_status
->current_pdo_num
)
7175 static void sec_bat_set_rp_current(struct sec_battery_info
*battery
, int cable_type
)
7177 if (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL3
) {
7178 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_HV_DISABLE
)
7179 sec_bat_change_default_current(battery
, cable_type
,
7180 battery
->pdata
->default_input_current
, battery
->pdata
->default_charging_current
);
7182 sec_bat_change_default_current(battery
, cable_type
,
7183 RP_CURRENT_RP3
, battery
->pdata
->max_charging_current
);
7185 else if (battery
->pdic_info
.sink_status
.rp_currentlvl
== RP_CURRENT_LEVEL2
)
7186 sec_bat_change_default_current(battery
, cable_type
,
7187 RP_CURRENT_RP2
, RP_CURRENT_RP2
);
7188 else if (cable_type
== SEC_BATTERY_CABLE_USB
) {
7189 if (battery
->current_event
& SEC_BAT_CURRENT_EVENT_USB_SUPER
)
7190 sec_bat_change_default_current(battery
, SEC_BATTERY_CABLE_USB
,
7191 USB_CURRENT_SUPER_SPEED
, USB_CURRENT_SUPER_SPEED
);
7193 sec_bat_change_default_current(battery
, cable_type
,
7194 RP_CURRENT_RP1
, RP_CURRENT_RP1
);
7197 pr_info("%s:(%d)\n", __func__
, battery
->pdic_info
.sink_status
.rp_currentlvl
);
7198 battery
->max_charge_power
= 0;
7199 sec_bat_set_charging_current(battery
);
7203 static int make_pd_list(struct sec_battery_info
*battery
)
7205 int i
= 0, j
= 0, min
= 0, temp_voltage
= 0, temp_current
= 0, temp_index
= 0;
7206 int base_charge_power
= 0, selected_pdo_voltage
= 0, selected_pdo_num
= 0;
7207 int pd_list_index
= 0;
7208 int pd_charging_charge_power
= battery
->current_event
& SEC_BAT_CURRENT_EVENT_HV_DISABLE
?
7209 battery
->pdata
->nv_charge_power
: battery
->pdata
->pd_charging_charge_power
;
7211 for (base_charge_power
= pd_charging_charge_power
* 1000;
7212 base_charge_power
>= 1000000; base_charge_power
-= 1000000)
7214 selected_pdo_voltage
= battery
->pdata
->max_input_voltage
+ 1;
7215 selected_pdo_num
= 0;
7216 for(i
=1; i
<= battery
->pdic_info
.sink_status
.available_pdo_num
; i
++)
7218 if (battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7219 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
> base_charge_power
- 1000000 &&
7220 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7221 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
<= base_charge_power
)
7223 if (battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
< selected_pdo_voltage
)
7225 selected_pdo_voltage
= battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
;
7226 selected_pdo_num
= i
;
7227 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
=
7228 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
>
7229 battery
->pdata
->max_input_current
?
7230 battery
->pdata
->max_input_current
: battery
->pdic_info
.sink_status
.power_list
[i
].max_current
;
7234 if (selected_pdo_num
)
7236 battery
->pd_list
.pd_info
[pd_list_index
].input_voltage
=
7237 battery
->pdic_info
.sink_status
.power_list
[selected_pdo_num
].max_voltage
;
7238 battery
->pd_list
.pd_info
[pd_list_index
].input_current
=
7239 battery
->pdic_info
.sink_status
.power_list
[selected_pdo_num
].max_current
;
7240 battery
->pd_list
.pd_info
[pd_list_index
].pdo_index
= selected_pdo_num
;
7244 pr_info("%s: total pd_list_index: %d\n", __func__
, pd_list_index
);
7245 if (pd_list_index
<= 0) {
7246 pr_info("%s : PDO list is empty!!\n", __func__
);
7250 for (i
= 0; i
< pd_list_index
- 1; i
++) {
7252 for (j
= i
+ 1; j
< pd_list_index
; j
++) {
7253 if (battery
->pd_list
.pd_info
[j
].input_voltage
<
7254 battery
->pd_list
.pd_info
[min
].input_voltage
)
7257 temp_voltage
= battery
->pd_list
.pd_info
[i
].input_voltage
;
7258 battery
->pd_list
.pd_info
[i
].input_voltage
=
7259 battery
->pd_list
.pd_info
[min
].input_voltage
;
7260 battery
->pd_list
.pd_info
[min
].input_voltage
= temp_voltage
;
7261 temp_current
= battery
->pd_list
.pd_info
[i
].input_current
;
7262 battery
->pd_list
.pd_info
[i
].input_current
=
7263 battery
->pd_list
.pd_info
[min
].input_current
;
7264 battery
->pd_list
.pd_info
[min
].input_current
= temp_current
;
7265 temp_index
= battery
->pd_list
.pd_info
[i
].pdo_index
;
7266 battery
->pd_list
.pd_info
[i
].pdo_index
=
7267 battery
->pd_list
.pd_info
[min
].pdo_index
;
7268 battery
->pd_list
.pd_info
[min
].pdo_index
= temp_index
;
7270 for(i
= 0; i
< pd_list_index
; i
++) {
7271 pr_info("%s: Made pd_list[%d], voltage : %d, current : %d, index : %d\n", __func__
, i
,
7272 battery
->pd_list
.pd_info
[i
].input_voltage
,
7273 battery
->pd_list
.pd_info
[i
].input_current
,
7274 battery
->pd_list
.pd_info
[i
].pdo_index
);
7276 battery
->pd_list
.max_pd_count
= pd_list_index
;
7277 battery
->max_charge_power
= battery
->pdic_info
.sink_status
.power_list
[ \
7278 battery
->pd_list
.pd_info
[pd_list_index
-1].pdo_index
].max_voltage
* \
7279 battery
->pdic_info
.sink_status
.power_list
[battery
->pd_list
.pd_info
[ \
7280 pd_list_index
-1].pdo_index
].max_current
/ 1000;
7281 battery
->pd_max_charge_power
= battery
->max_charge_power
;
7283 if (battery
->pdic_info
.sink_status
.selected_pdo_num
== battery
->pd_list
.pd_info
[pd_list_index
-1].pdo_index
) {
7284 battery
->pd_list
.now_pd_index
= pd_list_index
- 1;
7285 battery
->pdic_ps_rdy
= true;
7286 dev_info(battery
->dev
, "%s: battery->pdic_ps_rdy(%d)\n", __func__
, battery
->pdic_ps_rdy
);
7288 /* change input current before request new pdo if new pdo's input current is less than now */
7289 if (battery
->pd_list
.pd_info
[pd_list_index
-1].input_current
< battery
->input_current
) {
7290 union power_supply_propval value
= {0, };
7291 int input_current
= battery
->pd_list
.pd_info
[pd_list_index
-1].input_current
;
7293 value
.intval
= input_current
;
7294 battery
->input_current
= input_current
;
7295 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_SELECT_PDO
,
7296 SEC_BAT_CURRENT_EVENT_SELECT_PDO
);
7297 psy_do_property(battery
->pdata
->charger_name
, set
,
7298 POWER_SUPPLY_PROP_CURRENT_MAX
, value
);
7300 battery
->pdic_ps_rdy
= false;
7301 select_pdo(battery
->pd_list
.pd_info
[pd_list_index
-1].pdo_index
);
7304 return battery
->pd_list
.max_pd_count
;
7307 static int usb_typec_handle_notification(struct notifier_block
*nb
,
7308 unsigned long action
, void *data
)
7311 struct sec_battery_info
*battery
=
7312 container_of(nb
, struct sec_battery_info
, usb_typec_nb
);
7313 int cable_type
= SEC_BATTERY_CABLE_NONE
, i
= 0, current_pdo
= 0;
7314 int pd_charging_charge_power
= battery
->current_event
& SEC_BAT_CURRENT_EVENT_HV_DISABLE
?
7315 battery
->pdata
->nv_charge_power
: battery
->pdata
->pd_charging_charge_power
;
7316 CC_NOTI_ATTACH_TYPEDEF usb_typec_info
= *(CC_NOTI_ATTACH_TYPEDEF
*)data
;
7318 dev_info(battery
->dev
, "%s: action (%ld) dump(0x%01x, 0x%01x, 0x%02x, 0x%04x, 0x%04x, 0x%04x)\n",
7319 __func__
, action
, usb_typec_info
.src
, usb_typec_info
.dest
, usb_typec_info
.id
,
7320 usb_typec_info
.attach
, usb_typec_info
.rprd
, usb_typec_info
.cable_type
);
7322 if (usb_typec_info
.dest
!= CCIC_NOTIFY_DEV_BATTERY
) {
7323 dev_info(battery
->dev
, "%s: skip handler dest(%d)\n",
7324 __func__
, usb_typec_info
.dest
);
7328 mutex_lock(&battery
->typec_notylock
);
7329 switch (usb_typec_info
.id
) {
7330 case CCIC_NOTIFY_ID_WATER
:
7331 case CCIC_NOTIFY_ID_ATTACH
:
7332 switch (usb_typec_info
.attach
) {
7333 case MUIC_NOTIFY_CMD_DETACH
:
7334 case MUIC_NOTIFY_CMD_LOGICALLY_DETACH
:
7336 battery
->is_jig_on
= false;
7337 battery
->pd_usb_attached
= false;
7338 cable_type
= SEC_BATTERY_CABLE_NONE
;
7339 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7340 battery
->pdic_info
.sink_status
.rp_currentlvl
= RP_CURRENT_LEVEL_NONE
;
7342 case MUIC_NOTIFY_CMD_ATTACH
:
7343 case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH
:
7344 /* Skip notify from MUIC if PDIC is attached already */
7345 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
7346 mutex_unlock(&battery
->typec_notylock
);
7350 battery
->muic_cable_type
= usb_typec_info
.cable_type
;
7351 cable_type
= sec_bat_cable_check(battery
, battery
->muic_cable_type
);
7352 if (battery
->cable_type
!= cable_type
&&
7353 battery
->pdic_info
.sink_status
.rp_currentlvl
>= RP_CURRENT_LEVEL_DEFAULT
&&
7354 (cable_type
== SEC_BATTERY_CABLE_USB
|| cable_type
== SEC_BATTERY_CABLE_TA
)) {
7355 sec_bat_set_rp_current(battery
, cable_type
);
7356 } else if ((struct pdic_notifier_struct
*)usb_typec_info
.pd
!= NULL
&&
7357 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_CCIC_ATTACH
&&
7358 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.rp_currentlvl
>= RP_CURRENT_LEVEL_DEFAULT
&&
7359 (cable_type
== SEC_BATTERY_CABLE_USB
|| cable_type
== SEC_BATTERY_CABLE_TA
)) {
7360 battery
->pdic_info
.sink_status
.rp_currentlvl
=
7361 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.rp_currentlvl
;
7362 sec_bat_set_rp_current(battery
, cable_type
);
7368 battery
->muic_cable_type
= usb_typec_info
.cable_type
;
7371 battery
->pdic_attach
= false;
7372 battery
->pdic_ps_rdy
= false;
7373 #if defined(CONFIG_AFC_CHARGER_MODE)
7374 if (battery
->muic_cable_type
== ATTACHED_DEV_QC_CHARGER_9V_MUIC
||
7375 battery
->muic_cable_type
== ATTACHED_DEV_QC_CHARGER_ERR_V_MUIC
)
7376 battery
->hv_chg_name
= "QC";
7377 else if (battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_9V_MUIC
||
7378 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_9V_DUPLI_MUIC
||
7379 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_ERR_V_MUIC
||
7380 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC
)
7381 battery
->hv_chg_name
= "AFC";
7382 #if defined(CONFIG_MUIC_HV_12V)
7383 else if (battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_MUIC
||
7384 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC
)
7385 battery
->hv_chg_name
= "12V";
7388 battery
->hv_chg_name
= "NONE";
7391 case CCIC_NOTIFY_ID_POWER_STATUS
:
7392 #ifdef CONFIG_SEC_FACTORY
7393 dev_info(battery
->dev
, "%s: pd_event(%d)\n", __func__
,
7394 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
);
7396 if ((*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_DETACH
){
7397 dev_info(battery
->dev
, "%s: skip pd operation - attach(%d)\n", __func__
, usb_typec_info
.attach
);
7398 battery
->pdic_attach
= false;
7399 battery
->pdic_ps_rdy
= false;
7400 battery
->pd_list
.now_pd_index
= 0;
7401 mutex_unlock(&battery
->typec_notylock
);
7406 if ((*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_CCIC_ATTACH
) {
7407 battery
->pdic_info
.sink_status
.rp_currentlvl
=
7408 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.rp_currentlvl
;
7409 dev_info(battery
->dev
, "%s: battery->rp_currentlvl(%d)\n", __func__
, battery
->pdic_info
.sink_status
.rp_currentlvl
);
7410 if (battery
->wire_status
== SEC_BATTERY_CABLE_USB
|| battery
->wire_status
== SEC_BATTERY_CABLE_TA
) {
7411 cable_type
= battery
->wire_status
;
7412 battery
->chg_limit
= false;
7413 sec_bat_set_rp_current(battery
, cable_type
);
7414 goto skip_cable_check
;
7416 mutex_unlock(&battery
->typec_notylock
);
7419 if ((*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).event
== PDIC_NOTIFY_EVENT_PD_SINK_CAP
)
7420 battery
->pdic_attach
= false;
7421 if (!battery
->pdic_attach
) {
7422 battery
->pdic_info
= *(struct pdic_notifier_struct
*)usb_typec_info
.pd
;
7423 battery
->pd_list
.now_pd_index
= 0;
7425 battery
->pdic_info
.sink_status
.selected_pdo_num
=
7426 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.selected_pdo_num
;
7427 battery
->pdic_info
.sink_status
.current_pdo_num
=
7428 (*(struct pdic_notifier_struct
*)usb_typec_info
.pd
).sink_status
.current_pdo_num
;
7429 battery
->pd_list
.now_pd_index
= sec_bat_get_pd_list_index(&battery
->pdic_info
.sink_status
,
7431 battery
->pdic_ps_rdy
= true;
7432 dev_info(battery
->dev
, "%s: battery->pdic_ps_rdy(%d)\n", __func__
, battery
->pdic_ps_rdy
);
7434 current_pdo
= battery
->pdic_info
.sink_status
.current_pdo_num
;
7435 cable_type
= SEC_BATTERY_CABLE_PDIC
;
7436 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7437 #if defined(CONFIG_AFC_CHARGER_MODE)
7438 battery
->hv_chg_name
= "PDIC";
7440 battery
->input_voltage
=
7441 battery
->pdic_info
.sink_status
.power_list
[current_pdo
].max_voltage
/ 1000;
7442 dev_info(battery
->dev
, "%s: available pdo : %d, current pdo : %d\n", __func__
,
7443 battery
->pdic_info
.sink_status
.available_pdo_num
, current_pdo
);
7445 for(i
=1; i
<= battery
->pdic_info
.sink_status
.available_pdo_num
; i
++) {
7446 pr_info("%s: power_list[%d], voltage : %d, current : %d, power : %d\n", __func__
, i
,
7447 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
,
7448 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
,
7449 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7450 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
);
7452 if ((battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7453 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
) >
7454 (pd_charging_charge_power
* 1000)) {
7455 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
=
7456 (pd_charging_charge_power
* 1000) /
7457 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
;
7459 pr_info("%s: ->updated [%d], voltage : %d, current : %d, power : %d\n", __func__
, i
,
7460 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
,
7461 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
,
7462 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7463 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
);
7467 if (!battery
->pdic_attach
) {
7468 if (make_pd_list(battery
) <= 0)
7469 goto skip_cable_work
;
7471 battery
->pdic_attach
= true;
7473 case CCIC_NOTIFY_ID_USB
:
7474 if(usb_typec_info
.cable_type
== PD_USB_TYPE
)
7475 battery
->pd_usb_attached
= true;
7476 dev_info(battery
->dev
, "%s: CCIC_NOTIFY_ID_USB: %d\n",__func__
, battery
->pd_usb_attached
);
7477 wake_lock(&battery
->monitor_wake_lock
);
7478 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7479 mutex_unlock(&battery
->typec_notylock
);
7484 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7485 #if defined(CONFIG_AFC_CHARGER_MODE)
7486 battery
->hv_chg_name
= "NONE";
7492 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
,
7493 (battery
->muic_cable_type
!= ATTACHED_DEV_UNDEFINED_CHARGING_MUIC
) &&
7494 (battery
->muic_cable_type
!= ATTACHED_DEV_UNDEFINED_RANGE_MUIC
));
7496 /* showing charging icon and noti(no sound, vi, haptic) only
7497 if slow insertion is detected by MUIC */
7498 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_TIMEOUT_OPEN_TYPE
,
7499 (battery
->muic_cable_type
!= ATTACHED_DEV_TIMEOUT_OPEN_MUIC
));
7501 if (cable_type
< 0 || cable_type
> SEC_BATTERY_CABLE_MAX
) {
7502 dev_info(battery
->dev
, "%s: ignore event(%d)\n",
7503 __func__
, battery
->muic_cable_type
);
7504 goto skip_cable_work
;
7505 } else if ((cable_type
== SEC_BATTERY_CABLE_UNKNOWN
) &&
7506 (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
)) {
7507 battery
->cable_type
= cable_type
;
7508 wake_lock(&battery
->monitor_wake_lock
);
7509 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7510 dev_info(battery
->dev
, "%s: UNKNOWN cable plugin\n", __func__
);
7511 goto skip_cable_work
;
7513 battery
->wire_status
= cable_type
;
7515 cancel_delayed_work(&battery
->cable_work
);
7516 wake_unlock(&battery
->cable_wake_lock
);
7518 if (cable_type
== SEC_BATTERY_CABLE_HV_TA_CHG_LIMIT
) {
7519 /* set current event */
7520 cancel_delayed_work(&battery
->afc_work
);
7521 wake_unlock(&battery
->afc_wake_lock
);
7522 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_CHG_LIMIT
,
7523 (SEC_BAT_CURRENT_EVENT_CHG_LIMIT
| SEC_BAT_CURRENT_EVENT_AFC
));
7524 wake_lock(&battery
->monitor_wake_lock
);
7525 battery
->polling_count
= 1; /* initial value = 1 */
7526 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7527 } else if ((battery
->wire_status
== battery
->cable_type
) &&
7528 (((battery
->wire_status
== SEC_BATTERY_CABLE_USB
|| battery
->wire_status
== SEC_BATTERY_CABLE_TA
) &&
7529 battery
->pdic_info
.sink_status
.rp_currentlvl
> RP_CURRENT_LEVEL_DEFAULT
) ||
7530 is_hv_wire_type(battery
->wire_status
))) {
7531 cancel_delayed_work(&battery
->afc_work
);
7532 wake_unlock(&battery
->afc_wake_lock
);
7533 sec_bat_set_current_event(battery
, 0, SEC_BAT_CURRENT_EVENT_AFC
);
7535 wake_lock(&battery
->monitor_wake_lock
);
7536 battery
->polling_count
= 1; /* initial value = 1 */
7537 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7538 } else if (cable_type
== SEC_BATTERY_CABLE_PREPARE_TA
) {
7539 wake_lock(&battery
->cable_wake_lock
);
7540 queue_delayed_work(battery
->monitor_wqueue
,
7541 &battery
->cable_work
, msecs_to_jiffies(500));
7543 wake_lock(&battery
->cable_wake_lock
);
7544 queue_delayed_work(battery
->monitor_wqueue
,
7545 &battery
->cable_work
, 0);
7549 dev_info(battery
->dev
, "%s: CMD[%s], CABLE_TYPE[%d]\n", __func__
, cmd
, cable_type
);
7550 mutex_unlock(&battery
->typec_notylock
);
7554 #if defined(CONFIG_CCIC_NOTIFIER)
7555 static int batt_pdic_handle_notification(struct notifier_block
*nb
,
7556 unsigned long action
, void *data
)
7559 struct sec_battery_info
*battery
=
7560 container_of(nb
, struct sec_battery_info
,
7562 battery
->pdic_info
= *(struct pdic_notifier_struct
*)data
;
7564 mutex_lock(&battery
->batt_handlelock
);
7565 pr_info("%s: pdic_event: %d\n", __func__
, battery
->pdic_info
.event
);
7567 switch (battery
->pdic_info
.event
) {
7568 int i
, selected_pdo
;
7570 case PDIC_NOTIFY_EVENT_DETACH
:
7572 battery
->pdic_attach
= false;
7573 if (battery
->wire_status
== SEC_BATTERY_CABLE_PDIC
) {
7574 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
7575 wake_lock(&battery
->cable_wake_lock
);
7576 queue_delayed_work(battery
->monitor_wqueue
,
7577 &battery
->cable_work
, 0);
7580 case PDIC_NOTIFY_EVENT_CCIC_ATTACH
:
7583 case PDIC_NOTIFY_EVENT_PD_SINK
:
7584 selected_pdo
= battery
->pdic_info
.sink_status
.selected_pdo_num
;
7586 battery
->wire_status
= SEC_BATTERY_CABLE_PDIC
;
7587 battery
->pdic_attach
= true;
7588 battery
->input_voltage
=
7589 battery
->pdic_info
.sink_status
.power_list
[selected_pdo
].max_voltage
/ 1000;
7591 pr_info("%s: total pdo : %d, selected pdo : %d\n", __func__
,
7592 battery
->pdic_info
.sink_status
.available_pdo_num
, selected_pdo
);
7593 for(i
=1; i
<= battery
->pdic_info
.sink_status
.available_pdo_num
; i
++)
7595 pr_info("%s: power_list[%d], voltage : %d, current : %d, power : %d\n", __func__
, i
,
7596 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
,
7597 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
,
7598 battery
->pdic_info
.sink_status
.power_list
[i
].max_voltage
*
7599 battery
->pdic_info
.sink_status
.power_list
[i
].max_current
);
7601 wake_lock(&battery
->cable_wake_lock
);
7602 queue_delayed_work(battery
->monitor_wqueue
,
7603 &battery
->cable_work
, 0);
7605 case PDIC_NOTIFY_EVENT_PD_SOURCE
:
7612 pr_info("%s: CMD=%s, cable_type : %d\n", __func__
, cmd
, battery
->cable_type
);
7613 mutex_unlock(&battery
->batt_handlelock
);
7618 #if defined(CONFIG_MUIC_NOTIFIER)
7619 static int batt_handle_notification(struct notifier_block
*nb
,
7620 unsigned long action
, void *data
)
7623 int cable_type
= SEC_BATTERY_CABLE_NONE
;
7624 struct sec_battery_info
*battery
=
7625 container_of(nb
, struct sec_battery_info
,
7627 union power_supply_propval value
= {0, };
7629 #if defined(CONFIG_CCIC_NOTIFIER)
7630 CC_NOTI_ATTACH_TYPEDEF
*p_noti
= (CC_NOTI_ATTACH_TYPEDEF
*)data
;
7631 muic_attached_dev_t attached_dev
= p_noti
->cable_type
;
7633 muic_attached_dev_t attached_dev
= *(muic_attached_dev_t
*)data
;
7636 mutex_lock(&battery
->batt_handlelock
);
7638 case MUIC_NOTIFY_CMD_DETACH
:
7639 case MUIC_NOTIFY_CMD_LOGICALLY_DETACH
:
7641 battery
->is_jig_on
= false;
7642 cable_type
= SEC_BATTERY_CABLE_NONE
;
7643 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7645 case MUIC_NOTIFY_CMD_ATTACH
:
7646 case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH
:
7648 cable_type
= sec_bat_cable_check(battery
, attached_dev
);
7649 battery
->muic_cable_type
= attached_dev
;
7654 battery
->muic_cable_type
= ATTACHED_DEV_NONE_MUIC
;
7658 sec_bat_set_misc_event(battery
, BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
,
7659 #if !defined(CONFIG_ENG_BATTERY_CONCEPT) && !defined(CONFIG_SEC_FACTORY)
7660 (battery
->muic_cable_type
!= ATTACHED_DEV_JIG_UART_ON_MUIC
) &&
7661 (battery
->muic_cable_type
!= ATTACHED_DEV_JIG_USB_ON_MUIC
) &&
7663 (battery
->muic_cable_type
!= ATTACHED_DEV_UNDEFINED_RANGE_MUIC
));
7665 #if defined(CONFIG_CCIC_NOTIFIER)
7666 /* If PD cable is already attached, return this function */
7667 if(battery
->pdic_attach
) {
7668 dev_info(battery
->dev
, "%s: ignore event pdic attached(%d)\n",
7669 __func__
, battery
->pdic_attach
);
7670 mutex_unlock(&battery
->batt_handlelock
);
7675 if (attached_dev
== ATTACHED_DEV_MHL_MUIC
) {
7676 mutex_unlock(&battery
->batt_handlelock
);
7680 if (cable_type
< 0) {
7681 dev_info(battery
->dev
, "%s: ignore event(%d)\n",
7682 __func__
, cable_type
);
7683 } else if (cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
7684 battery
->ps_status
= true;
7685 battery
->ps_enable
= true;
7686 battery
->wire_status
= cable_type
;
7687 dev_info(battery
->dev
, "%s: power sharing cable plugin\n", __func__
);
7688 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS
) {
7689 battery
->wc_status
= SEC_WIRELESS_PAD_WPC
;
7690 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_PACK
) {
7691 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_PACK
;
7692 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_PACK
) {
7693 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_PACK_HV
;
7694 } else if (cable_type
== SEC_BATTERY_CABLE_HV_WIRELESS
) {
7695 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_HV
;
7696 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_STAND
) {
7697 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_STAND
;
7698 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_STAND
) {
7699 battery
->wc_status
= SEC_WIRELESS_PAD_WPC_STAND_HV
;
7700 } else if (cable_type
== SEC_BATTERY_CABLE_PMA_WIRELESS
) {
7701 battery
->wc_status
= SEC_WIRELESS_PAD_PMA
;
7702 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_VEHICLE
) {
7703 battery
->wc_status
= SEC_WIRELESS_PAD_VEHICLE
;
7704 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_HV_VEHICLE
) {
7705 battery
->wc_status
= SEC_WIRELESS_PAD_VEHICLE_HV
;
7706 } else if (cable_type
== SEC_BATTERY_CABLE_WIRELESS_TX
) {
7707 battery
->wc_status
= SEC_WIRELESS_PAD_TX
;
7708 } else if ((cable_type
== SEC_BATTERY_CABLE_UNKNOWN
) &&
7709 (battery
->status
!= POWER_SUPPLY_STATUS_DISCHARGING
)) {
7710 battery
->cable_type
= cable_type
;
7711 wake_lock(&battery
->monitor_wake_lock
);
7712 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7713 dev_info(battery
->dev
,
7714 "%s: UNKNOWN cable plugin\n", __func__
);
7715 mutex_unlock(&battery
->batt_handlelock
);
7718 battery
->wire_status
= cable_type
;
7719 if ((battery
->wire_status
== SEC_BATTERY_CABLE_NONE
) &&
7720 (battery
->wc_status
) && (!battery
->ps_status
))
7721 cable_type
= SEC_BATTERY_CABLE_WIRELESS
;
7723 dev_info(battery
->dev
,
7724 "%s: current_cable(%d), wc_status(%d), wire_status(%d)\n",
7725 __func__
, cable_type
, battery
->wc_status
,
7726 battery
->wire_status
);
7728 mutex_unlock(&battery
->batt_handlelock
);
7729 if (attached_dev
== ATTACHED_DEV_USB_LANHUB_MUIC
) {
7730 if (!strcmp(cmd
, "ATTACH")) {
7731 value
.intval
= true;
7732 psy_do_property(battery
->pdata
->charger_name
, set
,
7733 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
,
7735 dev_info(battery
->dev
,
7736 "%s: Powered OTG cable attached\n", __func__
);
7738 value
.intval
= false;
7739 psy_do_property(battery
->pdata
->charger_name
, set
,
7740 POWER_SUPPLY_PROP_CHARGE_POWERED_OTG_CONTROL
,
7742 dev_info(battery
->dev
,
7743 "%s: Powered OTG cable detached\n", __func__
);
7747 #if defined(CONFIG_AFC_CHARGER_MODE)
7748 if (!strcmp(cmd
, "ATTACH")) {
7749 if ((battery
->muic_cable_type
>= ATTACHED_DEV_QC_CHARGER_PREPARE_MUIC
) &&
7750 (battery
->muic_cable_type
<= ATTACHED_DEV_QC_CHARGER_9V_MUIC
)) {
7751 battery
->hv_chg_name
= "QC";
7752 } else if ((battery
->muic_cable_type
>= ATTACHED_DEV_AFC_CHARGER_PREPARE_MUIC
) &&
7753 (battery
->muic_cable_type
<= ATTACHED_DEV_AFC_CHARGER_ERR_V_DUPLI_MUIC
)) {
7754 battery
->hv_chg_name
= "AFC";
7755 #if defined(CONFIG_MUIC_HV_12V)
7756 } else if (battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_MUIC
||
7757 battery
->muic_cable_type
== ATTACHED_DEV_AFC_CHARGER_12V_DUPLI_MUIC
) {
7758 battery
->hv_chg_name
= "12V";
7761 battery
->hv_chg_name
= "NONE";
7763 battery
->hv_chg_name
= "NONE";
7766 pr_info("%s : HV_CHARGER_NAME(%s)\n",
7767 __func__
, battery
->hv_chg_name
);
7770 if ((cable_type
>= 0) &&
7771 cable_type
<= SEC_BATTERY_CABLE_MAX
) {
7772 if (cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
7773 value
.intval
= battery
->ps_enable
;
7774 psy_do_property(battery
->pdata
->charger_name
, set
,
7775 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
7776 wake_lock(&battery
->monitor_wake_lock
);
7777 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7778 } else if((cable_type
== SEC_BATTERY_CABLE_NONE
) && (battery
->ps_status
)) {
7779 if (battery
->ps_enable
) {
7780 battery
->ps_enable
= false;
7781 value
.intval
= battery
->ps_enable
;
7782 psy_do_property(battery
->pdata
->charger_name
, set
,
7783 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
, value
);
7785 battery
->ps_status
= false;
7786 wake_lock(&battery
->monitor_wake_lock
);
7787 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
7788 } else if(cable_type
!= battery
->cable_type
) {
7789 wake_lock(&battery
->cable_wake_lock
);
7790 queue_delayed_work(battery
->monitor_wqueue
,
7791 &battery
->cable_work
, 0);
7793 dev_info(battery
->dev
,
7794 "%s: Cable is Not Changed(%d)\n",
7795 __func__
, battery
->cable_type
);
7799 pr_info("%s: CMD=%s, attached_dev=%d\n", __func__
, cmd
, attached_dev
);
7803 #endif /* CONFIG_MUIC_NOTIFIER */
7806 #if defined(CONFIG_VBUS_NOTIFIER)
7807 static int vbus_handle_notification(struct notifier_block
*nb
,
7808 unsigned long action
, void *data
)
7810 vbus_status_t vbus_status
= *(vbus_status_t
*)data
;
7811 struct sec_battery_info
*battery
=
7812 container_of(nb
, struct sec_battery_info
,
7814 union power_supply_propval value
= {0, };
7816 mutex_lock(&battery
->batt_handlelock
);
7817 if (battery
->muic_cable_type
== ATTACHED_DEV_HMT_MUIC
&&
7818 battery
->muic_vbus_status
!= vbus_status
&&
7819 battery
->muic_vbus_status
== STATUS_VBUS_HIGH
&&
7820 vbus_status
== STATUS_VBUS_LOW
) {
7822 value
.intval
= true;
7823 psy_do_property(battery
->pdata
->charger_name
, set
,
7824 POWER_SUPPLY_PROP_CHARGE_OTG_CONTROL
,
7826 dev_info(battery
->dev
,
7827 "%s: changed to OTG cable attached\n", __func__
);
7829 battery
->wire_status
= SEC_BATTERY_CABLE_OTG
;
7830 wake_lock(&battery
->cable_wake_lock
);
7831 queue_delayed_work(battery
->monitor_wqueue
, &battery
->cable_work
, 0);
7833 pr_info("%s: action=%d, vbus_status=%d\n", __func__
, (int)action
, vbus_status
);
7834 mutex_unlock(&battery
->batt_handlelock
);
7835 battery
->muic_vbus_status
= vbus_status
;
7842 static int sec_bat_parse_dt(struct device
*dev
,
7843 struct sec_battery_info
*battery
)
7845 struct device_node
*np
;
7846 sec_battery_platform_data_t
*pdata
= battery
->pdata
;
7847 int ret
= 0, len
= 0;
7852 np
= of_find_node_by_name(NULL
, "cable-info");
7854 pr_err ("%s : np NULL\n", __func__
);
7856 struct device_node
*child
;
7857 u32 input_current
= 0, charging_current
= 0;
7859 ret
= of_property_read_u32(np
, "default_input_current", &input_current
);
7860 ret
= of_property_read_u32(np
, "default_charging_current", &charging_current
);
7861 ret
= of_property_read_u32(np
, "full_check_current_1st", &pdata
->full_check_current_1st
);
7862 ret
= of_property_read_u32(np
, "full_check_current_2nd", &pdata
->full_check_current_2nd
);
7864 pdata
->default_input_current
= input_current
;
7865 pdata
->default_charging_current
= charging_current
;
7867 pdata
->charging_current
=
7868 kzalloc(sizeof(sec_charging_current_t
) * SEC_BATTERY_CABLE_MAX
,
7871 for (i
= 0; i
< SEC_BATTERY_CABLE_MAX
; i
++) {
7872 pdata
->charging_current
[i
].input_current_limit
= (unsigned int)input_current
;
7873 pdata
->charging_current
[i
].fast_charging_current
= (unsigned int)charging_current
;
7876 for_each_child_of_node(np
, child
) {
7877 ret
= of_property_read_u32(child
, "input_current", &input_current
);
7878 ret
= of_property_read_u32(child
, "charging_current", &charging_current
);
7880 p
= of_get_property(child
, "cable_number", &len
);
7884 len
= len
/ sizeof(u32
);
7886 for (i
= 0; i
<= len
; i
++) {
7887 ret
= of_property_read_u32_index(child
, "cable_number", i
, &temp
);
7888 pdata
->charging_current
[temp
].input_current_limit
= (unsigned int)input_current
;
7889 pdata
->charging_current
[temp
].fast_charging_current
= (unsigned int)charging_current
;
7895 for (i
= 0; i
< SEC_BATTERY_CABLE_MAX
; i
++) {
7896 pr_info("%s : CABLE_NUM(%d) INPUT(%d) CHARGING(%d)\n",
7898 pdata
->charging_current
[i
].input_current_limit
,
7899 pdata
->charging_current
[i
].fast_charging_current
);
7902 pr_info("%s : TOPOFF_1ST(%d), TOPOFF_2ND(%d)\n",
7903 __func__
, pdata
->full_check_current_1st
, pdata
->full_check_current_2nd
);
7904 #ifdef CONFIG_SEC_FACTORY
7905 pdata
->default_charging_current
= 1500;
7906 pdata
->charging_current
[SEC_BATTERY_CABLE_TA
].fast_charging_current
= 1500;
7908 np
= of_find_node_by_name(NULL
, "battery");
7910 pr_info("%s: np NULL\n", __func__
);
7914 #if defined(CONFIG_BATTERY_CISD)
7915 ret
= of_property_read_u32(np
, "battery,battery_full_capacity",
7916 &pdata
->battery_full_capacity
);
7918 pr_info("%s : battery_full_capacity is Empty\n", __func__
);
7920 pr_info("%s : battery_full_capacity : %d\n", __func__
, pdata
->battery_full_capacity
);
7921 pdata
->cisd_cap_high_thr
= pdata
->battery_full_capacity
+ 1000;
7922 pdata
->cisd_cap_low_thr
= pdata
->battery_full_capacity
+ 500;
7923 pdata
->cisd_cap_limit
= (pdata
->battery_full_capacity
* 11) / 10;
7926 ret
= of_property_read_u32(np
, "battery,cisd_max_voltage_thr",
7927 &pdata
->max_voltage_thr
);
7929 pr_info("%s : cisd_max_voltage_thr is Empty\n", __func__
);
7930 pdata
->max_voltage_thr
= 4400;
7933 ret
= of_property_read_u32(np
, "battery,cisd_alg_index",
7934 &pdata
->cisd_alg_index
);
7936 pr_info("%s : cisd_alg_index is Empty. Defalut set to six\n", __func__
);
7937 pdata
->cisd_alg_index
= 6;
7939 pr_info("%s : set cisd_alg_index : %d\n", __func__
, pdata
->cisd_alg_index
);
7943 ret
= of_property_read_u32(np
,
7944 "battery,expired_time", &temp
);
7946 pr_info("expired time is empty\n");
7947 pdata
->expired_time
= 3 * 60 * 60;
7949 pdata
->expired_time
= (unsigned int) temp
;
7951 pdata
->expired_time
*= 1000;
7952 battery
->expired_time
= pdata
->expired_time
;
7954 ret
= of_property_read_u32(np
,
7955 "battery,recharging_expired_time", &temp
);
7957 pr_info("expired time is empty\n");
7958 pdata
->recharging_expired_time
= 90 * 60;
7960 pdata
->recharging_expired_time
= (unsigned int) temp
;
7962 pdata
->recharging_expired_time
*= 1000;
7964 ret
= of_property_read_u32(np
,
7965 "battery,standard_curr", &pdata
->standard_curr
);
7967 pr_info("standard_curr is empty\n");
7968 pdata
->standard_curr
= 2150;
7971 ret
= of_property_read_string(np
,
7972 "battery,vendor", (char const **)&pdata
->vendor
);
7974 pr_info("%s: Vendor is Empty\n", __func__
);
7976 ret
= of_property_read_string(np
,
7977 "battery,charger_name", (char const **)&pdata
->charger_name
);
7979 pr_info("%s: Charger name is Empty\n", __func__
);
7981 ret
= of_property_read_string(np
,
7982 "battery,fuelgauge_name", (char const **)&pdata
->fuelgauge_name
);
7984 pr_info("%s: Fuelgauge name is Empty\n", __func__
);
7986 ret
= of_property_read_string(np
,
7987 "battery,wireless_charger_name", (char const **)&pdata
->wireless_charger_name
);
7989 pr_info("%s: Wireless charger name is Empty\n", __func__
);
7991 ret
= of_property_read_string(np
,
7992 "battery,fgsrc_switch_name", (char const **)&pdata
->fgsrc_switch_name
);
7994 pdata
->support_fgsrc_change
= false;
7995 pr_info("%s: fgsrc_switch_name is Empty\n", __func__
);
7998 pdata
->support_fgsrc_change
= true;
8000 ret
= of_property_read_string(np
,
8001 "battery,wireless_charger_name", (char const **)&pdata
->wireless_charger_name
);
8003 pr_info("%s: Wireless charger name is Empty\n", __func__
);
8005 ret
= of_property_read_string(np
,
8006 "battery,chip_vendor", (char const **)&pdata
->chip_vendor
);
8008 pr_info("%s: Chip vendor is Empty\n", __func__
);
8010 ret
= of_property_read_u32(np
, "battery,technology",
8011 &pdata
->technology
);
8013 pr_info("%s : technology is Empty\n", __func__
);
8015 ret
= of_property_read_u32(np
,
8016 "battery,wireless_cc_cv", &pdata
->wireless_cc_cv
);
8018 ret
= of_property_read_u32(np
,
8019 "battery,set_cv_vout_in_low_capacity", &pdata
->set_cv_vout_in_low_capacity
);
8021 pdata
->fake_capacity
= of_property_read_bool(np
,
8022 "battery,fake_capacity");
8024 p
= of_get_property(np
, "battery,polling_time", &len
);
8028 len
= len
/ sizeof(u32
);
8029 pdata
->polling_time
= kzalloc(sizeof(*pdata
->polling_time
) * len
, GFP_KERNEL
);
8030 ret
= of_property_read_u32_array(np
, "battery,polling_time",
8031 pdata
->polling_time
, len
);
8033 pr_info("%s : battery,polling_time is Empty\n", __func__
);
8035 ret
= of_property_read_u32(np
, "battery,thermal_source",
8036 &pdata
->thermal_source
);
8038 pr_info("%s : Thermal source is Empty\n", __func__
);
8040 if (pdata
->thermal_source
== SEC_BATTERY_THERMAL_SOURCE_ADC
) {
8041 p
= of_get_property(np
, "battery,temp_table_adc", &len
);
8045 len
= len
/ sizeof(u32
);
8047 pdata
->temp_adc_table_size
= len
;
8048 pdata
->temp_amb_adc_table_size
= len
;
8050 pdata
->temp_adc_table
=
8051 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8052 pdata
->temp_adc_table_size
, GFP_KERNEL
);
8053 pdata
->temp_amb_adc_table
=
8054 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8055 pdata
->temp_adc_table_size
, GFP_KERNEL
);
8057 for(i
= 0; i
< pdata
->temp_adc_table_size
; i
++) {
8058 ret
= of_property_read_u32_index(np
,
8059 "battery,temp_table_adc", i
, &temp
);
8060 pdata
->temp_adc_table
[i
].adc
= (int)temp
;
8062 pr_info("%s : Temp_adc_table(adc) is Empty\n",
8065 ret
= of_property_read_u32_index(np
,
8066 "battery,temp_table_data", i
, &temp
);
8067 pdata
->temp_adc_table
[i
].data
= (int)temp
;
8069 pr_info("%s : Temp_adc_table(data) is Empty\n",
8072 ret
= of_property_read_u32_index(np
,
8073 "battery,temp_table_adc", i
, &temp
);
8074 pdata
->temp_amb_adc_table
[i
].adc
= (int)temp
;
8076 pr_info("%s : Temp_amb_adc_table(adc) is Empty\n",
8079 ret
= of_property_read_u32_index(np
,
8080 "battery,temp_table_data", i
, &temp
);
8081 pdata
->temp_amb_adc_table
[i
].data
= (int)temp
;
8083 pr_info("%s : Temp_amb_adc_table(data) is Empty\n",
8087 ret
= of_property_read_u32(np
, "battery,usb_thermal_source",
8088 &pdata
->usb_thermal_source
);
8090 pr_info("%s : usb_thermal_source is Empty\n", __func__
);
8092 if(pdata
->usb_thermal_source
) {
8093 p
= of_get_property(np
, "battery,usb_temp_table_adc", &len
);
8097 len
= len
/ sizeof(u32
);
8099 pdata
->usb_temp_adc_table_size
= len
;
8101 pdata
->usb_temp_adc_table
=
8102 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8103 pdata
->usb_temp_adc_table_size
, GFP_KERNEL
);
8105 for(i
= 0; i
< pdata
->usb_temp_adc_table_size
; i
++) {
8106 ret
= of_property_read_u32_index(np
,
8107 "battery,usb_temp_table_adc", i
, &temp
);
8108 pdata
->usb_temp_adc_table
[i
].adc
= (int)temp
;
8110 pr_info("%s : Usb_Temp_adc_table(adc) is Empty\n",
8113 ret
= of_property_read_u32_index(np
,
8114 "battery,usb_temp_table_data", i
, &temp
);
8115 pdata
->usb_temp_adc_table
[i
].data
= (int)temp
;
8117 pr_info("%s : Usb_Temp_adc_table(data) is Empty\n",
8122 ret
= of_property_read_u32(np
, "battery,chg_thermal_source",
8123 &pdata
->chg_thermal_source
);
8125 pr_info("%s : chg_thermal_source is Empty\n", __func__
);
8127 if(pdata
->chg_thermal_source
) {
8128 p
= of_get_property(np
, "battery,chg_temp_table_adc", &len
);
8132 len
= len
/ sizeof(u32
);
8134 pdata
->chg_temp_adc_table_size
= len
;
8136 pdata
->chg_temp_adc_table
=
8137 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8138 pdata
->chg_temp_adc_table_size
, GFP_KERNEL
);
8140 for(i
= 0; i
< pdata
->chg_temp_adc_table_size
; i
++) {
8141 ret
= of_property_read_u32_index(np
,
8142 "battery,chg_temp_table_adc", i
, &temp
);
8143 pdata
->chg_temp_adc_table
[i
].adc
= (int)temp
;
8145 pr_info("%s : CHG_Temp_adc_table(adc) is Empty\n",
8148 ret
= of_property_read_u32_index(np
,
8149 "battery,chg_temp_table_data", i
, &temp
);
8150 pdata
->chg_temp_adc_table
[i
].data
= (int)temp
;
8152 pr_info("%s : CHG_Temp_adc_table(data) is Empty\n",
8157 ret
= of_property_read_u32(np
, "battery,wpc_thermal_source",
8158 &pdata
->wpc_thermal_source
);
8160 pr_info("%s : wpc_thermal_source is Empty\n", __func__
);
8162 if(pdata
->wpc_thermal_source
) {
8163 p
= of_get_property(np
, "battery,wpc_temp_table_adc", &len
);
8165 pr_info("%s : wpc_temp_table_adc(adc) is Empty\n",__func__
);
8167 len
= len
/ sizeof(u32
);
8169 pdata
->wpc_temp_adc_table_size
= len
;
8171 pdata
->wpc_temp_adc_table
=
8172 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8173 pdata
->wpc_temp_adc_table_size
, GFP_KERNEL
);
8175 for(i
= 0; i
< pdata
->wpc_temp_adc_table_size
; i
++) {
8176 ret
= of_property_read_u32_index(np
,
8177 "battery,wpc_temp_table_adc", i
, &temp
);
8178 pdata
->wpc_temp_adc_table
[i
].adc
= (int)temp
;
8180 pr_info("%s : WPC_Temp_adc_table(adc) is Empty\n",
8183 ret
= of_property_read_u32_index(np
,
8184 "battery,wpc_temp_table_data", i
, &temp
);
8185 pdata
->wpc_temp_adc_table
[i
].data
= (int)temp
;
8187 pr_info("%s : WPC_Temp_adc_table(data) is Empty\n",
8193 ret
= of_property_read_u32(np
, "battery,coil_thermal_source",
8194 &pdata
->coil_thermal_source
);
8196 pr_info("%s : coil_thermal_source is Empty\n", __func__
);
8198 pr_info("%s : coil_thermal_source exists\n", __func__
);
8200 ret
= of_property_read_u32(np
, "battery,slave_thermal_source",
8201 &pdata
->slave_thermal_source
);
8203 pr_info("%s : slave_thermal_source is Empty\n", __func__
);
8205 if(pdata
->slave_thermal_source
) {
8206 p
= of_get_property(np
, "battery,slave_chg_temp_table_adc", &len
);
8210 len
= len
/ sizeof(u32
);
8212 pdata
->slave_chg_temp_adc_table_size
= len
;
8214 pdata
->slave_chg_temp_adc_table
=
8215 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8216 pdata
->slave_chg_temp_adc_table_size
, GFP_KERNEL
);
8218 for(i
= 0; i
< pdata
->slave_chg_temp_adc_table_size
; i
++) {
8219 ret
= of_property_read_u32_index(np
,
8220 "battery,slave_chg_temp_table_adc", i
, &temp
);
8221 pdata
->slave_chg_temp_adc_table
[i
].adc
= (int)temp
;
8223 pr_info("%s : slave_chg_temp_adc_table(adc) is Empty\n",
8226 ret
= of_property_read_u32_index(np
,
8227 "battery,slave_chg_temp_table_data", i
, &temp
);
8228 pdata
->slave_chg_temp_adc_table
[i
].data
= (int)temp
;
8230 pr_info("%s : slave_chg_temp_adc_table(data) is Empty\n",
8234 ret
= of_property_read_u32(np
, "battery,slave_chg_temp_check",
8235 &pdata
->slave_chg_temp_check
);
8237 pr_info("%s : slave_chg_temp_check is Empty\n", __func__
);
8239 ret
= of_property_read_u32(np
, "battery,chg_temp_check",
8240 &pdata
->chg_temp_check
);
8242 pr_info("%s : chg_temp_check is Empty\n", __func__
);
8244 if (pdata
->chg_temp_check
) {
8245 ret
= of_property_read_u32(np
, "battery,chg_12v_high_temp",
8247 pdata
->chg_12v_high_temp
= (int)temp
;
8249 pr_info("%s : chg_12v_high_temp is Empty\n", __func__
);
8251 ret
= of_property_read_u32(np
, "battery,chg_high_temp",
8253 pdata
->chg_high_temp
= (int)temp
;
8255 pr_info("%s : chg_high_temp is Empty\n", __func__
);
8257 ret
= of_property_read_u32(np
, "battery,chg_high_temp_recovery",
8259 pdata
->chg_high_temp_recovery
= (int)temp
;
8261 pr_info("%s : chg_temp_recovery is Empty\n", __func__
);
8263 ret
= of_property_read_u32(np
, "battery,chg_charging_limit_current",
8264 &pdata
->chg_charging_limit_current
);
8266 pr_info("%s : chg_charging_limit_current is Empty\n", __func__
);
8268 ret
= of_property_read_u32(np
, "battery,chg_input_limit_current",
8269 &pdata
->chg_input_limit_current
);
8271 pr_info("%s : chg_input_limit_current is Empty\n", __func__
);
8273 ret
= of_property_read_u32(np
, "battery,mix_high_temp",
8275 pdata
->mix_high_temp
= (int)temp
;
8277 pr_info("%s : mix_high_temp is Empty\n", __func__
);
8279 ret
= of_property_read_u32(np
, "battery,mix_high_chg_temp",
8281 pdata
->mix_high_chg_temp
= (int)temp
;
8283 pr_info("%s : mix_high_chg_temp is Empty\n", __func__
);
8285 ret
= of_property_read_u32(np
, "battery,mix_high_temp_recovery",
8287 pdata
->mix_high_temp_recovery
= (int)temp
;
8289 pr_info("%s : mix_high_temp_recovery is Empty\n", __func__
);
8292 ret
= of_property_read_u32(np
, "battery,wpc_temp_check",
8293 &pdata
->wpc_temp_check
);
8295 pr_info("%s : wpc_temp_check is Empty\n", __func__
);
8297 if (pdata
->wpc_temp_check
) {
8298 ret
= of_property_read_u32(np
, "battery,wpc_temp_control_source",
8299 &pdata
->wpc_temp_control_source
);
8301 pr_info("%s : wpc_temp_control_source is Empty\n", __func__
);
8302 pdata
->wpc_temp_control_source
= TEMP_CONTROL_SOURCE_CHG_THM
;
8305 ret
= of_property_read_u32(np
, "battery,wpc_temp_lcd_on_control_source",
8306 &pdata
->wpc_temp_lcd_on_control_source
);
8308 pr_info("%s : wpc_temp_lcd_on_control_source is Empty\n", __func__
);
8309 pdata
->wpc_temp_lcd_on_control_source
= TEMP_CONTROL_SOURCE_CHG_THM
;
8312 ret
= of_property_read_u32(np
, "battery,wpc_high_temp",
8313 &pdata
->wpc_high_temp
);
8315 pr_info("%s : wpc_high_temp is Empty\n", __func__
);
8317 ret
= of_property_read_u32(np
, "battery,wpc_high_temp_recovery",
8318 &pdata
->wpc_high_temp_recovery
);
8320 pr_info("%s : wpc_high_temp_recovery is Empty\n", __func__
);
8322 ret
= of_property_read_u32(np
, "battery,wpc_charging_limit_current",
8323 &pdata
->wpc_charging_limit_current
);
8325 pr_info("%s : wpc_charging_limit_current is Empty\n", __func__
);
8327 ret
= of_property_read_u32(np
, "battery,wpc_lcd_on_high_temp",
8328 &pdata
->wpc_lcd_on_high_temp
);
8330 pr_info("%s : wpc_lcd_on_high_temp is Empty\n", __func__
);
8332 ret
= of_property_read_u32(np
, "battery,wpc_lcd_on_high_temp_rec",
8333 &pdata
->wpc_lcd_on_high_temp_rec
);
8335 pr_info("%s : wpc_lcd_on_high_temp_rec is Empty\n", __func__
);
8337 ret
= of_property_read_u32(np
, "battery,wpc_lcd_on_charging_limit_current",
8338 &pdata
->wpc_lcd_on_charging_limit_current
);
8340 pr_info("%s : wpc_lcd_on_charging_limit_current is Empty\n", __func__
);
8341 pdata
->wpc_lcd_on_charging_limit_current
=
8342 pdata
->wpc_charging_limit_current
;
8346 ret
= of_property_read_u32(np
, "battery,wc_full_input_limit_current",
8347 &pdata
->wc_full_input_limit_current
);
8349 pr_info("%s : wc_full_input_limit_current is Empty\n", __func__
);
8351 ret
= of_property_read_u32(np
, "battery,wc_cv_current",
8352 &pdata
->wc_cv_current
);
8354 pr_info("%s : wc_cv_current is Empty\n", __func__
);
8355 pdata
->wc_cv_current
= 820;
8358 ret
= of_property_read_u32(np
, "battery,wc_cv_tx_current",
8359 &pdata
->wc_cv_tx_current
);
8361 pr_info("%s : wc_cv_tx_current is Empty\n", __func__
);
8362 pdata
->wc_cv_tx_current
= 650;
8365 ret
= of_property_read_u32(np
, "battery,wc_cv_pack_current",
8366 &pdata
->wc_cv_pack_current
);
8368 pr_info("%s : wc_cv_pack_current is Empty\n", __func__
);
8369 pdata
->wc_cv_pack_current
= 500;
8372 ret
= of_property_read_u32(np
, "battery,wc_hero_stand_cc_cv",
8373 &pdata
->wc_hero_stand_cc_cv
);
8375 pr_info("%s : wc_hero_stand_cc_cv is Empty\n", __func__
);
8376 pdata
->wc_hero_stand_cc_cv
= 70;
8378 ret
= of_property_read_u32(np
, "battery,wc_hero_stand_cv_current",
8379 &pdata
->wc_hero_stand_cv_current
);
8381 pr_info("%s : wc_hero_stand_cv_current is Empty\n", __func__
);
8382 pdata
->wc_hero_stand_cv_current
= 600;
8384 ret
= of_property_read_u32(np
, "battery,wc_hero_stand_hv_cv_current",
8385 &pdata
->wc_hero_stand_hv_cv_current
);
8387 pr_info("%s : wc_hero_stand_hv_cv_current is Empty\n", __func__
);
8388 pdata
->wc_hero_stand_hv_cv_current
= 450;
8391 ret
= of_property_read_u32(np
, "battery,sleep_mode_limit_current",
8392 &pdata
->sleep_mode_limit_current
);
8394 pr_info("%s : sleep_mode_limit_current is Empty\n", __func__
);
8396 ret
= of_property_read_u32(np
, "battery,inbat_voltage",
8397 &pdata
->inbat_voltage
);
8399 pr_info("%s : inbat_voltage is Empty\n", __func__
);
8401 if (pdata
->inbat_voltage
) {
8402 p
= of_get_property(np
, "battery,inbat_voltage_table_adc", &len
);
8406 len
= len
/ sizeof(u32
);
8408 pdata
->inbat_adc_table_size
= len
;
8410 pdata
->inbat_adc_table
=
8411 kzalloc(sizeof(sec_bat_adc_table_data_t
) *
8412 pdata
->inbat_adc_table_size
, GFP_KERNEL
);
8414 for(i
= 0; i
< pdata
->inbat_adc_table_size
; i
++) {
8415 ret
= of_property_read_u32_index(np
,
8416 "battery,inbat_voltage_table_adc", i
, &temp
);
8417 pdata
->inbat_adc_table
[i
].adc
= (int)temp
;
8419 pr_info("%s : inbat_adc_table(adc) is Empty\n",
8422 ret
= of_property_read_u32_index(np
,
8423 "battery,inbat_voltage_table_data", i
, &temp
);
8424 pdata
->inbat_adc_table
[i
].data
= (int)temp
;
8426 pr_info("%s : inbat_adc_table(data) is Empty\n",
8431 ret
= of_property_read_u32(np
, "battery,pre_afc_input_current",
8432 &pdata
->pre_afc_input_current
);
8434 pr_info("%s : pre_afc_input_current is Empty\n", __func__
);
8435 pdata
->pre_afc_input_current
= 1000;
8438 ret
= of_property_read_u32(np
, "battery,pre_afc_work_delay",
8439 &pdata
->pre_afc_work_delay
);
8441 pr_info("%s : pre_afc_work_delay is Empty\n", __func__
);
8442 pdata
->pre_afc_work_delay
= 2000;
8445 ret
= of_property_read_u32(np
, "battery,pre_wc_afc_input_current",
8446 &pdata
->pre_wc_afc_input_current
);
8448 pr_info("%s : pre_wc_afc_input_current is Empty\n", __func__
);
8449 pdata
->pre_wc_afc_input_current
= 500; /* wc input default */
8452 ret
= of_property_read_u32(np
, "battery,pre_wc_afc_work_delay",
8453 &pdata
->pre_wc_afc_work_delay
);
8455 pr_info("%s : pre_wc_afc_work_delay is Empty\n", __func__
);
8456 pdata
->pre_wc_afc_work_delay
= 4000;
8459 ret
= of_property_read_u32(np
, "battery,adc_check_count",
8460 &pdata
->adc_check_count
);
8462 pr_info("%s : Adc check count is Empty\n", __func__
);
8464 ret
= of_property_read_u32(np
, "battery,temp_adc_type",
8465 &pdata
->temp_adc_type
);
8467 pr_info("%s : Temp adc type is Empty\n", __func__
);
8469 ret
= of_property_read_u32(np
, "battery,cable_check_type",
8470 &pdata
->cable_check_type
);
8472 pr_info("%s : Cable check type is Empty\n", __func__
);
8474 ret
= of_property_read_u32(np
, "battery,cable_source_type",
8475 &pdata
->cable_source_type
);
8477 pr_info("%s: Cable_source_type is Empty\n", __func__
);
8478 ret
= of_property_read_u32(np
, "battery,polling_type",
8479 &pdata
->polling_type
);
8481 pr_info("%s : Polling type is Empty\n", __func__
);
8483 ret
= of_property_read_u32(np
, "battery,monitor_initial_count",
8484 &pdata
->monitor_initial_count
);
8486 pr_info("%s : Monitor initial count is Empty\n", __func__
);
8488 ret
= of_property_read_u32(np
, "battery,battery_check_type",
8489 &pdata
->battery_check_type
);
8491 pr_info("%s : Battery check type is Empty\n", __func__
);
8493 ret
= of_property_read_u32(np
, "battery,check_count",
8494 &pdata
->check_count
);
8496 pr_info("%s : Check count is Empty\n", __func__
);
8498 ret
= of_property_read_u32(np
, "battery,check_adc_max",
8499 &pdata
->check_adc_max
);
8501 pr_info("%s : Check adc max is Empty\n", __func__
);
8503 ret
= of_property_read_u32(np
, "battery,check_adc_min",
8504 &pdata
->check_adc_min
);
8506 pr_info("%s : Check adc min is Empty\n", __func__
);
8508 ret
= of_property_read_u32(np
, "battery,ovp_uvlo_check_type",
8509 &pdata
->ovp_uvlo_check_type
);
8511 pr_info("%s : Ovp Uvlo check type is Empty\n", __func__
);
8513 ret
= of_property_read_u32(np
, "battery,temp_check_type",
8514 &pdata
->temp_check_type
);
8516 pr_info("%s : Temp check type is Empty\n", __func__
);
8518 ret
= of_property_read_u32(np
, "battery,temp_check_count",
8519 &pdata
->temp_check_count
);
8521 pr_info("%s : Temp check count is Empty\n", __func__
);
8523 ret
= of_property_read_u32(np
, "battery,temp_highlimit_threshold_normal",
8525 pdata
->temp_highlimit_threshold_normal
= (int)temp
;
8527 pr_info("%s : Temp highlimit threshold normal is Empty\n", __func__
);
8529 ret
= of_property_read_u32(np
, "battery,temp_highlimit_recovery_normal",
8531 pdata
->temp_highlimit_recovery_normal
= (int)temp
;
8533 pr_info("%s : Temp highlimit recovery normal is Empty\n", __func__
);
8535 ret
= of_property_read_u32(np
, "battery,temp_high_threshold_normal",
8537 pdata
->temp_high_threshold_normal
= (int)temp
;
8539 pr_info("%s : Temp high threshold normal is Empty\n", __func__
);
8541 ret
= of_property_read_u32(np
, "battery,temp_high_recovery_normal",
8543 pdata
->temp_high_recovery_normal
= (int)temp
;
8545 pr_info("%s : Temp high recovery normal is Empty\n", __func__
);
8547 ret
= of_property_read_u32(np
, "battery,temp_low_threshold_normal",
8549 pdata
->temp_low_threshold_normal
= (int)temp
;
8551 pr_info("%s : Temp low threshold normal is Empty\n", __func__
);
8553 ret
= of_property_read_u32(np
, "battery,temp_low_recovery_normal",
8555 pdata
->temp_low_recovery_normal
= (int)temp
;
8557 pr_info("%s : Temp low recovery normal is Empty\n", __func__
);
8559 ret
= of_property_read_u32(np
, "battery,temp_highlimit_threshold_lpm",
8561 pdata
->temp_highlimit_threshold_lpm
= (int)temp
;
8563 pr_info("%s : Temp highlimit threshold lpm is Empty\n", __func__
);
8565 ret
= of_property_read_u32(np
, "battery,temp_highlimit_recovery_lpm",
8567 pdata
->temp_highlimit_recovery_lpm
= (int)temp
;
8569 pr_info("%s : Temp highlimit recovery lpm is Empty\n", __func__
);
8571 ret
= of_property_read_u32(np
, "battery,temp_high_threshold_lpm",
8573 pdata
->temp_high_threshold_lpm
= (int)temp
;
8575 pr_info("%s : Temp high threshold lpm is Empty\n", __func__
);
8577 ret
= of_property_read_u32(np
, "battery,temp_high_recovery_lpm",
8579 pdata
->temp_high_recovery_lpm
= (int)temp
;
8581 pr_info("%s : Temp high recovery lpm is Empty\n", __func__
);
8583 ret
= of_property_read_u32(np
, "battery,temp_low_threshold_lpm",
8585 pdata
->temp_low_threshold_lpm
= (int)temp
;
8587 pr_info("%s : Temp low threshold lpm is Empty\n", __func__
);
8589 ret
= of_property_read_u32(np
, "battery,temp_low_recovery_lpm",
8591 pdata
->temp_low_recovery_lpm
= (int)temp
;
8593 pr_info("%s : Temp low recovery lpm is Empty\n", __func__
);
8595 pr_info("%s : HIGHLIMIT_THRESHOLD_NOLMAL(%d), HIGHLIMIT_RECOVERY_NORMAL(%d)\n"
8596 "HIGH_THRESHOLD_NORMAL(%d), HIGH_RECOVERY_NORMAL(%d) LOW_THRESHOLD_NORMAL(%d), LOW_RECOVERY_NORMAL(%d)\n"
8597 "HIGHLIMIT_THRESHOLD_LPM(%d), HIGHLIMIT_RECOVERY_LPM(%d)\n"
8598 "HIGH_THRESHOLD_LPM(%d), HIGH_RECOVERY_LPM(%d) LOW_THRESHOLD_LPM(%d), LOW_RECOVERY_LPM(%d)\n",
8600 pdata
->temp_highlimit_threshold_normal
, pdata
->temp_highlimit_recovery_normal
,
8601 pdata
->temp_high_threshold_normal
, pdata
->temp_high_recovery_normal
,
8602 pdata
->temp_low_threshold_normal
, pdata
->temp_low_recovery_normal
,
8603 pdata
->temp_highlimit_threshold_lpm
, pdata
->temp_highlimit_recovery_lpm
,
8604 pdata
->temp_high_threshold_lpm
, pdata
->temp_high_recovery_lpm
,
8605 pdata
->temp_low_threshold_lpm
, pdata
->temp_low_recovery_lpm
);
8607 ret
= of_property_read_u32(np
, "battery,wpc_high_threshold_normal",
8609 pdata
->wpc_high_threshold_normal
= (int)temp
;
8611 pr_info("%s : wpc_high_threshold_normal is Empty\n", __func__
);
8613 ret
= of_property_read_u32(np
, "battery,wpc_high_recovery_normal",
8615 pdata
->wpc_high_recovery_normal
= (int)temp
;
8617 pr_info("%s : wpc_high_recovery_normal is Empty\n", __func__
);
8619 ret
= of_property_read_u32(np
, "battery,wpc_low_threshold_normal",
8621 pdata
->wpc_low_threshold_normal
= (int)temp
;
8623 pr_info("%s : wpc_low_threshold_normal is Empty\n", __func__
);
8625 ret
= of_property_read_u32(np
, "battery,wpc_low_recovery_normal",
8627 pdata
->wpc_low_recovery_normal
= (int)temp
;
8629 pr_info("%s : wpc_low_recovery_normal is Empty\n", __func__
);
8631 ret
= of_property_read_u32(np
, "battery,full_check_type",
8632 &pdata
->full_check_type
);
8634 pr_info("%s : Full check type is Empty\n", __func__
);
8636 ret
= of_property_read_u32(np
, "battery,full_check_type_2nd",
8637 &pdata
->full_check_type_2nd
);
8639 pr_info("%s : Full check type 2nd is Empty\n", __func__
);
8641 ret
= of_property_read_u32(np
, "battery,full_check_count",
8642 &pdata
->full_check_count
);
8644 pr_info("%s : Full check count is Empty\n", __func__
);
8646 ret
= of_property_read_u32(np
, "battery,chg_gpio_full_check",
8647 &pdata
->chg_gpio_full_check
);
8649 pr_info("%s : Chg gpio full check is Empty\n", __func__
);
8651 ret
= of_property_read_u32(np
, "battery,chg_polarity_full_check",
8652 &pdata
->chg_polarity_full_check
);
8654 pr_info("%s : Chg polarity full check is Empty\n", __func__
);
8656 ret
= of_property_read_u32(np
, "battery,full_condition_type",
8657 &pdata
->full_condition_type
);
8659 pr_info("%s : Full condition type is Empty\n", __func__
);
8661 ret
= of_property_read_u32(np
, "battery,full_condition_soc",
8662 &pdata
->full_condition_soc
);
8664 pr_info("%s : Full condition soc is Empty\n", __func__
);
8666 ret
= of_property_read_u32(np
, "battery,full_condition_vcell",
8667 &pdata
->full_condition_vcell
);
8669 pr_info("%s : Full condition vcell is Empty\n", __func__
);
8671 ret
= of_property_read_u32(np
, "battery,recharge_check_count",
8672 &pdata
->recharge_check_count
);
8674 pr_info("%s : Recharge check count is Empty\n", __func__
);
8676 ret
= of_property_read_u32(np
, "battery,recharge_condition_type",
8677 &pdata
->recharge_condition_type
);
8679 pr_info("%s : Recharge condition type is Empty\n", __func__
);
8681 ret
= of_property_read_u32(np
, "battery,recharge_condition_soc",
8682 &pdata
->recharge_condition_soc
);
8684 pr_info("%s : Recharge condition soc is Empty\n", __func__
);
8686 ret
= of_property_read_u32(np
, "battery,recharge_condition_vcell",
8687 &pdata
->recharge_condition_vcell
);
8689 pr_info("%s : Recharge condition vcell is Empty\n", __func__
);
8691 ret
= of_property_read_u32(np
, "battery,charging_total_time",
8692 (unsigned int *)&pdata
->charging_total_time
);
8694 pr_info("%s : Charging total time is Empty\n", __func__
);
8696 ret
= of_property_read_u32(np
, "battery,hv_charging_total_time",
8697 &pdata
->hv_charging_total_time
);
8699 pdata
->hv_charging_total_time
= 3 * 60 * 60;
8700 pr_info("%s : HV Charging total time is %d\n",
8701 __func__
, pdata
->hv_charging_total_time
);
8704 ret
= of_property_read_u32(np
, "battery,normal_charging_total_time",
8705 &pdata
->normal_charging_total_time
);
8707 pdata
->normal_charging_total_time
= 5 * 60 * 60;
8708 pr_info("%s : Normal(WC) Charging total time is %d\n",
8709 __func__
, pdata
->normal_charging_total_time
);
8712 ret
= of_property_read_u32(np
, "battery,usb_charging_total_time",
8713 &pdata
->usb_charging_total_time
);
8715 pdata
->usb_charging_total_time
= 10 * 60 * 60;
8716 pr_info("%s : USB Charging total time is %d\n",
8717 __func__
, pdata
->usb_charging_total_time
);
8720 ret
= of_property_read_u32(np
, "battery,recharging_total_time",
8721 (unsigned int *)&pdata
->recharging_total_time
);
8723 pr_info("%s : Recharging total time is Empty\n", __func__
);
8725 ret
= of_property_read_u32(np
, "battery,charging_reset_time",
8726 (unsigned int *)&pdata
->charging_reset_time
);
8728 pr_info("%s : Charging reset time is Empty\n", __func__
);
8730 ret
= of_property_read_u32(np
, "battery,charging_reset_time",
8731 (unsigned int *)&pdata
->charging_reset_time
);
8733 pr_info("%s : Charging reset time is Empty\n", __func__
);
8735 ret
= of_property_read_u32(np
, "battery,chg_float_voltage",
8736 (unsigned int *)&pdata
->chg_float_voltage
);
8738 pr_info("%s: chg_float_voltage is Empty\n", __func__
);
8739 pdata
->chg_float_voltage
= 43500;
8742 ret
= of_property_read_u32(np
, "battery,chg_float_voltage_conv",
8743 &pdata
->chg_float_voltage_conv
);
8745 pr_info("%s: chg_float_voltage_conv is Empty\n", __func__
);
8746 pdata
->chg_float_voltage_conv
= 1;
8749 ret
= of_property_read_u32(np
, "battery,wa_volt_recov",
8750 (unsigned int *)&pdata
->wa_volt_recov
);
8752 pdata
->wa_volt_recov
= 4090;
8753 pr_info("%s: wa volt recov is Empty\n", __func__
);
8756 ret
= of_property_read_u32(np
, "battery,wa_volt_thr",
8757 (unsigned int *)&pdata
->wa_volt_thr
);
8759 pdata
->wa_volt_thr
= 4100;
8760 pr_info("%s: wa volt thr is Empty\n", __func__
);
8763 ret
= of_property_read_u32(np
, "battery,wa_float_voltage",
8764 (unsigned int *)&pdata
->wa_float_voltage
);
8766 pdata
->wa_float_voltage
= 40500;
8767 pr_info("%s: wa float voltage is Empty\n", __func__
);
8770 ret
= of_property_read_u32(np
, "battery,wa_fl_check_count",
8771 &pdata
->wa_fl_check_count
);
8773 pdata
->wa_fl_check_count
= 3;
8774 pr_info("%s : swelling fl check count is Empty\n", __func__
);
8777 #if defined(CONFIG_BATTERY_SWELLING)
8778 ret
= of_property_read_u32(np
, "battery,chg_float_voltage",
8779 (unsigned int *)&pdata
->swelling_normal_float_voltage
);
8781 pr_info("%s: chg_float_voltage is Empty\n", __func__
);
8783 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_block",
8785 pdata
->swelling_high_temp_block
= (int)temp
;
8787 pr_info("%s: swelling high temp block is Empty\n", __func__
);
8789 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_recov",
8791 pdata
->swelling_high_temp_recov
= (int)temp
;
8793 pr_info("%s: swelling high temp recovery is Empty\n", __func__
);
8795 ret
= of_property_read_u32(np
, "battery,swelling_wc_high_temp_recov",
8797 pdata
->swelling_wc_high_temp_recov
= (int)temp
;
8799 pdata
->swelling_wc_high_temp_recov
= pdata
->swelling_high_temp_recov
;
8800 pr_info("%s: swelling wireless high temp recovery is %d\n", __func__
, pdata
->swelling_wc_high_temp_recov
);
8803 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_block_1st",
8805 pdata
->swelling_low_temp_block_1st
= (int)temp
;
8807 pr_info("%s: swelling low temp block is Empty\n", __func__
);
8809 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_recov_1st",
8811 pdata
->swelling_low_temp_recov_1st
= (int)temp
;
8813 pr_info("%s: swelling low temp recovery is Empty\n", __func__
);
8815 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_block_2nd",
8817 pdata
->swelling_low_temp_block_2nd
= (int)temp
;
8819 pr_info("%s: swelling low temp block is Empty\n", __func__
);
8821 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_recov_2nd",
8823 pdata
->swelling_low_temp_recov_2nd
= (int)temp
;
8825 pr_info("%s: swelling low temp recovery 2nd is Empty\n", __func__
);
8827 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_current",
8828 &pdata
->swelling_low_temp_current
);
8830 pr_info("%s: swelling_low_temp_current is Empty, Defualt value 600mA \n", __func__
);
8831 pdata
->swelling_low_temp_current
= 600;
8834 ret
= of_property_read_u32(np
, "battery,swelling_low_temp_topoff",
8835 &pdata
->swelling_low_temp_topoff
);
8837 pr_info("%s: swelling_low_temp_topoff is Empty, Defualt value 200mA \n", __func__
);
8838 pdata
->swelling_low_temp_topoff
= 200;
8841 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_current",
8842 &pdata
->swelling_high_temp_current
);
8844 pr_info("%s: swelling_low_temp_current is Empty, Defualt value 1300mA \n", __func__
);
8845 pdata
->swelling_high_temp_current
= 1300;
8848 ret
= of_property_read_u32(np
, "battery,swelling_high_temp_topoff",
8849 &pdata
->swelling_high_temp_topoff
);
8851 pr_info("%s: swelling_high_temp_topoff is Empty, Defualt value 200mA \n", __func__
);
8852 pdata
->swelling_high_temp_topoff
= 200;
8855 ret
= of_property_read_u32(np
, "battery,swelling_wc_high_temp_current",
8856 &pdata
->swelling_wc_high_temp_current
);
8858 pr_info("%s: swelling_wc_high_temp_current is Empty, Defualt value 600mA \n", __func__
);
8859 pdata
->swelling_low_temp_current
= 600;
8862 ret
= of_property_read_u32(np
, "battery,swelling_wc_low_temp_current",
8863 &pdata
->swelling_wc_low_temp_current
);
8865 pr_info("%s: swelling_wc_low_temp_current is Empty, Defualt value 600mA \n", __func__
);
8866 pdata
->swelling_low_temp_current
= 600;
8869 ret
= of_property_read_u32(np
, "battery,swelling_drop_float_voltage",
8870 (unsigned int *)&pdata
->swelling_drop_float_voltage
);
8872 pr_info("%s: swelling drop float voltage is Empty, Default value 4250mV \n", __func__
);
8873 pdata
->swelling_drop_float_voltage
= 4250;
8874 pdata
->swelling_drop_voltage_condition
= 4250;
8876 pdata
->swelling_drop_voltage_condition
= (pdata
->swelling_drop_float_voltage
> 10000) ?
8877 (pdata
->swelling_drop_float_voltage
/ 10) : (pdata
->swelling_drop_float_voltage
);
8878 pr_info("%s : swelling drop voltage(set : %d, condition : %d)\n", __func__
,
8879 pdata
->swelling_drop_float_voltage
, pdata
->swelling_drop_voltage_condition
);
8882 ret
= of_property_read_u32(np
, "battery,swelling_high_rechg_voltage",
8883 (unsigned int *)&pdata
->swelling_high_rechg_voltage
);
8885 pr_info("%s: swelling_high_rechg_voltage is Empty\n", __func__
);
8886 pdata
->swelling_high_rechg_voltage
= 4150;
8889 ret
= of_property_read_u32(np
, "battery,swelling_low_rechg_voltage",
8890 (unsigned int *)&pdata
->swelling_low_rechg_voltage
);
8892 pr_info("%s: swelling_low_rechg_voltage is Empty\n", __func__
);
8893 pdata
->swelling_low_rechg_voltage
= 4000;
8896 pr_info("%s : SWELLING_HIGH_TEMP(%d) SWELLING_HIGH_TEMP_RECOVERY(%d)\n"
8897 "SWELLING_LOW_TEMP_1st(%d) SWELLING_LOW_TEMP_RECOVERY_1st(%d) "
8898 "SWELLING_LOW_TEMP_2nd(%d) SWELLING_LOW_TEMP_RECOVERY_2nd(%d) "
8899 "SWELLING_LOW_CURRENT(%d, %d), SWELLING_HIGH_CURRENT(%d, %d)\n"
8900 "SWELLING_LOW_RCHG_VOL(%d), SWELLING_HIGH_RCHG_VOL(%d)\n",
8901 __func__
, pdata
->swelling_high_temp_block
, pdata
->swelling_high_temp_recov
,
8902 pdata
->swelling_low_temp_block_1st
, pdata
->swelling_low_temp_recov_1st
,
8903 pdata
->swelling_low_temp_block_2nd
, pdata
->swelling_low_temp_recov_2nd
,
8904 pdata
->swelling_low_temp_current
, pdata
->swelling_low_temp_topoff
,
8905 pdata
->swelling_high_temp_current
, pdata
->swelling_high_temp_topoff
,
8906 pdata
->swelling_low_rechg_voltage
, pdata
->swelling_high_rechg_voltage
);
8909 #if defined(CONFIG_CALC_TIME_TO_FULL)
8910 ret
= of_property_read_u32(np
, "battery,ttf_hv_12v_charge_current",
8911 &pdata
->ttf_hv_12v_charge_current
);
8913 pdata
->ttf_hv_12v_charge_current
=
8914 pdata
->charging_current
[SEC_BATTERY_CABLE_12V_TA
].fast_charging_current
;
8915 pr_info("%s: ttf_hv_12v_charge_current is Empty, Defualt value %d \n",
8916 __func__
, pdata
->ttf_hv_12v_charge_current
);
8918 ret
= of_property_read_u32(np
, "battery,ttf_hv_charge_current",
8919 &pdata
->ttf_hv_charge_current
);
8921 pdata
->ttf_hv_charge_current
=
8922 pdata
->charging_current
[SEC_BATTERY_CABLE_9V_TA
].fast_charging_current
;
8923 pr_info("%s: ttf_hv_charge_current is Empty, Defualt value %d \n",
8924 __func__
, pdata
->ttf_hv_charge_current
);
8927 ret
= of_property_read_u32(np
, "battery,ttf_hv_wireless_charge_current",
8928 &pdata
->ttf_hv_wireless_charge_current
);
8930 pr_info("%s: ttf_hv_wireless_charge_current is Empty, Defualt value 0 \n", __func__
);
8931 pdata
->ttf_hv_wireless_charge_current
=
8932 pdata
->charging_current
[SEC_BATTERY_CABLE_HV_WIRELESS
].fast_charging_current
- 300;
8935 ret
= of_property_read_u32(np
, "battery,ttf_wireless_charge_current",
8936 &pdata
->ttf_wireless_charge_current
);
8938 pr_info("%s: ttf_wireless_charge_current is Empty, Defualt value 0 \n", __func__
);
8939 pdata
->ttf_wireless_charge_current
=
8940 pdata
->charging_current
[SEC_BATTERY_CABLE_WIRELESS
].input_current_limit
;
8944 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
8946 ret
= pdata
->wpc_det
= of_get_named_gpio(np
, "battery,wpc_det", 0);
8948 pr_info("%s : can't get wpc_det\n", __func__
);
8953 ret
= pdata
->wpc_en
= of_get_named_gpio(np
, "battery,wpc_en", 0);
8955 pr_info("%s : can't get wpc_en\n", __func__
);
8958 #if defined(CONFIG_BATTERY_AGE_FORECAST)
8959 p
= of_get_property(np
, "battery,age_data", &len
);
8961 battery
->pdata
->num_age_step
= len
/ sizeof(sec_age_data_t
);
8962 battery
->pdata
->age_data
= kzalloc(len
, GFP_KERNEL
);
8963 ret
= of_property_read_u32_array(np
, "battery,age_data",
8964 (u32
*)battery
->pdata
->age_data
, len
/sizeof(u32
));
8966 pr_err("%s failed to read battery->pdata->age_data: %d\n",
8968 kfree(battery
->pdata
->age_data
);
8969 battery
->pdata
->age_data
= NULL
;
8970 battery
->pdata
->num_age_step
= 0;
8972 pr_err("%s num_age_step : %d\n", __func__
, battery
->pdata
->num_age_step
);
8973 for (len
= 0; len
< battery
->pdata
->num_age_step
; ++len
) {
8974 pr_err("[%d/%d]cycle:%d, float:%d, full_v:%d, recharge_v:%d, soc:%d\n",
8975 len
, battery
->pdata
->num_age_step
-1,
8976 battery
->pdata
->age_data
[len
].cycle
,
8977 battery
->pdata
->age_data
[len
].float_voltage
,
8978 battery
->pdata
->age_data
[len
].full_condition_vcell
,
8979 battery
->pdata
->age_data
[len
].recharge_condition_vcell
,
8980 battery
->pdata
->age_data
[len
].full_condition_soc
);
8983 battery
->pdata
->num_age_step
= 0;
8984 pr_err("%s there is not age_data\n", __func__
);
8988 ret
= of_property_read_u32(np
, "battery,siop_input_limit_current",
8989 &pdata
->siop_input_limit_current
);
8991 pdata
->siop_input_limit_current
= SIOP_INPUT_LIMIT_CURRENT
;
8993 ret
= of_property_read_u32(np
, "battery,siop_charging_limit_current",
8994 &pdata
->siop_charging_limit_current
);
8996 pdata
->siop_charging_limit_current
= SIOP_CHARGING_LIMIT_CURRENT
;
8998 ret
= of_property_read_u32(np
, "battery,siop_hv_12v_input_limit_current",
8999 &pdata
->siop_hv_12v_input_limit_current
);
9001 pdata
->siop_hv_12v_input_limit_current
= SIOP_HV_12V_INPUT_LIMIT_CURRENT
;
9003 ret
= of_property_read_u32(np
, "battery,siop_hv_12v_charging_limit_current",
9004 &pdata
->siop_hv_12v_charging_limit_current
);
9006 pdata
->siop_hv_12v_charging_limit_current
= SIOP_HV_12V_CHARGING_LIMIT_CURRENT
;
9008 ret
= of_property_read_u32(np
, "battery,siop_hv_input_limit_current",
9009 &pdata
->siop_hv_input_limit_current
);
9011 pdata
->siop_hv_input_limit_current
= SIOP_HV_INPUT_LIMIT_CURRENT
;
9013 ret
= of_property_read_u32(np
, "battery,siop_hv_charging_limit_current",
9014 &pdata
->siop_hv_charging_limit_current
);
9016 pdata
->siop_hv_charging_limit_current
= SIOP_HV_CHARGING_LIMIT_CURRENT
;
9018 ret
= of_property_read_u32(np
, "battery,siop_wireless_input_limit_current",
9019 &pdata
->siop_wireless_input_limit_current
);
9021 pdata
->siop_wireless_input_limit_current
= SIOP_WIRELESS_INPUT_LIMIT_CURRENT
;
9023 ret
= of_property_read_u32(np
, "battery,siop_wireless_charging_limit_current",
9024 &pdata
->siop_wireless_charging_limit_current
);
9026 pdata
->siop_wireless_charging_limit_current
= SIOP_WIRELESS_CHARGING_LIMIT_CURRENT
;
9028 ret
= of_property_read_u32(np
, "battery,siop_hv_wireless_input_limit_current",
9029 &pdata
->siop_hv_wireless_input_limit_current
);
9031 pdata
->siop_hv_wireless_input_limit_current
= SIOP_HV_WIRELESS_INPUT_LIMIT_CURRENT
;
9033 ret
= of_property_read_u32(np
, "battery,siop_hv_wireless_charging_limit_current",
9034 &pdata
->siop_hv_wireless_charging_limit_current
);
9036 pdata
->siop_hv_wireless_charging_limit_current
= SIOP_HV_WIRELESS_CHARGING_LIMIT_CURRENT
;
9038 ret
= of_property_read_u32(np
, "battery,max_input_voltage",
9039 &pdata
->max_input_voltage
);
9041 pdata
->max_input_voltage
= 12000;
9043 ret
= of_property_read_u32(np
, "battery,max_input_current",
9044 &pdata
->max_input_current
);
9046 pdata
->max_input_current
= 3000;
9048 ret
= of_property_read_u32(np
, "battery,pd_charging_charge_power",
9049 &pdata
->pd_charging_charge_power
);
9051 pr_err("%s: pd_charging_charge_power is Empty\n", __func__
);
9052 pdata
->pd_charging_charge_power
= 15000;
9055 ret
= of_property_read_u32(np
, "battery,nv_charge_power",
9056 &pdata
->nv_charge_power
);
9058 pr_err("%s: nv_charge_power is Empty\n", __func__
);
9059 pdata
->nv_charge_power
=
9060 SEC_INPUT_VOLTAGE_5V
* pdata
->default_input_current
;
9063 pr_info("%s: vendor : %s, technology : %d, cable_check_type : %d\n"
9064 "cable_source_type : %d, event_waiting_time : %d\n"
9065 "polling_type : %d, initial_count : %d, check_count : %d\n"
9066 "check_adc_max : %d, check_adc_min : %d\n"
9067 "ovp_uvlo_check_type : %d, thermal_source : %d\n"
9068 "temp_check_type : %d, temp_check_count : %d, nv_charge_power : %d\n",
9070 pdata
->vendor
, pdata
->technology
,pdata
->cable_check_type
,
9071 pdata
->cable_source_type
, pdata
->event_waiting_time
,
9072 pdata
->polling_type
, pdata
->monitor_initial_count
,
9073 pdata
->check_count
, pdata
->check_adc_max
, pdata
->check_adc_min
,
9074 pdata
->ovp_uvlo_check_type
, pdata
->thermal_source
,
9075 pdata
->temp_check_type
, pdata
->temp_check_count
, pdata
->nv_charge_power
);
9077 #if defined(CONFIG_STEP_CHARGING)
9078 sec_step_charging_init(battery
, dev
);
9080 ret
= of_property_read_u32(np
, "battery,max_charging_current",
9081 &pdata
->max_charging_current
);
9083 pr_err("%s: max_charging_current is Empty\n", __func__
);
9084 pdata
->max_charging_current
= 3000;
9091 static void sec_bat_parse_mode_dt(struct sec_battery_info
*battery
)
9093 struct device_node
*np
;
9094 sec_battery_platform_data_t
*pdata
= battery
->pdata
;
9098 np
= of_find_node_by_name(NULL
, "battery");
9100 pr_err("%s np NULL\n", __func__
);
9104 if (battery
->store_mode
) {
9105 ret
= of_property_read_u32(np
, "battery,store_mode_afc_input_current",
9106 &pdata
->store_mode_afc_input_current
);
9108 pr_info("%s : store_mode_afc_input_current is Empty\n", __func__
);
9109 pdata
->store_mode_afc_input_current
= 440;
9112 ret
= of_property_read_u32(np
, "battery,store_mode_hv_wireless_input_current",
9113 &pdata
->store_mode_hv_wireless_input_current
);
9115 pr_info("%s : store_mode_hv_wireless_input_current is Empty\n", __func__
);
9116 pdata
->store_mode_hv_wireless_input_current
= 400;
9119 if (pdata
->wpc_temp_check
) {
9120 ret
= of_property_read_u32(np
, "battery,wpc_store_high_temp",
9123 pdata
->wpc_high_temp
= temp
;
9125 ret
= of_property_read_u32(np
, "battery,wpc_store_high_temp_recovery",
9128 pdata
->wpc_high_temp_recovery
= temp
;
9130 ret
= of_property_read_u32(np
, "battery,wpc_store_charging_limit_current",
9133 pdata
->wpc_charging_limit_current
= temp
;
9135 ret
= of_property_read_u32(np
, "battery,wpc_store_lcd_on_high_temp",
9138 pdata
->wpc_lcd_on_high_temp
= (int)temp
;
9140 ret
= of_property_read_u32(np
, "battery,wpc_store_lcd_on_high_temp_rec",
9143 pdata
->wpc_lcd_on_high_temp_rec
= (int)temp
;
9145 pr_info("%s: update store_mode - wpc high_temp(t:%d, r:%d), lcd_on_high_temp(t:%d, r:%d), curr(%d)\n",
9147 pdata
->wpc_high_temp
, pdata
->wpc_high_temp_recovery
,
9148 pdata
->wpc_lcd_on_high_temp
, pdata
->wpc_lcd_on_high_temp_rec
,
9149 pdata
->wpc_charging_limit_current
);
9152 ret
= of_property_read_u32(np
, "battery,siop_store_hv_wireless_input_limit_current",
9155 pdata
->siop_hv_wireless_input_limit_current
= temp
;
9157 pdata
->siop_hv_wireless_input_limit_current
= SIOP_STORE_HV_WIRELESS_CHARGING_LIMIT_CURRENT
;
9158 pr_info("%s: update siop_hv_wireless_input_limit_current(%d)\n",
9159 __func__
, pdata
->siop_hv_wireless_input_limit_current
);
9163 static void sec_bat_parse_mode_dt_work(struct work_struct
*work
)
9165 struct sec_battery_info
*battery
= container_of(work
,
9166 struct sec_battery_info
, parse_mode_dt_work
.work
);
9168 sec_bat_parse_mode_dt(battery
);
9170 if (is_hv_wire_type(battery
->cable_type
) ||
9171 is_hv_wireless_type(battery
->cable_type
)) {
9172 sec_bat_set_charging_current(battery
);
9175 wake_unlock(&battery
->parse_mode_dt_wake_lock
);
9180 extern sec_battery_platform_data_t sec_battery_pdata
;
9183 #if !defined(CONFIG_MUIC_NOTIFIER)
9184 static void cable_initial_check(struct sec_battery_info
*battery
)
9186 union power_supply_propval value
;
9188 pr_info("%s : current_cable_type : (%d)\n", __func__
, battery
->cable_type
);
9190 if (SEC_BATTERY_CABLE_NONE
!= battery
->cable_type
) {
9191 if (battery
->cable_type
== SEC_BATTERY_CABLE_POWER_SHARING
) {
9192 value
.intval
= battery
->cable_type
;
9193 psy_do_property("ps", set
,
9194 POWER_SUPPLY_PROP_ONLINE
, value
);
9196 value
.intval
= battery
->cable_type
;
9197 psy_do_property("battery", set
,
9198 POWER_SUPPLY_PROP_ONLINE
, value
);
9201 psy_do_property(battery
->pdata
->charger_name
, get
,
9202 POWER_SUPPLY_PROP_ONLINE
, value
);
9203 if (value
.intval
== SEC_BATTERY_CABLE_WIRELESS
) {
9205 psy_do_property("wireless", set
,
9206 POWER_SUPPLY_PROP_ONLINE
, value
);
9212 static void sec_bat_init_chg_work(struct work_struct
*work
)
9214 struct sec_battery_info
*battery
= container_of(work
,
9215 struct sec_battery_info
, init_chg_work
.work
);
9217 if (battery
->cable_type
== SEC_BATTERY_CABLE_NONE
&&
9218 !(battery
->misc_event
& BATT_MISC_EVENT_UNDEFINED_RANGE_TYPE
)) {
9219 pr_info("%s: disable charging\n", __func__
);
9220 sec_bat_set_charge(battery
, SEC_BAT_CHG_MODE_CHARGING_OFF
);
9224 static const struct power_supply_desc battery_power_supply_desc
= {
9226 .type
= POWER_SUPPLY_TYPE_BATTERY
,
9227 .properties
= sec_battery_props
,
9228 .num_properties
= ARRAY_SIZE(sec_battery_props
),
9229 .get_property
= sec_bat_get_property
,
9230 .set_property
= sec_bat_set_property
,
9233 static const struct power_supply_desc usb_power_supply_desc
= {
9235 .type
= POWER_SUPPLY_TYPE_USB
,
9236 .properties
= sec_power_props
,
9237 .num_properties
= ARRAY_SIZE(sec_power_props
),
9238 .get_property
= sec_usb_get_property
,
9241 static const struct power_supply_desc ac_power_supply_desc
= {
9243 .type
= POWER_SUPPLY_TYPE_MAINS
,
9244 .properties
= sec_ac_props
,
9245 .num_properties
= ARRAY_SIZE(sec_ac_props
),
9246 .get_property
= sec_ac_get_property
,
9249 static const struct power_supply_desc wireless_power_supply_desc
= {
9251 .type
= POWER_SUPPLY_TYPE_WIRELESS
,
9252 .properties
= sec_wireless_props
,
9253 .num_properties
= ARRAY_SIZE(sec_wireless_props
),
9254 .get_property
= sec_wireless_get_property
,
9255 .set_property
= sec_wireless_set_property
,
9258 static const struct power_supply_desc ps_power_supply_desc
= {
9260 .type
= POWER_SUPPLY_TYPE_POWER_SHARING
,
9261 .properties
= sec_ps_props
,
9262 .num_properties
= ARRAY_SIZE(sec_ps_props
),
9263 .get_property
= sec_ps_get_property
,
9264 .set_property
= sec_ps_set_property
,
9267 static int sec_battery_probe(struct platform_device
*pdev
)
9269 sec_battery_platform_data_t
*pdata
= NULL
;
9270 struct sec_battery_info
*battery
;
9271 struct power_supply_config battery_cfg
= {};
9278 union power_supply_propval value
= {0, };
9280 dev_info(&pdev
->dev
,
9281 "%s: SEC Battery Driver Loading\n", __func__
);
9283 battery
= kzalloc(sizeof(*battery
), GFP_KERNEL
);
9287 if (pdev
->dev
.of_node
) {
9288 pdata
= devm_kzalloc(&pdev
->dev
,
9289 sizeof(sec_battery_platform_data_t
),
9292 dev_err(&pdev
->dev
, "Failed to allocate memory\n");
9297 battery
->pdata
= pdata
;
9299 if (sec_bat_parse_dt(&pdev
->dev
, battery
)) {
9301 "%s: Failed to get battery dt\n", __func__
);
9306 pdata
= dev_get_platdata(&pdev
->dev
);
9307 battery
->pdata
= pdata
;
9310 platform_set_drvdata(pdev
, battery
);
9312 battery
->dev
= &pdev
->dev
;
9314 mutex_init(&battery
->adclock
);
9315 mutex_init(&battery
->iolock
);
9316 mutex_init(&battery
->misclock
);
9317 mutex_init(&battery
->batt_handlelock
);
9318 mutex_init(&battery
->current_eventlock
);
9319 mutex_init(&battery
->typec_notylock
);
9320 mutex_init(&battery
->wclock
);
9321 #if defined(CONFIG_BATTERY_SBM_DATA)
9322 mutex_init(&battery
->sbmlock
);
9323 sec_bat_init_sbm(battery
);
9326 dev_dbg(battery
->dev
, "%s: ADC init\n", __func__
);
9329 adc_init(pdev
, battery
);
9331 for (i
= 0; i
< SEC_BAT_ADC_CHANNEL_NUM
; i
++)
9332 adc_init(pdev
, pdata
, i
);
9334 wake_lock_init(&battery
->monitor_wake_lock
, WAKE_LOCK_SUSPEND
,
9335 "sec-battery-monitor");
9336 wake_lock_init(&battery
->cable_wake_lock
, WAKE_LOCK_SUSPEND
,
9337 "sec-battery-cable");
9338 wake_lock_init(&battery
->vbus_wake_lock
, WAKE_LOCK_SUSPEND
,
9339 "sec-battery-vbus");
9340 wake_lock_init(&battery
->afc_wake_lock
, WAKE_LOCK_SUSPEND
,
9342 wake_lock_init(&battery
->siop_level_wake_lock
, WAKE_LOCK_SUSPEND
,
9343 "sec-battery-siop_level");
9344 wake_lock_init(&battery
->ext_event_wake_lock
, WAKE_LOCK_SUSPEND
,
9345 "sec-battery-ext_event");
9346 wake_lock_init(&battery
->wc_headroom_wake_lock
, WAKE_LOCK_SUSPEND
,
9347 "sec-battery-wc_headroom");
9348 #if defined(CONFIG_UPDATE_BATTERY_DATA)
9349 wake_lock_init(&battery
->batt_data_wake_lock
, WAKE_LOCK_SUSPEND
,
9350 "sec-battery-update-data");
9352 wake_lock_init(&battery
->misc_event_wake_lock
, WAKE_LOCK_SUSPEND
,
9353 "sec-battery-misc-event");
9355 wake_lock_init(&battery
->parse_mode_dt_wake_lock
, WAKE_LOCK_SUSPEND
,
9356 "sec-battery-parse_mode_dt");
9359 /* initialization of battery info */
9360 sec_bat_set_charging_status(battery
,
9361 POWER_SUPPLY_STATUS_DISCHARGING
);
9362 battery
->health
= POWER_SUPPLY_HEALTH_GOOD
;
9363 battery
->present
= true;
9364 battery
->is_jig_on
= false;
9365 battery
->wdt_kick_disable
= 0;
9367 battery
->polling_count
= 1; /* initial value = 1 */
9368 battery
->polling_time
= pdata
->polling_time
[
9369 SEC_BATTERY_POLLING_TIME_DISCHARGING
];
9370 battery
->polling_in_sleep
= false;
9371 battery
->polling_short
= false;
9373 battery
->check_count
= 0;
9374 battery
->check_adc_count
= 0;
9375 battery
->check_adc_value
= 0;
9377 battery
->input_current
= 0;
9378 battery
->charging_current
= 0;
9379 battery
->topoff_current
= 0;
9380 battery
->wpc_vout_level
= WIRELESS_VOUT_10V
;
9381 battery
->charging_start_time
= 0;
9382 battery
->charging_passed_time
= 0;
9383 battery
->wc_heating_start_time
= 0;
9384 battery
->wc_heating_passed_time
= 0;
9385 battery
->charging_next_time
= 0;
9386 battery
->charging_fullcharged_time
= 0;
9387 battery
->siop_level
= 100;
9388 battery
->ext_event
= BATT_EXT_EVENT_NONE
;
9389 battery
->wc_enable
= 1;
9390 battery
->wc_enable_cnt
= 0;
9391 battery
->wc_enable_cnt_value
= 3;
9392 #if defined(CONFIG_ENG_BATTERY_CONCEPT)
9393 battery
->stability_test
= 0;
9394 battery
->eng_not_full_status
= 0;
9395 battery
->temperature_test_battery
= 0x7FFF;
9396 battery
->temperature_test_usb
= 0x7FFF;
9397 battery
->temperature_test_wpc
= 0x7FFF;
9398 battery
->temperature_test_chg
= 0x7FFF;
9400 battery
->ps_enable
= false;
9401 battery
->wc_status
= SEC_WIRELESS_PAD_NONE
;
9402 battery
->wc_cv_mode
= false;
9403 battery
->wire_status
= SEC_BATTERY_CABLE_NONE
;
9405 #if defined(CONFIG_BATTERY_SWELLING)
9406 battery
->swelling_mode
= SWELLING_MODE_NONE
;
9408 battery
->charging_block
= false;
9409 battery
->chg_limit
= false;
9410 battery
->mix_limit
= false;
9411 battery
->vbus_limit
= false;
9412 battery
->usb_temp
= 0;
9413 #if defined(CONFIG_ENG_BATTERY_CONCEPT) || defined(CONFIG_SEC_FACTORY)
9414 battery
->cooldown_mode
= true;
9416 battery
->skip_swelling
= false;
9417 battery
->led_cover
= 0;
9418 battery
->wa_float_cnt
= 0;
9419 battery
->wc_rx_phm_mode
= false;
9421 sec_bat_set_current_event(battery
, SEC_BAT_CURRENT_EVENT_USB_100MA
, SEC_BAT_CURRENT_EVENT_USB_100MA
);
9424 battery
->temp_highlimit_threshold
=
9425 battery
->pdata
->temp_highlimit_threshold_lpm
;
9426 battery
->temp_highlimit_recovery
=
9427 battery
->pdata
->temp_highlimit_recovery_lpm
;
9428 battery
->temp_high_threshold
=
9429 battery
->pdata
->temp_high_threshold_lpm
;
9430 battery
->temp_high_recovery
=
9431 battery
->pdata
->temp_high_recovery_lpm
;
9432 battery
->temp_low_recovery
=
9433 battery
->pdata
->temp_low_recovery_lpm
;
9434 battery
->temp_low_threshold
=
9435 battery
->pdata
->temp_low_threshold_lpm
;
9437 battery
->temp_highlimit_threshold
=
9438 battery
->pdata
->temp_highlimit_threshold_normal
;
9439 battery
->temp_highlimit_recovery
=
9440 battery
->pdata
->temp_highlimit_recovery_normal
;
9441 battery
->temp_high_threshold
=
9442 battery
->pdata
->temp_high_threshold_normal
;
9443 battery
->temp_high_recovery
=
9444 battery
->pdata
->temp_high_recovery_normal
;
9445 battery
->temp_low_recovery
=
9446 battery
->pdata
->temp_low_recovery_normal
;
9447 battery
->temp_low_threshold
=
9448 battery
->pdata
->temp_low_threshold_normal
;
9451 battery
->charging_mode
= SEC_BATTERY_CHARGING_NONE
;
9452 battery
->is_recharging
= false;
9453 battery
->cable_type
= SEC_BATTERY_CABLE_NONE
;
9454 battery
->test_mode
= 0;
9455 battery
->factory_mode
= false;
9456 battery
->store_mode
= false;
9457 battery
->slate_mode
= false;
9458 battery
->is_hc_usb
= false;
9459 battery
->is_sysovlo
= false;
9460 battery
->is_vbatovlo
= false;
9461 battery
->is_abnormal_temp
= false;
9463 battery
->safety_timer_set
= true;
9464 battery
->stop_timer
= false;
9465 battery
->prev_safety_time
= 0;
9466 battery
->lcd_status
= false;
9468 #if defined(CONFIG_BATTERY_CISD)
9469 battery
->usb_overheat_check
= false;
9470 battery
->skip_cisd
= false;
9473 #if defined(CONFIG_BATTERY_AGE_FORECAST)
9474 battery
->batt_cycle
= -1;
9475 battery
->pdata
->age_step
= 0;
9478 battery
->health_change
= false;
9480 /* Check High Voltage charging option for wireless charging */
9481 /* '1' means disabling High Voltage charging */
9482 if (charging_night_mode
== '1')
9487 /* Check High Voltage charging option for wired charging */
9488 if (get_afc_mode() == CH_MODE_AFC_DISABLE_VAL
) {
9489 pr_info("HV wired charging mode is disabled\n");
9490 sec_bat_set_current_event(battery
,
9491 SEC_BAT_CURRENT_EVENT_HV_DISABLE
, SEC_BAT_CURRENT_EVENT_HV_DISABLE
);
9494 #if defined(CONFIG_BATTERY_SBM_DATA)
9495 battery
->sbm_data
= false;
9498 #if defined(CONFIG_CALC_TIME_TO_FULL)
9499 battery
->timetofull
= -1;
9502 if (battery
->pdata
->charger_name
== NULL
)
9503 battery
->pdata
->charger_name
= "sec-charger";
9504 if (battery
->pdata
->fuelgauge_name
== NULL
)
9505 battery
->pdata
->fuelgauge_name
= "sec-fuelgauge";
9507 /* create work queue */
9508 battery
->monitor_wqueue
=
9509 create_singlethread_workqueue(dev_name(&pdev
->dev
));
9510 if (!battery
->monitor_wqueue
) {
9511 dev_err(battery
->dev
,
9512 "%s: Fail to Create Workqueue\n", __func__
);
9516 INIT_DELAYED_WORK(&battery
->monitor_work
, sec_bat_monitor_work
);
9517 INIT_DELAYED_WORK(&battery
->cable_work
, sec_bat_cable_work
);
9518 #if defined(CONFIG_CALC_TIME_TO_FULL)
9519 INIT_DELAYED_WORK(&battery
->timetofull_work
, sec_bat_time_to_full_work
);
9521 INIT_DELAYED_WORK(&battery
->slowcharging_work
, sec_bat_check_slowcharging_work
);
9522 INIT_DELAYED_WORK(&battery
->afc_work
, sec_bat_afc_work
);
9523 INIT_DELAYED_WORK(&battery
->ext_event_work
, sec_bat_ext_event_work
);
9524 INIT_DELAYED_WORK(&battery
->siop_level_work
, sec_bat_siop_level_work
);
9525 INIT_DELAYED_WORK(&battery
->wc_headroom_work
, sec_bat_wc_headroom_work
);
9526 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
9527 INIT_DELAYED_WORK(&battery
->fw_init_work
, sec_bat_fw_init_work
);
9529 #if defined(CONFIG_UPDATE_BATTERY_DATA)
9530 INIT_DELAYED_WORK(&battery
->batt_data_work
, sec_bat_update_data_work
);
9532 INIT_DELAYED_WORK(&battery
->misc_event_work
, sec_bat_misc_event_work
);
9534 INIT_DELAYED_WORK(&battery
->parse_mode_dt_work
, sec_bat_parse_mode_dt_work
);
9536 INIT_DELAYED_WORK(&battery
->init_chg_work
, sec_bat_init_chg_work
);
9538 switch (pdata
->polling_type
) {
9539 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9540 INIT_DELAYED_WORK(&battery
->polling_work
,
9541 sec_bat_polling_work
);
9543 case SEC_BATTERY_MONITOR_ALARM
:
9544 battery
->last_poll_time
= ktime_get_boottime();
9545 alarm_init(&battery
->polling_alarm
, ALARM_BOOTTIME
,
9552 #if defined(CONFIG_BATTERY_CISD)
9553 sec_battery_cisd_init(battery
);
9556 battery_cfg
.drv_data
= battery
;
9558 /* init power supplier framework */
9559 battery
->psy_ps
= power_supply_register(&pdev
->dev
, &ps_power_supply_desc
, &battery_cfg
);
9560 if (!battery
->psy_ps
) {
9561 dev_err(battery
->dev
,
9562 "%s: Failed to Register psy_ps\n", __func__
);
9565 battery
->psy_ps
->supplied_to
= supply_list
;
9566 battery
->psy_ps
->num_supplicants
= ARRAY_SIZE(supply_list
);
9568 battery
->psy_wireless
= power_supply_register(&pdev
->dev
, &wireless_power_supply_desc
, &battery_cfg
);
9569 if (!battery
->psy_wireless
) {
9570 dev_err(battery
->dev
,
9571 "%s: Failed to Register psy_wireless\n", __func__
);
9572 goto err_supply_unreg_ps
;
9574 battery
->psy_wireless
->supplied_to
= supply_list
;
9575 battery
->psy_wireless
->num_supplicants
= ARRAY_SIZE(supply_list
);
9577 battery
->psy_usb
= power_supply_register(&pdev
->dev
, &usb_power_supply_desc
, &battery_cfg
);
9578 if (!battery
->psy_usb
) {
9579 dev_err(battery
->dev
,
9580 "%s: Failed to Register psy_usb\n", __func__
);
9581 goto err_supply_unreg_wireless
;
9583 battery
->psy_usb
->supplied_to
= supply_list
;
9584 battery
->psy_usb
->num_supplicants
= ARRAY_SIZE(supply_list
);
9586 battery
->psy_ac
= power_supply_register(&pdev
->dev
, &ac_power_supply_desc
, &battery_cfg
);
9587 if (!battery
->psy_ac
) {
9588 dev_err(battery
->dev
,
9589 "%s: Failed to Register psy_ac\n", __func__
);
9590 goto err_supply_unreg_usb
;
9592 battery
->psy_ac
->supplied_to
= supply_list
;
9593 battery
->psy_ac
->num_supplicants
= ARRAY_SIZE(supply_list
);
9595 battery
->psy_bat
= power_supply_register(&pdev
->dev
, &battery_power_supply_desc
, &battery_cfg
);
9596 if (!battery
->psy_bat
) {
9597 dev_err(battery
->dev
,
9598 "%s: Failed to Register psy_bat\n", __func__
);
9599 goto err_supply_unreg_ac
;
9602 ret
= sec_bat_create_attrs(&battery
->psy_bat
->dev
);
9604 dev_err(battery
->dev
,
9605 "%s : Failed to create_attrs\n", __func__
);
9609 /* initialize battery level*/
9611 psy_do_property(battery
->pdata
->fuelgauge_name
, get
,
9612 POWER_SUPPLY_PROP_CAPACITY
, value
);
9613 battery
->capacity
= value
.intval
;
9615 #if defined(CONFIG_WIRELESS_FIRMWARE_UPDATE)
9616 /* queue_delayed_work(battery->monitor_wqueue, &battery->fw_init_work, 0); */
9619 /* notify wireless charger driver when sec_battery probe is done,
9620 if wireless charging is possible, POWER_SUPPLY_PROP_ONLINE of wireless property will be called. */
9622 psy_do_property(battery
->pdata
->wireless_charger_name
, set
,
9623 POWER_SUPPLY_PROP_CHARGE_TYPE
, value
);
9625 #if defined(CONFIG_STORE_MODE) && !defined(CONFIG_SEC_FACTORY)
9626 battery
->store_mode
= true;
9627 sec_bat_parse_mode_dt(battery
);
9630 #if defined(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
9631 battery
->pdic_info
.sink_status
.rp_currentlvl
= RP_CURRENT_LEVEL_NONE
;
9632 manager_notifier_register(&battery
->usb_typec_nb
,
9633 usb_typec_handle_notification
, MANAGER_NOTIFY_CCIC_BATTERY
);
9635 #if defined(CONFIG_MUIC_NOTIFIER)
9636 muic_notifier_register(&battery
->batt_nb
,
9637 batt_handle_notification
, MUIC_NOTIFY_DEV_CHARGER
);
9639 cable_initial_check(battery
);
9641 #if defined(CONFIG_CCIC_NOTIFIER)
9642 pr_info("%s: Registering PDIC_NOTIFY.\n", __func__
);
9643 pdic_notifier_register(&battery
->pdic_nb
,
9644 batt_pdic_handle_notification
, PDIC_NOTIFY_DEV_BATTERY
);
9647 #if defined(CONFIG_VBUS_NOTIFIER)
9648 vbus_notifier_register(&battery
->vbus_nb
,
9649 vbus_handle_notification
, VBUS_NOTIFY_DEV_CHARGER
);
9652 value
.intval
= true;
9653 psy_do_property(battery
->pdata
->charger_name
, set
,
9654 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX
, value
);
9656 /* make fg_reset true again for actual normal booting after recovery kernel is done */
9657 if (fg_reset
&& (bootmode
== 2)) {
9658 psy_do_property(battery
->pdata
->fuelgauge_name
, set
,
9659 POWER_SUPPLY_PROP_ENERGY_NOW
, value
);
9660 pr_info("%s: make fg_reset true again for actual normal booting\n", __func__
);
9663 if ((battery
->cable_type
== SEC_BATTERY_CABLE_NONE
) ||
9664 (battery
->cable_type
== SEC_BATTERY_CABLE_PREPARE_TA
)) {
9665 queue_delayed_work(battery
->monitor_wqueue
, &battery
->init_chg_work
, 0);
9667 dev_info(&pdev
->dev
,
9668 "%s: SEC Battery Driver Monitorwork\n", __func__
);
9669 wake_lock(&battery
->monitor_wake_lock
);
9670 queue_delayed_work(battery
->monitor_wqueue
, &battery
->monitor_work
, 0);
9673 if (battery
->pdata
->check_battery_callback
)
9674 battery
->present
= battery
->pdata
->check_battery_callback();
9676 dev_info(battery
->dev
,
9677 "%s: SEC Battery Driver Loaded\n", __func__
);
9681 if (battery
->pdata
->bat_irq
)
9682 free_irq(battery
->pdata
->bat_irq
, battery
);
9683 power_supply_unregister(battery
->psy_bat
);
9684 err_supply_unreg_ac
:
9685 power_supply_unregister(battery
->psy_ac
);
9686 err_supply_unreg_usb
:
9687 power_supply_unregister(battery
->psy_usb
);
9688 err_supply_unreg_wireless
:
9689 power_supply_unregister(battery
->psy_wireless
);
9690 err_supply_unreg_ps
:
9691 power_supply_unregister(battery
->psy_ps
);
9693 destroy_workqueue(battery
->monitor_wqueue
);
9695 wake_lock_destroy(&battery
->monitor_wake_lock
);
9696 wake_lock_destroy(&battery
->cable_wake_lock
);
9697 wake_lock_destroy(&battery
->vbus_wake_lock
);
9698 wake_lock_destroy(&battery
->afc_wake_lock
);
9699 wake_lock_destroy(&battery
->siop_level_wake_lock
);
9700 wake_lock_destroy(&battery
->ext_event_wake_lock
);
9701 wake_lock_destroy(&battery
->wc_headroom_wake_lock
);
9702 #if defined(CONFIG_UPDATE_BATTERY_DATA)
9703 wake_lock_destroy(&battery
->batt_data_wake_lock
);
9705 wake_lock_destroy(&battery
->misc_event_wake_lock
);
9707 wake_lock_destroy(&battery
->parse_mode_dt_wake_lock
);
9709 mutex_destroy(&battery
->adclock
);
9710 mutex_destroy(&battery
->iolock
);
9711 mutex_destroy(&battery
->misclock
);
9712 mutex_destroy(&battery
->batt_handlelock
);
9713 mutex_destroy(&battery
->current_eventlock
);
9714 mutex_destroy(&battery
->typec_notylock
);
9715 mutex_destroy(&battery
->wclock
);
9716 #if defined(CONFIG_BATTERY_SBM_DATA)
9717 mutex_destroy(&battery
->sbmlock
);
9718 sec_bat_exit_sbm(battery
);
9727 static int sec_battery_remove(struct platform_device
*pdev
)
9729 struct sec_battery_info
*battery
= platform_get_drvdata(pdev
);
9734 dev_dbg(battery
->dev
, "%s: Start\n", __func__
);
9736 switch (battery
->pdata
->polling_type
) {
9737 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9738 cancel_delayed_work(&battery
->polling_work
);
9740 case SEC_BATTERY_MONITOR_ALARM
:
9741 alarm_cancel(&battery
->polling_alarm
);
9747 flush_workqueue(battery
->monitor_wqueue
);
9748 destroy_workqueue(battery
->monitor_wqueue
);
9749 wake_lock_destroy(&battery
->monitor_wake_lock
);
9750 wake_lock_destroy(&battery
->cable_wake_lock
);
9751 wake_lock_destroy(&battery
->vbus_wake_lock
);
9752 wake_lock_destroy(&battery
->afc_wake_lock
);
9753 wake_lock_destroy(&battery
->siop_level_wake_lock
);
9754 wake_lock_destroy(&battery
->ext_event_wake_lock
);
9755 wake_lock_destroy(&battery
->misc_event_wake_lock
);
9756 mutex_destroy(&battery
->adclock
);
9757 mutex_destroy(&battery
->iolock
);
9758 mutex_destroy(&battery
->misclock
);
9759 mutex_destroy(&battery
->batt_handlelock
);
9760 mutex_destroy(&battery
->current_eventlock
);
9761 mutex_destroy(&battery
->typec_notylock
);
9762 mutex_destroy(&battery
->wclock
);
9764 #if defined(CONFIG_BATTERY_SBM_DATA)
9765 mutex_destroy(&battery
->sbmlock
);
9766 sec_bat_exit_sbm(battery
);
9772 for (i
= 0; i
< SEC_BAT_ADC_CHANNEL_NUM
; i
++)
9773 adc_exit(battery
->pdata
, i
);
9775 power_supply_unregister(battery
->psy_ps
);
9776 power_supply_unregister(battery
->psy_wireless
);
9777 power_supply_unregister(battery
->psy_ac
);
9778 power_supply_unregister(battery
->psy_usb
);
9779 power_supply_unregister(battery
->psy_bat
);
9781 dev_dbg(battery
->dev
, "%s: End\n", __func__
);
9787 static int sec_battery_prepare(struct device
*dev
)
9789 struct sec_battery_info
*battery
9790 = dev_get_drvdata(dev
);
9792 dev_info(battery
->dev
, "%s: Start\n", __func__
);
9794 switch (battery
->pdata
->polling_type
) {
9795 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9796 cancel_delayed_work(&battery
->polling_work
);
9798 case SEC_BATTERY_MONITOR_ALARM
:
9799 alarm_cancel(&battery
->polling_alarm
);
9805 /* monitor_wake_lock should be unlocked before cancle monitor_work */
9806 wake_unlock(&battery
->monitor_wake_lock
);
9807 cancel_delayed_work_sync(&battery
->monitor_work
);
9809 battery
->polling_in_sleep
= true;
9811 sec_bat_set_polling(battery
);
9813 /* cancel work for polling
9814 * that is set in sec_bat_set_polling()
9815 * no need for polling in sleep
9817 if (battery
->pdata
->polling_type
==
9818 SEC_BATTERY_MONITOR_WORKQUEUE
)
9819 cancel_delayed_work(&battery
->polling_work
);
9821 dev_info(battery
->dev
, "%s: End\n", __func__
);
9826 static int sec_battery_suspend(struct device
*dev
)
9831 static int sec_battery_resume(struct device
*dev
)
9836 static void sec_battery_complete(struct device
*dev
)
9838 struct sec_battery_info
*battery
9839 = dev_get_drvdata(dev
);
9841 dev_info(battery
->dev
, "%s: Start\n", __func__
);
9843 /* cancel current alarm and reset after monitor work */
9844 if (battery
->pdata
->polling_type
== SEC_BATTERY_MONITOR_ALARM
)
9845 alarm_cancel(&battery
->polling_alarm
);
9847 wake_lock(&battery
->monitor_wake_lock
);
9848 queue_delayed_work(battery
->monitor_wqueue
,
9849 &battery
->monitor_work
, 0);
9851 dev_info(battery
->dev
, "%s: End\n", __func__
);
9856 static void sec_battery_shutdown(struct platform_device
*pdev
)
9858 struct sec_battery_info
*battery
9859 = platform_get_drvdata(pdev
);
9861 switch (battery
->pdata
->polling_type
) {
9862 case SEC_BATTERY_MONITOR_WORKQUEUE
:
9863 cancel_delayed_work(&battery
->polling_work
);
9865 case SEC_BATTERY_MONITOR_ALARM
:
9866 alarm_cancel(&battery
->polling_alarm
);
9874 static struct of_device_id sec_battery_dt_ids
[] = {
9875 { .compatible
= "samsung,sec-battery" },
9878 MODULE_DEVICE_TABLE(of
, sec_battery_dt_ids
);
9879 #endif /* CONFIG_OF */
9881 static const struct dev_pm_ops sec_battery_pm_ops
= {
9882 .prepare
= sec_battery_prepare
,
9883 .suspend
= sec_battery_suspend
,
9884 .resume
= sec_battery_resume
,
9885 .complete
= sec_battery_complete
,
9888 static struct platform_driver sec_battery_driver
= {
9890 .name
= "sec-battery",
9891 .owner
= THIS_MODULE
,
9892 .pm
= &sec_battery_pm_ops
,
9894 .of_match_table
= sec_battery_dt_ids
,
9897 .probe
= sec_battery_probe
,
9898 .remove
= sec_battery_remove
,
9899 .shutdown
= sec_battery_shutdown
,
9902 static int __init
sec_battery_init(void)
9904 return platform_driver_register(&sec_battery_driver
);
9907 static void __exit
sec_battery_exit(void)
9909 platform_driver_unregister(&sec_battery_driver
);
9912 late_initcall(sec_battery_init
);
9913 module_exit(sec_battery_exit
);
9915 MODULE_DESCRIPTION("Samsung Battery Driver");
9916 MODULE_AUTHOR("Samsung Electronics");
9917 MODULE_LICENSE("GPL");