1 /*****************************************************************************
13 * This file implements the interface between BMT and ADC scheduler.
19 *============================================================================
21 * $Modtime: 11 Aug 2005 10:28:16 $
22 * $Log: //mtkvs01/vmdata/Maui_sw/archives/mcu/hal/peripheral/inc/bmt_chr_setting.h-arc $
24 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
25 *------------------------------------------------------------------------------
26 *------------------------------------------------------------------------------
27 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
28 *============================================================================
29 ****************************************************************************/
30 #include <linux/kernel.h>
31 #include <mach/battery_common.h>
32 #include <mach/charging.h>
33 #include "cust_charging.h"
34 #include <mach/mt_boot.h>
35 #include <mach/battery_meter.h>
37 #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
38 #include <linux/mutex.h>
39 #include <linux/wakelock.h>
40 #include <linux/delay.h>
41 #if !defined(TA_AC_CHARGING_CURRENT)
46 #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
47 #include <mach/diso.h>
50 /* ============================================================ // */
52 /* ============================================================ // */
54 #define POST_CHARGING_TIME 30 * 60 /* 30mins */
55 #define FULL_CHECK_TIMES 6
57 /* ============================================================ // */
59 /* ============================================================ // */
60 kal_uint32 g_bcct_flag
= 0;
61 kal_uint32 g_bcct_value
= 0;
62 kal_uint32 g_full_check_count
= 0;
63 CHR_CURRENT_ENUM g_temp_CC_value
= CHARGE_CURRENT_0_00_MA
;
64 CHR_CURRENT_ENUM g_temp_input_CC_value
= CHARGE_CURRENT_0_00_MA
;
65 kal_uint32 g_usb_state
= USB_UNCONFIGURED
;
66 static bool usb_unlimited
=false;
68 /* ///////////////////////////////////////////////////////////////////////////////////////// */
70 /* ///////////////////////////////////////////////////////////////////////////////////////// */
71 #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
72 struct wake_lock TA_charger_suspend_lock
;
73 kal_bool ta_check_chr_type
= KAL_TRUE
;
74 kal_bool ta_cable_out_occur
= KAL_FALSE
;
75 kal_bool is_ta_connect
= KAL_FALSE
;
76 kal_bool ta_vchr_tuning
= KAL_TRUE
;
80 /* ///////////////////////////////////////////////////////////////////////////////////////// */
82 /* ///////////////////////////////////////////////////////////////////////////////////////// */
83 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
84 int g_temp_status
= TEMP_POS_10_TO_POS_45
;
85 kal_bool temp_error_recovery_chr_flag
= KAL_TRUE
;
90 /* ============================================================ // */
91 /* function prototype */
92 /* ============================================================ // */
95 /* ============================================================ // */
97 /* ============================================================ // */
98 extern int g_platform_boot_mode
;
100 /* ============================================================ // */
101 /* extern function */
102 /* ============================================================ // */
105 /* ============================================================ // */
106 void BATTERY_SetUSBState(int usb_state_value
)
108 #if defined(CONFIG_POWER_EXT)
109 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY_SetUSBState] in FPGA/EVB, no service\r\n");
111 if ((usb_state_value
< USB_SUSPEND
) || ((usb_state_value
> USB_CONFIGURED
))) {
112 battery_xlog_printk(BAT_LOG_CRTI
,
113 "[BATTERY] BAT_SetUSBState Fail! Restore to default value\r\n");
114 usb_state_value
= USB_UNCONFIGURED
;
116 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] BAT_SetUSBState Success! Set %d\r\n",
118 g_usb_state
= usb_state_value
;
124 kal_uint32
get_charging_setting_current(void)
126 return g_temp_CC_value
;
129 #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
130 static DEFINE_MUTEX(ta_mutex
);
132 static void set_ta_charging_current(void)
136 real_v_chrA
= battery_meter_get_charger_voltage();
137 battery_xlog_printk(BAT_LOG_CRTI
, "set_ta_charging_current, chrA=%d, chrB=%d\n",
138 ta_v_chr_org
, real_v_chrA
);
140 if((real_v_chrA
- ta_v_chr_org
) > 3000) {
141 g_temp_input_CC_value
= TA_AC_9V_INPUT_CURRENT
; //TA = 9V
142 g_temp_CC_value
= TA_AC_CHARGING_CURRENT
;
143 } else if((real_v_chrA
- ta_v_chr_org
) > 1000) {
144 g_temp_input_CC_value
= TA_AC_7V_INPUT_CURRENT
; //TA = 7V
145 g_temp_CC_value
= TA_AC_CHARGING_CURRENT
;
149 static void mtk_ta_reset_vchr(void)
151 CHR_CURRENT_ENUM chr_current
= CHARGE_CURRENT_70_00_MA
;
153 battery_charging_control(CHARGING_CMD_SET_INPUT_CURRENT
,&chr_current
);
154 msleep(250); // reset Vchr to 5V
156 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_reset_vchr(): reset Vchr to 5V \n");
159 static void mtk_ta_increase(void)
161 kal_bool ta_current_pattern
= KAL_TRUE
; // TRUE = increase
163 if(ta_cable_out_occur
== KAL_FALSE
) {
164 battery_charging_control(CHARGING_CMD_SET_TA_CURRENT_PATTERN
, &ta_current_pattern
);
166 ta_check_chr_type
= KAL_TRUE
;
167 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() Cable out \n");
171 static kal_bool
mtk_ta_retry_increase(void)
175 kal_bool retransmit
= KAL_TRUE
;
176 kal_uint32 retransmit_count
=0;
179 real_v_chrA
= battery_meter_get_charger_voltage();
180 mtk_ta_increase(); //increase TA voltage to 7V
181 real_v_chrB
= battery_meter_get_charger_voltage();
183 if(real_v_chrB
- real_v_chrA
>= 1000) { /* 1.0V */
184 retransmit
= KAL_FALSE
;
187 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector(): retransmit_count =%d, chrA=%d, chrB=%d\n",
188 retransmit_count
, real_v_chrA
, real_v_chrB
);
191 if((retransmit_count
== 3) || (BMT_status
.charger_exist
== KAL_FALSE
)) {
192 retransmit
= KAL_FALSE
;
195 } while((retransmit
== KAL_TRUE
) && (ta_cable_out_occur
== KAL_FALSE
));
197 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_retry_increase() real_v_chrA=%d, real_v_chrB=%d, retry=%d\n",
198 real_v_chrA
, real_v_chrB
,retransmit_count
);
200 if(retransmit_count
== 3)
206 static void mtk_ta_detector(void)
210 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector() start\n");
212 ta_v_chr_org
= battery_meter_get_charger_voltage();
213 mtk_ta_retry_increase();
214 real_v_chrB
= battery_meter_get_charger_voltage();
216 if(real_v_chrB
- ta_v_chr_org
>= 1000)
217 is_ta_connect
= KAL_TRUE
;
219 is_ta_connect
= KAL_FALSE
;
221 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_detector() end, is_ta_connect=%d\n",is_ta_connect
);
224 static void mtk_ta_init(void)
226 is_ta_connect
= KAL_FALSE
;
227 ta_cable_out_occur
= KAL_FALSE
;
230 ta_vchr_tuning
= KAL_FALSE
;
233 battery_charging_control(CHARGING_CMD_INIT
,NULL
);
236 static void battery_pump_express_charger_check(void)
238 if (KAL_TRUE
== ta_check_chr_type
&&
239 STANDARD_CHARGER
== BMT_status
.charger_type
&&
240 BMT_status
.SOC
>= TA_START_BATTERY_SOC
&&
241 BMT_status
.SOC
< TA_STOP_BATTERY_SOC
) {
243 mutex_lock(&ta_mutex
);
244 wake_lock(&TA_charger_suspend_lock
);
251 /* need to re-check if the charger plug out during ta detector */
252 if(KAL_TRUE
== ta_cable_out_occur
)
253 ta_check_chr_type
= KAL_TRUE
;
255 ta_check_chr_type
= KAL_FALSE
;
257 wake_unlock(&TA_charger_suspend_lock
);
258 mutex_unlock(&ta_mutex
);
260 battery_xlog_printk(BAT_LOG_CRTI
,
261 "Stop battery_pump_express_charger_check, SOC=%d, ta_check_chr_type = %d, charger_type = %d \n",
262 BMT_status
.SOC
, ta_check_chr_type
, BMT_status
.charger_type
);
266 static void battery_pump_express_algorithm_start(void)
268 kal_int32 charger_vol
;
269 kal_uint32 charging_enable
= KAL_FALSE
;
271 mutex_lock(&ta_mutex
);
272 wake_lock(&TA_charger_suspend_lock
);
274 if(KAL_TRUE
== is_ta_connect
) {
275 /* check cable impedance */
276 charger_vol
= battery_meter_get_charger_voltage();
277 if(KAL_FALSE
== ta_vchr_tuning
) {
278 mtk_ta_retry_increase(); /* increase TA voltage to 9V */
279 charger_vol
= battery_meter_get_charger_voltage();
280 ta_vchr_tuning
= KAL_TRUE
;
281 } else if(BMT_status
.SOC
> TA_STOP_BATTERY_SOC
) {
282 /* disable charging, avoid Iterm issue */
283 battery_charging_control(CHARGING_CMD_ENABLE
,&charging_enable
);
284 mtk_ta_reset_vchr(); //decrease TA voltage to 5V
285 charger_vol
= battery_meter_get_charger_voltage();
286 if(abs(charger_vol
- ta_v_chr_org
) <= 1000) /* 1.0V */
287 is_ta_connect
= KAL_FALSE
;
289 battery_xlog_printk(BAT_LOG_CRTI
, "Stop battery_pump_express_algorithm, SOC=%d is_ta_connect =%d, TA_STOP_BATTERY_SOC: %d\n",
290 BMT_status
.SOC
, is_ta_connect
, TA_STOP_BATTERY_SOC
);
292 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] check cable impedance, VA(%d) VB(%d) delta(%d).\n",
293 ta_v_chr_org
, charger_vol
, charger_vol
- ta_v_chr_org
);
295 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_algorithm() end\n");
297 battery_xlog_printk(BAT_LOG_CRTI
, "It's not a TA charger, bypass TA algorithm\n");
300 wake_unlock(&TA_charger_suspend_lock
);
301 mutex_unlock(&ta_mutex
);
305 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
307 static BATTERY_VOLTAGE_ENUM
select_jeita_cv(void)
309 BATTERY_VOLTAGE_ENUM cv_voltage
;
311 if (g_temp_status
== TEMP_ABOVE_POS_60
) {
312 cv_voltage
= JEITA_TEMP_ABOVE_POS_60_CV_VOLTAGE
;
313 } else if (g_temp_status
== TEMP_POS_45_TO_POS_60
) {
314 cv_voltage
= JEITA_TEMP_POS_45_TO_POS_60_CV_VOLTAGE
;
315 } else if (g_temp_status
== TEMP_POS_10_TO_POS_45
) {
316 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
317 cv_voltage
= BATTERY_VOLT_04_340000_V
;
319 cv_voltage
= JEITA_TEMP_POS_10_TO_POS_45_CV_VOLTAGE
;
321 } else if (g_temp_status
== TEMP_POS_0_TO_POS_10
) {
322 cv_voltage
= JEITA_TEMP_POS_0_TO_POS_10_CV_VOLTAGE
;
323 } else if (g_temp_status
== TEMP_NEG_10_TO_POS_0
) {
324 cv_voltage
= JEITA_TEMP_NEG_10_TO_POS_0_CV_VOLTAGE
;
325 } else if (g_temp_status
== TEMP_BELOW_NEG_10
) {
326 cv_voltage
= JEITA_TEMP_BELOW_NEG_10_CV_VOLTAGE
;
328 cv_voltage
= BATTERY_VOLT_04_200000_V
;
334 PMU_STATUS
do_jeita_state_machine(void)
336 BATTERY_VOLTAGE_ENUM cv_voltage
;
338 /* JEITA battery temp Standard */
340 if (BMT_status
.temperature
>= TEMP_POS_60_THRESHOLD
) {
341 battery_xlog_printk(BAT_LOG_CRTI
,
342 "[BATTERY] Battery Over high Temperature(%d) !!\n\r",
343 TEMP_POS_60_THRESHOLD
);
345 g_temp_status
= TEMP_ABOVE_POS_60
;
347 return PMU_STATUS_FAIL
;
348 } else if (BMT_status
.temperature
> TEMP_POS_45_THRESHOLD
) /* control 45c to normal behavior */
350 if ((g_temp_status
== TEMP_ABOVE_POS_60
)
351 && (BMT_status
.temperature
>= TEMP_POS_60_THRES_MINUS_X_DEGREE
)) {
352 battery_xlog_printk(BAT_LOG_CRTI
,
353 "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
354 TEMP_POS_60_THRES_MINUS_X_DEGREE
,
355 TEMP_POS_60_THRESHOLD
);
357 return PMU_STATUS_FAIL
;
359 battery_xlog_printk(BAT_LOG_CRTI
,
360 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
361 TEMP_POS_45_THRESHOLD
, TEMP_POS_60_THRESHOLD
);
363 g_temp_status
= TEMP_POS_45_TO_POS_60
;
365 } else if (BMT_status
.temperature
>= TEMP_POS_10_THRESHOLD
) {
366 if (((g_temp_status
== TEMP_POS_45_TO_POS_60
)
367 && (BMT_status
.temperature
>= TEMP_POS_45_THRES_MINUS_X_DEGREE
))
368 || ((g_temp_status
== TEMP_POS_0_TO_POS_10
)
369 && (BMT_status
.temperature
<= TEMP_POS_10_THRES_PLUS_X_DEGREE
))) {
370 battery_xlog_printk(BAT_LOG_CRTI
,
371 "[BATTERY] Battery Temperature not recovery to normal temperature charging mode yet!!\n\r");
373 battery_xlog_printk(BAT_LOG_CRTI
,
374 "[BATTERY] Battery Normal Temperature between %d and %d !!\n\r",
375 TEMP_POS_10_THRESHOLD
, TEMP_POS_45_THRESHOLD
);
376 g_temp_status
= TEMP_POS_10_TO_POS_45
;
378 } else if (BMT_status
.temperature
>= TEMP_POS_0_THRESHOLD
) {
379 if ((g_temp_status
== TEMP_NEG_10_TO_POS_0
|| g_temp_status
== TEMP_BELOW_NEG_10
)
380 && (BMT_status
.temperature
<= TEMP_POS_0_THRES_PLUS_X_DEGREE
)) {
381 if (g_temp_status
== TEMP_NEG_10_TO_POS_0
) {
382 battery_xlog_printk(BAT_LOG_CRTI
,
383 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
384 TEMP_POS_0_THRES_PLUS_X_DEGREE
,
385 TEMP_POS_10_THRESHOLD
);
387 if (g_temp_status
== TEMP_BELOW_NEG_10
) {
388 battery_xlog_printk(BAT_LOG_CRTI
,
389 "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
390 TEMP_POS_0_THRESHOLD
,
391 TEMP_POS_0_THRES_PLUS_X_DEGREE
);
392 return PMU_STATUS_FAIL
;
395 battery_xlog_printk(BAT_LOG_CRTI
,
396 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
397 TEMP_POS_0_THRESHOLD
, TEMP_POS_10_THRESHOLD
);
399 g_temp_status
= TEMP_POS_0_TO_POS_10
;
401 } else if (BMT_status
.temperature
>= TEMP_NEG_10_THRESHOLD
) {
402 if ((g_temp_status
== TEMP_BELOW_NEG_10
)
403 && (BMT_status
.temperature
<= TEMP_NEG_10_THRES_PLUS_X_DEGREE
)) {
404 battery_xlog_printk(BAT_LOG_CRTI
,
405 "[BATTERY] Battery Temperature between %d and %d,not allow charging yet!!\n\r",
406 TEMP_NEG_10_THRESHOLD
, TEMP_NEG_10_THRES_PLUS_X_DEGREE
);
408 return PMU_STATUS_FAIL
;
410 battery_xlog_printk(BAT_LOG_CRTI
,
411 "[BATTERY] Battery Temperature between %d and %d !!\n\r",
412 TEMP_NEG_10_THRESHOLD
, TEMP_POS_0_THRESHOLD
);
414 g_temp_status
= TEMP_NEG_10_TO_POS_0
;
417 battery_xlog_printk(BAT_LOG_CRTI
,
418 "[BATTERY] Battery below low Temperature(%d) !!\n\r",
419 TEMP_NEG_10_THRESHOLD
);
420 g_temp_status
= TEMP_BELOW_NEG_10
;
422 return PMU_STATUS_FAIL
;
425 /* set CV after temperature changed */
427 cv_voltage
= select_jeita_cv();
428 battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE
, &cv_voltage
);
430 return PMU_STATUS_OK
;
434 static void set_jeita_charging_current(void)
437 if (BMT_status
.charger_type
== STANDARD_HOST
)
441 if (g_temp_status
== TEMP_NEG_10_TO_POS_0
) {
442 g_temp_CC_value
= CHARGE_CURRENT_350_00_MA
;
443 g_temp_input_CC_value
= CHARGE_CURRENT_500_00_MA
;
444 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] JEITA set charging current : %d\r\n",
451 bool get_usb_current_unlimited(void)
453 if (BMT_status
.charger_type
== STANDARD_HOST
|| BMT_status
.charger_type
== CHARGING_HOST
)
454 return usb_unlimited
;
459 void set_usb_current_unlimited(bool enable
)
461 usb_unlimited
= enable
;
464 void select_charging_curret_bcct(void)
466 if ((BMT_status
.charger_type
== STANDARD_HOST
) ||
467 (BMT_status
.charger_type
== NONSTANDARD_CHARGER
)) {
468 if (g_bcct_value
< 100)
469 g_temp_input_CC_value
= CHARGE_CURRENT_0_00_MA
;
470 else if (g_bcct_value
< 500)
471 g_temp_input_CC_value
= CHARGE_CURRENT_100_00_MA
;
472 else if (g_bcct_value
< 800)
473 g_temp_input_CC_value
= CHARGE_CURRENT_500_00_MA
;
474 else if (g_bcct_value
== 800)
475 g_temp_input_CC_value
= CHARGE_CURRENT_800_00_MA
;
477 g_temp_input_CC_value
= CHARGE_CURRENT_500_00_MA
;
478 } else if ((BMT_status
.charger_type
== STANDARD_CHARGER
) ||
479 (BMT_status
.charger_type
== CHARGING_HOST
)) {
480 g_temp_input_CC_value
= CHARGE_CURRENT_MAX
;
482 /* --------------------------------------------------- */
484 if (g_bcct_value
< 550)
485 g_temp_CC_value
= CHARGE_CURRENT_0_00_MA
;
486 else if (g_bcct_value
< 650)
487 g_temp_CC_value
= CHARGE_CURRENT_550_00_MA
;
488 else if (g_bcct_value
< 750)
489 g_temp_CC_value
= CHARGE_CURRENT_650_00_MA
;
490 else if (g_bcct_value
< 850)
491 g_temp_CC_value
= CHARGE_CURRENT_750_00_MA
;
492 else if (g_bcct_value
< 950)
493 g_temp_CC_value
= CHARGE_CURRENT_850_00_MA
;
494 else if (g_bcct_value
< 1050)
495 g_temp_CC_value
= CHARGE_CURRENT_950_00_MA
;
496 else if (g_bcct_value
< 1150)
497 g_temp_CC_value
= CHARGE_CURRENT_1050_00_MA
;
498 else if (g_bcct_value
< 1250)
499 g_temp_CC_value
= CHARGE_CURRENT_1150_00_MA
;
500 else if (g_bcct_value
== 1250)
501 g_temp_CC_value
= CHARGE_CURRENT_1250_00_MA
;
503 g_temp_CC_value
= CHARGE_CURRENT_650_00_MA
;
504 /* --------------------------------------------------- */
507 g_temp_input_CC_value
= CHARGE_CURRENT_500_00_MA
;
511 static void pchr_turn_on_charging(void);
512 kal_uint32
set_bat_charging_current_limit(int current_limit
)
514 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] set_bat_charging_current_limit (%d)\r\n",
517 if (current_limit
!= -1) {
519 g_bcct_value
= current_limit
;
521 if (current_limit
< 70)
522 g_temp_CC_value
= CHARGE_CURRENT_0_00_MA
;
523 else if (current_limit
< 200)
524 g_temp_CC_value
= CHARGE_CURRENT_70_00_MA
;
525 else if (current_limit
< 300)
526 g_temp_CC_value
= CHARGE_CURRENT_200_00_MA
;
527 else if (current_limit
< 400)
528 g_temp_CC_value
= CHARGE_CURRENT_300_00_MA
;
529 else if (current_limit
< 450)
530 g_temp_CC_value
= CHARGE_CURRENT_400_00_MA
;
531 else if (current_limit
< 550)
532 g_temp_CC_value
= CHARGE_CURRENT_450_00_MA
;
533 else if (current_limit
< 650)
534 g_temp_CC_value
= CHARGE_CURRENT_550_00_MA
;
535 else if (current_limit
< 700)
536 g_temp_CC_value
= CHARGE_CURRENT_650_00_MA
;
537 else if (current_limit
< 800)
538 g_temp_CC_value
= CHARGE_CURRENT_700_00_MA
;
539 else if (current_limit
< 900)
540 g_temp_CC_value
= CHARGE_CURRENT_800_00_MA
;
541 else if (current_limit
< 1000)
542 g_temp_CC_value
= CHARGE_CURRENT_900_00_MA
;
543 else if (current_limit
< 1100)
544 g_temp_CC_value
= CHARGE_CURRENT_1000_00_MA
;
545 else if (current_limit
< 1200)
546 g_temp_CC_value
= CHARGE_CURRENT_1100_00_MA
;
547 else if (current_limit
< 1300)
548 g_temp_CC_value
= CHARGE_CURRENT_1200_00_MA
;
549 else if (current_limit
< 1400)
550 g_temp_CC_value
= CHARGE_CURRENT_1300_00_MA
;
551 else if (current_limit
< 1500)
552 g_temp_CC_value
= CHARGE_CURRENT_1400_00_MA
;
553 else if (current_limit
< 1600)
554 g_temp_CC_value
= CHARGE_CURRENT_1500_00_MA
;
555 else if (current_limit
== 1600)
556 g_temp_CC_value
= CHARGE_CURRENT_1600_00_MA
;
558 g_temp_CC_value
= CHARGE_CURRENT_450_00_MA
;
560 /* change to default current setting */
565 pchr_turn_on_charging();
571 void select_charging_curret(void)
573 if (g_ftm_battery_flag
) {
574 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] FTM charging : %d\r\n",
575 charging_level_data
[0]);
576 g_temp_CC_value
= charging_level_data
[0];
578 if (g_temp_CC_value
== CHARGE_CURRENT_450_00_MA
) {
579 g_temp_input_CC_value
= CHARGE_CURRENT_500_00_MA
;
581 g_temp_input_CC_value
= CHARGE_CURRENT_MAX
;
582 g_temp_CC_value
= AC_CHARGER_CURRENT
;
584 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] set_ac_current \r\n");
587 if (BMT_status
.charger_type
== STANDARD_HOST
) {
590 g_temp_input_CC_value
= CHARGE_CURRENT_MAX
;
591 if (g_usb_state
== USB_SUSPEND
) {
592 g_temp_CC_value
= USB_CHARGER_CURRENT_SUSPEND
;
593 } else if (g_usb_state
== USB_UNCONFIGURED
) {
594 g_temp_CC_value
= USB_CHARGER_CURRENT_UNCONFIGURED
;
595 } else if (g_usb_state
== USB_CONFIGURED
) {
596 g_temp_CC_value
= USB_CHARGER_CURRENT_CONFIGURED
;
598 g_temp_CC_value
= USB_CHARGER_CURRENT_UNCONFIGURED
;
601 battery_xlog_printk(BAT_LOG_CRTI
,
602 "[BATTERY] STANDARD_HOST CC mode charging : %d on %d state\r\n",
603 g_temp_CC_value
, g_usb_state
);
607 g_temp_input_CC_value
= USB_CHARGER_CURRENT
;
608 g_temp_CC_value
= USB_CHARGER_CURRENT
;
611 } else if (BMT_status
.charger_type
== NONSTANDARD_CHARGER
) {
612 g_temp_input_CC_value
= NON_STD_AC_CHARGER_CURRENT
;
613 g_temp_CC_value
= NON_STD_AC_CHARGER_CURRENT
;
615 } else if (BMT_status
.charger_type
== STANDARD_CHARGER
) {
616 g_temp_input_CC_value
= AC_CHARGER_CURRENT
;
617 g_temp_CC_value
= AC_CHARGER_CURRENT
;
618 #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
619 if(is_ta_connect
== KAL_TRUE
)
620 set_ta_charging_current();
622 } else if (BMT_status
.charger_type
== CHARGING_HOST
) {
623 g_temp_input_CC_value
= CHARGING_HOST_CHARGER_CURRENT
;
624 g_temp_CC_value
= CHARGING_HOST_CHARGER_CURRENT
;
625 } else if (BMT_status
.charger_type
== APPLE_2_1A_CHARGER
) {
626 g_temp_input_CC_value
= APPLE_2_1A_CHARGER_CURRENT
;
627 g_temp_CC_value
= APPLE_2_1A_CHARGER_CURRENT
;
628 } else if (BMT_status
.charger_type
== APPLE_1_0A_CHARGER
) {
629 g_temp_input_CC_value
= APPLE_1_0A_CHARGER_CURRENT
;
630 g_temp_CC_value
= APPLE_1_0A_CHARGER_CURRENT
;
631 } else if (BMT_status
.charger_type
== APPLE_0_5A_CHARGER
) {
632 g_temp_input_CC_value
= APPLE_0_5A_CHARGER_CURRENT
;
633 g_temp_CC_value
= APPLE_0_5A_CHARGER_CURRENT
;
635 g_temp_input_CC_value
= CHARGE_CURRENT_500_00_MA
;
636 g_temp_CC_value
= CHARGE_CURRENT_500_00_MA
;
640 #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
641 if (DISO_data
.diso_state
.cur_vdc_state
== DISO_ONLINE
) {
642 g_temp_input_CC_value
= AC_CHARGER_CURRENT
;
643 g_temp_CC_value
= AC_CHARGER_CURRENT
;
647 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
648 set_jeita_charging_current();
656 static kal_uint32
charging_full_check(void)
660 battery_charging_control(CHARGING_CMD_GET_CHARGING_STATUS
, &status
);
661 if (status
== KAL_TRUE
) {
662 g_full_check_count
++;
663 if (g_full_check_count
>= FULL_CHECK_TIMES
) {
668 g_full_check_count
= 0;
674 static void pchr_turn_on_charging(void)
676 #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
677 BATTERY_VOLTAGE_ENUM cv_voltage
;
679 kal_uint32 charging_enable
= KAL_TRUE
;
681 #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
682 if(KAL_TRUE
== BMT_status
.charger_exist
)
683 charging_enable
= KAL_TRUE
;
685 charging_enable
= KAL_FALSE
;
688 if (BMT_status
.bat_charging_state
== CHR_ERROR
) {
689 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Charger Error, turn OFF charging !\n");
691 charging_enable
= KAL_FALSE
;
693 } else if ((g_platform_boot_mode
== META_BOOT
) || (g_platform_boot_mode
== ADVMETA_BOOT
)) {
694 battery_xlog_printk(BAT_LOG_CRTI
,
695 "[BATTERY] In meta or advanced meta mode, disable charging.\n");
696 charging_enable
= KAL_FALSE
;
698 /*HW initialization */
699 battery_charging_control(CHARGING_CMD_INIT
, NULL
);
701 battery_xlog_printk(BAT_LOG_FULL
, "charging_hw_init\n");
703 #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
704 battery_pump_express_algorithm_start();
707 /* Set Charging Current */
708 if (get_usb_current_unlimited()) {
709 g_temp_input_CC_value
= AC_CHARGER_CURRENT
;
710 g_temp_CC_value
= AC_CHARGER_CURRENT
;
711 battery_xlog_printk(BAT_LOG_FULL
,
712 "USB_CURRENT_UNLIMITED, use AC_CHARGER_CURRENT\n");
713 } else if (g_bcct_flag
== 1) {
714 select_charging_curret_bcct();
716 battery_xlog_printk(BAT_LOG_FULL
,
717 "[BATTERY] select_charging_curret_bcct !\n");
719 select_charging_curret();
721 battery_xlog_printk(BAT_LOG_FULL
, "[BATTERY] select_charging_curret !\n");
723 battery_xlog_printk(BAT_LOG_CRTI
,
724 "[BATTERY] Default CC mode charging : %d, input current = %d\r\n",
725 g_temp_CC_value
, g_temp_input_CC_value
);
726 if (g_temp_CC_value
== CHARGE_CURRENT_0_00_MA
727 || g_temp_input_CC_value
== CHARGE_CURRENT_0_00_MA
) {
729 charging_enable
= KAL_FALSE
;
731 battery_xlog_printk(BAT_LOG_CRTI
,
732 "[BATTERY] charging current is set 0mA, turn off charging !\r\n");
734 battery_charging_control(CHARGING_CMD_SET_INPUT_CURRENT
,
735 &g_temp_input_CC_value
);
736 battery_charging_control(CHARGING_CMD_SET_CURRENT
, &g_temp_CC_value
);
739 #if !defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
740 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
741 cv_voltage
= BATTERY_VOLT_04_340000_V
;
743 cv_voltage
= BATTERY_VOLT_04_200000_V
;
745 battery_charging_control(CHARGING_CMD_SET_CV_VOLTAGE
, &cv_voltage
);
750 /* enable/disable charging */
751 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
753 battery_xlog_printk(BAT_LOG_FULL
, "[BATTERY] pchr_turn_on_charging(), enable =%d !\r\n",
758 PMU_STATUS
BAT_PreChargeModeAction(void)
760 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Pre-CC mode charge, timer=%d on %d !!\n\r",
761 BMT_status
.PRE_charging_time
, BMT_status
.total_charging_time
);
763 BMT_status
.PRE_charging_time
+= BAT_TASK_PERIOD
;
764 BMT_status
.CC_charging_time
= 0;
765 BMT_status
.TOPOFF_charging_time
= 0;
766 BMT_status
.total_charging_time
+= BAT_TASK_PERIOD
;
769 pchr_turn_on_charging();
771 if (BMT_status
.UI_SOC
== 100) {
772 BMT_status
.bat_charging_state
= CHR_BATFULL
;
773 BMT_status
.bat_full
= KAL_TRUE
;
774 g_charging_full_reset_bat_meter
= KAL_TRUE
;
775 } else if (BMT_status
.bat_vol
> V_PRE2CC_THRES
) {
776 BMT_status
.bat_charging_state
= CHR_CC
;
781 return PMU_STATUS_OK
;
785 PMU_STATUS
BAT_ConstantCurrentModeAction(void)
787 battery_xlog_printk(BAT_LOG_FULL
, "[BATTERY] CC mode charge, timer=%d on %d !!\n\r",
788 BMT_status
.CC_charging_time
, BMT_status
.total_charging_time
);
790 BMT_status
.PRE_charging_time
= 0;
791 BMT_status
.CC_charging_time
+= BAT_TASK_PERIOD
;
792 BMT_status
.TOPOFF_charging_time
= 0;
793 BMT_status
.total_charging_time
+= BAT_TASK_PERIOD
;
796 pchr_turn_on_charging();
798 if (charging_full_check() == KAL_TRUE
) {
799 BMT_status
.bat_charging_state
= CHR_BATFULL
;
800 BMT_status
.bat_full
= KAL_TRUE
;
801 g_charging_full_reset_bat_meter
= KAL_TRUE
;
804 return PMU_STATUS_OK
;
808 PMU_STATUS
BAT_BatteryFullAction(void)
810 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Battery full !!\n\r");
812 BMT_status
.bat_full
= KAL_TRUE
;
813 BMT_status
.total_charging_time
= 0;
814 BMT_status
.PRE_charging_time
= 0;
815 BMT_status
.CC_charging_time
= 0;
816 BMT_status
.TOPOFF_charging_time
= 0;
817 BMT_status
.POSTFULL_charging_time
= 0;
818 BMT_status
.bat_in_recharging_state
= KAL_FALSE
;
820 if (charging_full_check() == KAL_FALSE
) {
821 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Battery Re-charging !!\n\r");
823 BMT_status
.bat_in_recharging_state
= KAL_TRUE
;
824 BMT_status
.bat_charging_state
= CHR_CC
;
825 battery_meter_reset();
829 return PMU_STATUS_OK
;
833 PMU_STATUS
BAT_BatteryHoldAction(void)
835 kal_uint32 charging_enable
;
837 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] Hold mode !!\n\r");
839 if (BMT_status
.bat_vol
< TALKING_RECHARGE_VOLTAGE
|| g_call_state
== CALL_IDLE
) {
840 BMT_status
.bat_charging_state
= CHR_CC
;
841 battery_xlog_printk(BAT_LOG_CRTI
,
842 "[BATTERY] Exit Hold mode and Enter CC mode !!\n\r");
845 /* Disable charger */
846 charging_enable
= KAL_FALSE
;
847 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
849 return PMU_STATUS_OK
;
853 PMU_STATUS
BAT_BatteryStatusFailAction(void)
855 kal_uint32 charging_enable
;
857 battery_xlog_printk(BAT_LOG_CRTI
, "[BATTERY] BAD Battery status... Charging Stop !!\n\r");
859 #if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
860 if ((g_temp_status
== TEMP_ABOVE_POS_60
) || (g_temp_status
== TEMP_BELOW_NEG_10
)) {
861 temp_error_recovery_chr_flag
= KAL_FALSE
;
863 if ((temp_error_recovery_chr_flag
== KAL_FALSE
) && (g_temp_status
!= TEMP_ABOVE_POS_60
)
864 && (g_temp_status
!= TEMP_BELOW_NEG_10
)) {
865 temp_error_recovery_chr_flag
= KAL_TRUE
;
866 BMT_status
.bat_charging_state
= CHR_PRE
;
870 BMT_status
.total_charging_time
= 0;
871 BMT_status
.PRE_charging_time
= 0;
872 BMT_status
.CC_charging_time
= 0;
873 BMT_status
.TOPOFF_charging_time
= 0;
874 BMT_status
.POSTFULL_charging_time
= 0;
876 /* Disable charger */
877 charging_enable
= KAL_FALSE
;
878 battery_charging_control(CHARGING_CMD_ENABLE
, &charging_enable
);
880 return PMU_STATUS_OK
;
884 void mt_battery_charging_algorithm(void)
886 battery_charging_control(CHARGING_CMD_RESET_WATCH_DOG_TIMER
, NULL
);
888 #if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT)
889 battery_pump_express_charger_check();
891 switch (BMT_status
.bat_charging_state
) {
893 BAT_PreChargeModeAction();
897 BAT_ConstantCurrentModeAction();
901 BAT_BatteryFullAction();
905 BAT_BatteryHoldAction();
909 BAT_BatteryStatusFailAction();
913 battery_charging_control(CHARGING_CMD_DUMP_REGISTER
, NULL
);