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 <mach/charging.h>
31 #include <mach/upmu_common.h>
32 #include <mach/upmu_hw.h>
33 #include <linux/xlog.h>
34 #include <linux/delay.h>
35 #include <linux/mutex.h>
36 #include <cust_charging.h>
37 #include <mach/mt_gpio.h>
38 #include <mach/mt_sleep.h>
39 #include <mach/mt_boot.h>
40 #include <mach/system.h>
42 #include "cust_battery_meter.h"
43 #include <cust_charging.h>
44 #include <linux/wakelock.h>
45 #include <mach/battery_common.h>
47 #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
48 #include <mach/diso.h>
49 #include "cust_diso.h"
51 #include <linux/of_irq.h>
52 #ifdef MTK_DISCRETE_SWITCH
53 #include <mach/eint.h>
54 #include <cust_eint.h>
55 #include <mach/mt_gpio.h>
56 #include <cust_gpio_usage.h>
58 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
59 #include <linux/kthread.h>
60 #include <linux/wakelock.h>
61 #include <linux/mutex.h>
62 #include <linux/hrtimer.h>
63 #include <linux/workqueue.h>
67 // ============================================================ //
69 // ============================================================ //
71 #define STATUS_UNSUPPORTED -1
72 #define GETARRAYNUM(array) (sizeof(array)/sizeof(array[0]))
75 // ============================================================ //
77 // ============================================================ //
78 kal_bool chargin_hw_init_done
= KAL_TRUE
;
79 kal_bool charging_type_det_done
= KAL_TRUE
;
80 static CHARGER_TYPE g_charger_type
= CHARGER_UNKNOWN
;
82 #if defined(CONFIG_MTK_WIRELESS_CHARGER_SUPPORT)
83 #define WIRELESS_CHARGER_EXIST_STATE 0
84 int wireless_charger_gpio_number
= (168 | 0x80000000);
87 const kal_uint32 VBAT_CV_VTH
[]=
89 BATTERY_VOLT_04_200000_V
, BATTERY_VOLT_04_212500_V
, BATTERY_VOLT_04_225000_V
, BATTERY_VOLT_04_237500_V
,
90 BATTERY_VOLT_04_250000_V
, BATTERY_VOLT_04_262500_V
, BATTERY_VOLT_04_275000_V
, BATTERY_VOLT_04_300000_V
,
91 BATTERY_VOLT_04_325000_V
, BATTERY_VOLT_04_350000_V
, BATTERY_VOLT_04_375000_V
, BATTERY_VOLT_04_400000_V
,
92 BATTERY_VOLT_04_425000_V
, BATTERY_VOLT_04_162500_V
, BATTERY_VOLT_04_175000_V
, BATTERY_VOLT_02_200000_V
,
93 BATTERY_VOLT_04_050000_V
, BATTERY_VOLT_04_100000_V
, BATTERY_VOLT_04_125000_V
, BATTERY_VOLT_03_775000_V
,
94 BATTERY_VOLT_03_800000_V
, BATTERY_VOLT_03_850000_V
, BATTERY_VOLT_03_900000_V
, BATTERY_VOLT_04_000000_V
,
95 BATTERY_VOLT_04_050000_V
, BATTERY_VOLT_04_100000_V
, BATTERY_VOLT_04_125000_V
, BATTERY_VOLT_04_137500_V
,
96 BATTERY_VOLT_04_150000_V
, BATTERY_VOLT_04_162500_V
, BATTERY_VOLT_04_175000_V
, BATTERY_VOLT_04_187500_V
100 const kal_uint32 CS_VTH
[]=
102 CHARGE_CURRENT_1600_00_MA
, CHARGE_CURRENT_1500_00_MA
, CHARGE_CURRENT_1400_00_MA
, CHARGE_CURRENT_1300_00_MA
,
103 CHARGE_CURRENT_1200_00_MA
, CHARGE_CURRENT_1100_00_MA
, CHARGE_CURRENT_1000_00_MA
, CHARGE_CURRENT_900_00_MA
,
104 CHARGE_CURRENT_800_00_MA
, CHARGE_CURRENT_700_00_MA
, CHARGE_CURRENT_650_00_MA
, CHARGE_CURRENT_550_00_MA
,
105 CHARGE_CURRENT_450_00_MA
, CHARGE_CURRENT_300_00_MA
, CHARGE_CURRENT_200_00_MA
, CHARGE_CURRENT_70_00_MA
109 const kal_uint32 VCDT_HV_VTH
[]=
111 BATTERY_VOLT_04_200000_V
, BATTERY_VOLT_04_250000_V
, BATTERY_VOLT_04_300000_V
, BATTERY_VOLT_04_350000_V
,
112 BATTERY_VOLT_04_400000_V
, BATTERY_VOLT_04_450000_V
, BATTERY_VOLT_04_500000_V
, BATTERY_VOLT_04_550000_V
,
113 BATTERY_VOLT_04_600000_V
, BATTERY_VOLT_06_000000_V
, BATTERY_VOLT_06_500000_V
, BATTERY_VOLT_07_000000_V
,
114 BATTERY_VOLT_07_500000_V
, BATTERY_VOLT_08_500000_V
, BATTERY_VOLT_09_500000_V
, BATTERY_VOLT_10_500000_V
118 #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
119 #ifndef CUST_GPIO_VIN_SEL
120 #define CUST_GPIO_VIN_SEL 18
122 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
123 #define SW_POLLING_PERIOD 100 //100 ms
124 #define MSEC_TO_NSEC(x) (x * 1000000UL)
126 static DEFINE_MUTEX(diso_polling_mutex
);
127 static DECLARE_WAIT_QUEUE_HEAD(diso_polling_thread_wq
);
128 static struct hrtimer diso_kthread_timer
;
129 static kal_bool diso_thread_timeout
= KAL_FALSE
;
130 static struct delayed_work diso_polling_work
;
131 static void diso_polling_handler(struct work_struct
*work
);
132 static DISO_Polling_Data DISO_Polling
;
134 DISO_IRQ_Data DISO_IRQ
;
136 int g_diso_state
= 0;
137 int vin_sel_gpio_number
= (CUST_GPIO_VIN_SEL
| 0x80000000);
138 static kal_bool g_diso_otg
= KAL_FALSE
;
140 static char *DISO_state_s
[8] = {
152 // ============================================================ //
153 // function prototype
154 // ============================================================ //
157 // ============================================================ //
159 // ============================================================ //
161 // ============================================================ //
163 // ============================================================ //
164 extern kal_uint32
upmu_get_reg_value(kal_uint32 reg
);
165 extern bool mt_usb_is_device(void);
166 extern void Charger_Detect_Init(void);
167 extern void Charger_Detect_Release(void);
168 extern int PMIC_IMM_GetOneChannelValue(int dwChannel
, int deCount
, int trimd
);
169 extern U32
pmic_config_interface (U32 RegNum
, U32 val
, U32 MASK
, U32 SHIFT
);
170 extern U32
pmic_read_interface (U32 RegNum
, U32
*val
, U32 MASK
, U32 SHIFT
);
171 extern void mt_power_off(void);
173 static kal_uint32 charging_error
= false;
174 static kal_uint32
charging_get_error_state(void);
175 static kal_uint32
charging_set_error_state(void *data
);
176 // ============================================================ //
177 static kal_uint32
charging_get_csdac_value(void)
179 kal_uint32 tempA
, tempB
, tempC
;
182 pmic_config_interface(CHR_CON11
,0xC,0xF,0);
183 pmic_read_interface(CHR_CON10
, &tempC
, 0xF, 0x0); // bit 1 and 2 mapping bit 8 and bit9
185 pmic_config_interface(CHR_CON11
,0xA,0xF,0);
186 pmic_read_interface(CHR_CON10
, &tempA
, 0xF, 0x0); //bit 0 ~ 3 mapping bit 4 ~7
188 pmic_config_interface(CHR_CON11
,0xB,0xF,0);
189 pmic_read_interface(CHR_CON10
, &tempB
, 0xF, 0x0); //bit 0~3 mapping bit 0~3
191 sum
= (((tempC
& 0x6) >> 1)<<8) | (tempA
<< 4) | tempB
;
193 battery_xlog_printk(BAT_LOG_CRTI
, "tempC=%d,tempA=%d,tempB=%d, csdac=%d\n", tempC
,tempA
,tempB
,sum
);
198 kal_uint32
charging_value_to_parameter(const kal_uint32
*parameter
, const kal_uint32 array_size
, const kal_uint32 val
)
200 if (val
< array_size
)
202 return parameter
[val
];
206 battery_xlog_printk(BAT_LOG_CRTI
, "Can't find the parameter \r\n");
212 kal_uint32
charging_parameter_to_value(const kal_uint32
*parameter
, const kal_uint32 array_size
, const kal_uint32 val
)
216 for(i
=0;i
<array_size
;i
++)
218 if (val
== *(parameter
+ i
))
224 battery_xlog_printk(BAT_LOG_CRTI
, "NO register value match \r\n");
225 //TODO: ASSERT(0); // not find the value
230 static kal_uint32
bmt_find_closest_level(const kal_uint32
*pList
,kal_uint32 number
,kal_uint32 level
)
233 kal_uint32 max_value_in_last_element
;
235 if(pList
[0] < pList
[1])
236 max_value_in_last_element
= KAL_TRUE
;
238 max_value_in_last_element
= KAL_FALSE
;
240 if(max_value_in_last_element
== KAL_TRUE
)
242 for(i
= (number
-1); i
!= 0; i
--) //max value in the last element
244 if(pList
[i
] <= level
)
250 battery_xlog_printk(BAT_LOG_CRTI
, "Can't find closest level \r\n");
252 //return CHARGE_CURRENT_0_00_MA;
256 for(i
= 0; i
< number
; i
++) // max value in the first element
258 if(pList
[i
] <= level
)
264 battery_xlog_printk(BAT_LOG_CRTI
, "Can't find closest level \r\n");
265 return pList
[number
-1];
266 //return CHARGE_CURRENT_0_00_MA;
270 #if defined(CONFIG_POWER_EXT)
272 static void hw_bc11_dump_register(void)
274 kal_uint32 reg_val
= 0;
275 kal_uint32 reg_num
= CHR_CON18
;
278 for(i
=reg_num
; i
<=CHR_CON19
; i
+=2)
280 reg_val
= upmu_get_reg_value(i
);
281 battery_xlog_printk(BAT_LOG_FULL
, "Chr Reg[0x%x]=0x%x \r\n", i
, reg_val
);
286 static void hw_bc11_init(void)
290 Charger_Detect_Init();
293 upmu_set_rg_bc11_bias_en(0x1);
294 //RG_BC11_VSRC_EN[1:0]=00
295 upmu_set_rg_bc11_vsrc_en(0x0);
296 //RG_BC11_VREF_VTH = [1:0]=00
297 upmu_set_rg_bc11_vref_vth(0x0);
298 //RG_BC11_CMP_EN[1.0] = 00
299 upmu_set_rg_bc11_cmp_en(0x0);
300 //RG_BC11_IPU_EN[1.0] = 00
301 upmu_set_rg_bc11_ipu_en(0x0);
302 //RG_BC11_IPD_EN[1.0] = 00
303 upmu_set_rg_bc11_ipd_en(0x0);
305 upmu_set_rg_bc11_rst(0x1);
307 upmu_set_rg_bc11_bb_ctrl(0x1);
312 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
314 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_init() \r\n");
315 hw_bc11_dump_register();
321 static U32
hw_bc11_DCD(void)
323 U32 wChargerAvail
= 0;
325 //RG_BC11_IPU_EN[1.0] = 10
326 upmu_set_rg_bc11_ipu_en(0x2);
327 //RG_BC11_IPD_EN[1.0] = 01
328 upmu_set_rg_bc11_ipd_en(0x1);
329 //RG_BC11_VREF_VTH = [1:0]=01
330 upmu_set_rg_bc11_vref_vth(0x1);
331 //RG_BC11_CMP_EN[1.0] = 10
332 upmu_set_rg_bc11_cmp_en(0x2);
337 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
339 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
341 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_DCD() \r\n");
342 hw_bc11_dump_register();
345 //RG_BC11_IPU_EN[1.0] = 00
346 upmu_set_rg_bc11_ipu_en(0x0);
347 //RG_BC11_IPD_EN[1.0] = 00
348 upmu_set_rg_bc11_ipd_en(0x0);
349 //RG_BC11_CMP_EN[1.0] = 00
350 upmu_set_rg_bc11_cmp_en(0x0);
351 //RG_BC11_VREF_VTH = [1:0]=00
352 upmu_set_rg_bc11_vref_vth(0x0);
354 return wChargerAvail
;
358 static U32
hw_bc11_stepA1(void)
360 U32 wChargerAvail
= 0;
362 //RG_BC11_IPU_EN[1.0] = 10
363 upmu_set_rg_bc11_ipu_en(0x2);
364 //RG_BC11_VREF_VTH = [1:0]=10
365 upmu_set_rg_bc11_vref_vth(0x2);
366 //RG_BC11_CMP_EN[1.0] = 10
367 upmu_set_rg_bc11_cmp_en(0x2);
372 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
374 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
376 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_stepA1() \r\n");
377 hw_bc11_dump_register();
380 //RG_BC11_IPU_EN[1.0] = 00
381 upmu_set_rg_bc11_ipu_en(0x0);
382 //RG_BC11_CMP_EN[1.0] = 00
383 upmu_set_rg_bc11_cmp_en(0x0);
385 return wChargerAvail
;
389 static U32
hw_bc11_stepB1(void)
391 U32 wChargerAvail
= 0;
393 //RG_BC11_IPU_EN[1.0] = 01
394 //upmu_set_rg_bc11_ipu_en(0x1);
395 upmu_set_rg_bc11_ipd_en(0x1);
396 //RG_BC11_VREF_VTH = [1:0]=10
397 //upmu_set_rg_bc11_vref_vth(0x2);
398 upmu_set_rg_bc11_vref_vth(0x0);
399 //RG_BC11_CMP_EN[1.0] = 01
400 upmu_set_rg_bc11_cmp_en(0x1);
405 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
407 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
409 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_stepB1() \r\n");
410 hw_bc11_dump_register();
413 //RG_BC11_IPU_EN[1.0] = 00
414 upmu_set_rg_bc11_ipu_en(0x0);
415 //RG_BC11_CMP_EN[1.0] = 00
416 upmu_set_rg_bc11_cmp_en(0x0);
417 //RG_BC11_VREF_VTH = [1:0]=00
418 upmu_set_rg_bc11_vref_vth(0x0);
420 return wChargerAvail
;
424 static U32
hw_bc11_stepC1(void)
426 U32 wChargerAvail
= 0;
428 //RG_BC11_IPU_EN[1.0] = 01
429 upmu_set_rg_bc11_ipu_en(0x1);
430 //RG_BC11_VREF_VTH = [1:0]=10
431 upmu_set_rg_bc11_vref_vth(0x2);
432 //RG_BC11_CMP_EN[1.0] = 01
433 upmu_set_rg_bc11_cmp_en(0x1);
438 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
440 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
442 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_stepC1() \r\n");
443 hw_bc11_dump_register();
446 //RG_BC11_IPU_EN[1.0] = 00
447 upmu_set_rg_bc11_ipu_en(0x0);
448 //RG_BC11_CMP_EN[1.0] = 00
449 upmu_set_rg_bc11_cmp_en(0x0);
450 //RG_BC11_VREF_VTH = [1:0]=00
451 upmu_set_rg_bc11_vref_vth(0x0);
453 return wChargerAvail
;
457 static U32
hw_bc11_stepA2(void)
459 U32 wChargerAvail
= 0;
461 //RG_BC11_VSRC_EN[1.0] = 10
462 upmu_set_rg_bc11_vsrc_en(0x2);
463 //RG_BC11_IPD_EN[1:0] = 01
464 upmu_set_rg_bc11_ipd_en(0x1);
465 //RG_BC11_VREF_VTH = [1:0]=00
466 upmu_set_rg_bc11_vref_vth(0x0);
467 //RG_BC11_CMP_EN[1.0] = 01
468 upmu_set_rg_bc11_cmp_en(0x1);
473 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
475 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
477 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_stepA2() \r\n");
478 hw_bc11_dump_register();
481 //RG_BC11_VSRC_EN[1:0]=00
482 upmu_set_rg_bc11_vsrc_en(0x0);
483 //RG_BC11_IPD_EN[1.0] = 00
484 upmu_set_rg_bc11_ipd_en(0x0);
485 //RG_BC11_CMP_EN[1.0] = 00
486 upmu_set_rg_bc11_cmp_en(0x0);
488 return wChargerAvail
;
492 static U32
hw_bc11_stepB2(void)
494 U32 wChargerAvail
= 0;
496 //RG_BC11_IPU_EN[1:0]=10
497 upmu_set_rg_bc11_ipu_en(0x2);
498 //RG_BC11_VREF_VTH = [1:0]=10
499 upmu_set_rg_bc11_vref_vth(0x1);
500 //RG_BC11_CMP_EN[1.0] = 01
501 upmu_set_rg_bc11_cmp_en(0x1);
506 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
508 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
510 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_stepB2() \r\n");
511 hw_bc11_dump_register();
514 //RG_BC11_IPU_EN[1.0] = 00
515 upmu_set_rg_bc11_ipu_en(0x0);
516 //RG_BC11_CMP_EN[1.0] = 00
517 upmu_set_rg_bc11_cmp_en(0x0);
518 //RG_BC11_VREF_VTH = [1:0]=00
519 upmu_set_rg_bc11_vref_vth(0x0);
521 return wChargerAvail
;
525 static void hw_bc11_done(void)
527 //RG_BC11_VSRC_EN[1:0]=00
528 upmu_set_rg_bc11_vsrc_en(0x0);
529 //RG_BC11_VREF_VTH = [1:0]=0
530 upmu_set_rg_bc11_vref_vth(0x0);
531 //RG_BC11_CMP_EN[1.0] = 00
532 upmu_set_rg_bc11_cmp_en(0x0);
533 //RG_BC11_IPU_EN[1.0] = 00
534 upmu_set_rg_bc11_ipu_en(0x0);
535 //RG_BC11_IPD_EN[1.0] = 00
536 upmu_set_rg_bc11_ipd_en(0x0);
538 upmu_set_rg_bc11_bias_en(0x0);
541 Charger_Detect_Release();
543 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
545 battery_xlog_printk(BAT_LOG_FULL
, "hw_bc11_done() \r\n");
546 hw_bc11_dump_register();
552 static kal_uint32
charging_hw_init(void *data
)
554 kal_uint32 status
= STATUS_OK
;
555 #ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
556 mt_set_gpio_mode(vin_sel_gpio_number
,0); // 0:GPIO mode
557 mt_set_gpio_dir(vin_sel_gpio_number
,0); // 0: input, 1: output
560 #if defined(CONFIG_MTK_WIRELESS_CHARGER_SUPPORT)
561 mt_set_gpio_mode(wireless_charger_gpio_number
,0); // 0:GPIO mode
562 mt_set_gpio_dir(wireless_charger_gpio_number
,0); // 0: input, 1: output
564 upmu_set_rg_chrwdt_td(0x0); // CHRWDT_TD, 4s
565 upmu_set_rg_chrwdt_int_en(1); // CHRWDT_INT_EN
566 upmu_set_rg_chrwdt_en(1); // CHRWDT_EN
567 upmu_set_rg_chrwdt_wr(1); // CHRWDT_WR
569 upmu_set_rg_vcdt_mode(0); //VCDT_MODE
570 upmu_set_rg_vcdt_hv_en(1); //VCDT_HV_EN
572 upmu_set_rg_usbdl_set(0); //force leave USBDL mode
573 upmu_set_rg_usbdl_rst(1); //force leave USBDL mode
575 upmu_set_rg_bc11_bb_ctrl(1); //BC11_BB_CTRL
576 upmu_set_rg_bc11_rst(1); //BC11_RST
578 upmu_set_rg_csdac_mode(1); //CSDAC_MODE
579 upmu_set_rg_vbat_ov_en(1); //VBAT_OV_EN
580 #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT
581 upmu_set_rg_vbat_ov_vth(0x2); //VBAT_OV_VTH, 4.4V,
583 upmu_set_rg_vbat_ov_vth(0x1); //VBAT_OV_VTH, 4.3V,
585 upmu_set_rg_baton_en(1); //BATON_EN
588 //upmu_set_rg_buf_pwd_b(1); //RG_BUF_PWD_B
589 upmu_set_rg_baton_ht_en(0); //BATON_HT_EN
591 upmu_set_rg_ulc_det_en(1); // RG_ULC_DET_EN=1
592 upmu_set_rg_low_ich_db(1); // RG_LOW_ICH_DB=000001'b
594 #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)
595 upmu_set_rg_chrwdt_td(0x0); // CHRWDT_TD, 4s
596 upmu_set_rg_chrwdt_wr(1); // CHRWDT_WR
597 upmu_set_rg_chrwdt_int_en(1); // CHRWDT_INT_EN
598 upmu_set_rg_chrwdt_en(1); // CHRWDT_EN
599 upmu_set_rg_chrwdt_flag_wr(1); // CHRWDT_WR
601 upmu_set_rg_csdac_dly(0x0); // CSDAC_DLY
602 upmu_set_rg_csdac_stp(0x1); // CSDAC_STP
603 upmu_set_rg_csdac_stp_inc(0x1); // CSDAC_STP_INC
604 upmu_set_rg_csdac_stp_dec(0x7); // CSDAC_STP_DEC
605 upmu_set_rg_cs_en(1); // CS_EN
607 upmu_set_rg_hwcv_en(1);
608 upmu_set_rg_vbat_cv_en(1); // CV_EN
609 upmu_set_rg_csdac_en(1); // CSDAC_EN
610 upmu_set_rg_chr_en(1); // CHR_EN
612 #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT) && defined(MTK_LOAD_SWITCH_FPF3040)
613 upmu_set_rg_chr_en(0); // CHR_EN
620 static kal_uint32
charging_dump_register(void *data
)
622 kal_uint32 status
= STATUS_OK
;
624 kal_uint32 reg_val
= 0;
625 kal_uint32 reg_num
= CHR_CON0
;
628 for(i
=reg_num
; i
<=CHR_CON29
; i
+=2)
630 reg_val
= upmu_get_reg_value(i
);
631 battery_xlog_printk(BAT_LOG_FULL
, "Chr Reg[0x%x]=0x%x \r\n", i
, reg_val
);
638 static kal_uint32
charging_enable(void *data
)
640 kal_uint32 status
= STATUS_OK
;
641 kal_uint32 enable
= *(kal_uint32
*)(data
);
643 if(KAL_TRUE
== enable
)
645 upmu_set_rg_csdac_dly(0x4); // CSDAC_DLY
646 upmu_set_rg_csdac_stp(0x1); // CSDAC_STP
647 upmu_set_rg_csdac_stp_inc(0x1); // CSDAC_STP_INC
648 upmu_set_rg_csdac_stp_dec(0x2); // CSDAC_STP_DEC
649 upmu_set_rg_cs_en(1); // CS_EN, check me
651 upmu_set_rg_hwcv_en(1);
653 upmu_set_rg_vbat_cv_en(1); // CV_EN
654 upmu_set_rg_csdac_en(1); // CSDAC_EN
656 upmu_set_rg_pchr_flag_en(1); // enable debug flag output
657 upmu_set_rg_chr_en(1); // CHR_EN
659 if(Enable_BATDRV_LOG
== BAT_LOG_FULL
)
660 charging_dump_register(NULL
);
664 upmu_set_rg_chrwdt_int_en(0); // CHRWDT_INT_EN
665 upmu_set_rg_chrwdt_en(0); // CHRWDT_EN
666 upmu_set_rg_chrwdt_flag_wr(0); // CHRWDT_FLAG
668 upmu_set_rg_csdac_en(0); // CSDAC_EN
669 upmu_set_rg_chr_en(0); // CHR_EN
670 upmu_set_rg_hwcv_en(0); // RG_HWCV_EN
676 static kal_uint32
charging_set_cv_voltage(void *data
)
678 kal_uint32 status
= STATUS_OK
;
679 kal_uint16 register_value
;
681 register_value
= charging_parameter_to_value(VBAT_CV_VTH
, GETARRAYNUM(VBAT_CV_VTH
) ,*(kal_uint32
*)(data
));
682 upmu_set_rg_vbat_cv_vth(register_value
);
688 static kal_uint32
charging_get_current(void *data
)
690 kal_uint32 status
= STATUS_OK
;
691 kal_uint32 array_size
;
692 kal_uint32 reg_value
;
694 array_size
= GETARRAYNUM(CS_VTH
);
695 reg_value
=upmu_get_reg_value(0x8); //RG_CS_VTH
696 *(kal_uint32
*)data
= charging_value_to_parameter(CS_VTH
,array_size
,reg_value
);
703 static kal_uint32
charging_set_current(void *data
)
705 kal_uint32 status
= STATUS_OK
;
706 kal_uint32 set_chr_current
;
707 kal_uint32 array_size
;
708 kal_uint32 register_value
;
710 array_size
= GETARRAYNUM(CS_VTH
);
711 set_chr_current
= bmt_find_closest_level(CS_VTH
, array_size
, *(kal_uint32
*)data
);
712 register_value
= charging_parameter_to_value(CS_VTH
, array_size
,set_chr_current
);
713 upmu_set_rg_cs_vth(register_value
);
719 static kal_uint32
charging_set_input_current(void *data
)
721 kal_uint32 status
= STATUS_OK
;
725 static kal_uint32
charging_get_charging_status(void *data
)
727 kal_uint32 status
= STATUS_OK
;
732 static kal_uint32
charging_reset_watch_dog_timer(void *data
)
734 kal_uint32 status
= STATUS_OK
;
736 upmu_set_rg_chrwdt_td(0x0); // CHRWDT_TD, 4s
737 upmu_set_rg_chrwdt_wr(1); // CHRWDT_WR
738 upmu_set_rg_chrwdt_int_en(1); // CHRWDT_INT_EN
739 upmu_set_rg_chrwdt_en(1); // CHRWDT_EN
740 upmu_set_rg_chrwdt_flag_wr(1); // CHRWDT_WR
746 static kal_uint32
charging_set_hv_threshold(void *data
)
748 kal_uint32 status
= STATUS_OK
;
750 kal_uint32 set_hv_voltage
;
751 kal_uint32 array_size
;
752 kal_uint16 register_value
;
753 kal_uint32 voltage
= *(kal_uint32
*)(data
);
755 array_size
= GETARRAYNUM(VCDT_HV_VTH
);
756 set_hv_voltage
= bmt_find_closest_level(VCDT_HV_VTH
, array_size
, voltage
);
757 register_value
= charging_parameter_to_value(VCDT_HV_VTH
, array_size
,set_hv_voltage
);
758 upmu_set_rg_vcdt_hv_vth(register_value
);
764 static kal_uint32
charging_get_hv_status(void *data
)
766 kal_uint32 status
= STATUS_OK
;
768 *(kal_bool
*)(data
) = upmu_get_rgs_vcdt_hv_det();
774 static kal_uint32
charging_get_battery_status(void *data
)
776 kal_uint32 status
= STATUS_OK
;
778 upmu_set_baton_tdet_en(1);
779 upmu_set_rg_baton_en(1);
780 *(kal_bool
*)(data
) = upmu_get_rgs_baton_undet();
786 static kal_uint32
charging_get_charger_det_status(void *data
)
788 kal_uint32 status
= STATUS_OK
;
791 #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
793 battery_xlog_printk(BAT_LOG_CRTI
,"[charging_get_charger_det_status] charger exist for bring up.\n");
795 #if !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
796 val
= upmu_get_rgs_chrdet();
798 if(((g_diso_state
>> 1) & 0x3) != 0x0 || (upmu_get_rgs_chrdet() && !g_diso_otg
))
806 *(kal_bool
*)(data
) = val
;
808 g_charger_type
= CHARGER_UNKNOWN
;
815 kal_bool
charging_type_detection_done(void)
817 return charging_type_det_done
;
821 static kal_uint32
charging_get_charger_type(void *data
)
823 kal_uint32 status
= STATUS_OK
;
824 #if defined(CONFIG_POWER_EXT)
825 *(CHARGER_TYPE
*)(data
) = STANDARD_HOST
;
827 #if defined(CONFIG_MTK_WIRELESS_CHARGER_SUPPORT)
828 int wireless_state
= 0;
829 wireless_state
= mt_get_gpio_in(wireless_charger_gpio_number
);
830 if(wireless_state
== WIRELESS_CHARGER_EXIST_STATE
)
832 *(CHARGER_TYPE
*)(data
) = WIRELESS_CHARGER
;
833 battery_xlog_printk(BAT_LOG_CRTI
, "WIRELESS_CHARGER!\r\n");
838 if(g_charger_type
!=CHARGER_UNKNOWN
&& g_charger_type
!=WIRELESS_CHARGER
)
840 *(CHARGER_TYPE
*)(data
) = g_charger_type
;
841 battery_xlog_printk(BAT_LOG_CRTI
, "return %d!\r\n", g_charger_type
);
845 charging_type_det_done
= KAL_FALSE
;
847 /********* Step initial ***************/
850 /********* Step DCD ***************/
851 if(1 == hw_bc11_DCD())
853 /********* Step A1 ***************/
854 if(1 == hw_bc11_stepA1())
856 /********* Step B1 ***************/
857 if(1 == hw_bc11_stepB1())
859 //*(CHARGER_TYPE*)(data) = NONSTANDARD_CHARGER;
860 //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Non STANDARD CHARGER!\r\n");
861 *(CHARGER_TYPE
*)(data
) = APPLE_2_1A_CHARGER
;
862 battery_xlog_printk(BAT_LOG_CRTI
, "step B1 : Apple 2.1A CHARGER!\r\n");
866 //*(CHARGER_TYPE*)(data) = APPLE_2_1A_CHARGER;
867 //battery_xlog_printk(BAT_LOG_CRTI, "step B1 : Apple 2.1A CHARGER!\r\n");
868 *(CHARGER_TYPE
*)(data
) = NONSTANDARD_CHARGER
;
869 battery_xlog_printk(BAT_LOG_CRTI
, "step B1 : Non STANDARD CHARGER!\r\n");
874 /********* Step C1 ***************/
875 if(1 == hw_bc11_stepC1())
877 *(CHARGER_TYPE
*)(data
) = APPLE_1_0A_CHARGER
;
878 battery_xlog_printk(BAT_LOG_CRTI
, "step C1 : Apple 1A CHARGER!\r\n");
882 *(CHARGER_TYPE
*)(data
) = APPLE_0_5A_CHARGER
;
883 battery_xlog_printk(BAT_LOG_CRTI
, "step C1 : Apple 0.5A CHARGER!\r\n");
890 /********* Step A2 ***************/
891 if(1 == hw_bc11_stepA2())
893 /********* Step B2 ***************/
894 if(1 == hw_bc11_stepB2())
896 *(CHARGER_TYPE
*)(data
) = STANDARD_CHARGER
;
897 battery_xlog_printk(BAT_LOG_CRTI
, "step B2 : STANDARD CHARGER!\r\n");
901 *(CHARGER_TYPE
*)(data
) = CHARGING_HOST
;
902 battery_xlog_printk(BAT_LOG_CRTI
, "step B2 : Charging Host!\r\n");
907 *(CHARGER_TYPE
*)(data
) = STANDARD_HOST
;
908 battery_xlog_printk(BAT_LOG_CRTI
, "step A2 : Standard USB Host!\r\n");
913 /********* Finally setting *******************************/
916 charging_type_det_done
= KAL_TRUE
;
918 g_charger_type
= *(CHARGER_TYPE
*)(data
);
923 static kal_uint32
charging_get_is_pcm_timer_trigger(void *data
)
925 kal_uint32 status
= STATUS_OK
;
927 #if defined(CONFIG_MTK_FPGA)
928 battery_xlog_printk(BAT_LOG_CRTI
, "[Early porting] no slp_get_wake_reason at FPGA\n");
930 if(slp_get_wake_reason() == WR_PCM_TIMER
)
931 *(kal_bool
*)(data
) = KAL_TRUE
;
933 *(kal_bool
*)(data
) = KAL_FALSE
;
935 battery_xlog_printk(BAT_LOG_CRTI
, "slp_get_wake_reason=%d\n", slp_get_wake_reason());
941 static kal_uint32
charging_set_platform_reset(void *data
)
943 kal_uint32 status
= STATUS_OK
;
945 battery_xlog_printk(BAT_LOG_CRTI
, "charging_set_platform_reset\n");
952 static kal_uint32
charging_get_platfrom_boot_mode(void *data
)
954 kal_uint32 status
= STATUS_OK
;
956 *(kal_uint32
*)(data
) = get_boot_mode();
958 battery_xlog_printk(BAT_LOG_CRTI
, "get_boot_mode=%d\n", get_boot_mode());
963 static kal_uint32
charging_get_power_srouce(void *data
)
965 kal_uint32 status
= STATUS_OK
;
969 static kal_uint32
charging_set_power_off(void *data
)
971 kal_uint32 status
= STATUS_OK
;
973 //battery_xlog_printk(BAT_LOG_CRTI, "charging_set_power_off=%d\n");
974 battery_xlog_printk(BAT_LOG_CRTI
, "charging_set_power_off=\n");
980 static kal_uint32
charging_get_csdac_full_flag(void *data
)
982 kal_uint32 status
= STATUS_OK
;
983 kal_uint32 csdac_value
;
986 csdac_value
= charging_get_csdac_value();
988 if(csdac_value
> 800) //10 bit, treat as full if csdac more than 800
989 *(kal_bool
*)data
= KAL_TRUE
;
991 *(kal_bool
*)data
= KAL_FALSE
;
997 static kal_uint32
charging_set_ta_current_pattern(void *data
)
999 kal_uint32 status
= STATUS_OK
;
1000 kal_uint32 array_size
;
1001 kal_uint32 ta_on_current
= CHARGE_CURRENT_450_00_MA
;
1002 kal_uint32 ta_off_current
= CHARGE_CURRENT_70_00_MA
;
1003 kal_uint32 set_ta_on_current_reg_value
;
1004 kal_uint32 set_ta_off_current_reg_value
;
1005 kal_uint32 increase
= *(kal_uint32
*)(data
);
1007 array_size
= GETARRAYNUM(CS_VTH
);
1008 set_ta_on_current_reg_value
= charging_parameter_to_value(CS_VTH
, array_size
,ta_on_current
);
1009 set_ta_off_current_reg_value
= charging_parameter_to_value(CS_VTH
, array_size
,ta_off_current
);
1011 if(increase
== KAL_TRUE
)
1013 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() start\n");
1015 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1019 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1020 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() on 1");
1022 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1023 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() off 1");
1027 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1028 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() on 2");
1030 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1031 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() off 2");
1035 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1036 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() on 3");
1038 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1039 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() off 3");
1043 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1044 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() on 4");
1046 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1047 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() off 4");
1051 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1052 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() on 5");
1054 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1055 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() off 5");
1059 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1060 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() on 6");
1063 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1064 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() off 6");
1068 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_increase() end \n");
1072 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() start\n");
1074 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1078 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1079 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() on 1");
1081 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1082 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() off 1");
1086 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1087 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() on 2");
1089 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1090 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() off 2");
1094 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1095 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() on 3");
1097 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1098 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() off 3");
1102 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1103 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() on 4");
1105 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1106 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() off 4");
1110 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1111 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() on 5");
1113 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1114 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() off 5");
1118 upmu_set_rg_cs_vth(set_ta_on_current_reg_value
);
1119 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() on 6");
1122 upmu_set_rg_cs_vth(set_ta_off_current_reg_value
);
1123 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() off 6");
1127 battery_xlog_printk(BAT_LOG_CRTI
, "mtk_ta_decrease() end \n");
1133 #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
1134 void set_diso_otg(bool enable
)
1136 g_diso_otg
= enable
;
1139 void set_vusb_auxadc_irq(bool enable
, bool flag
)
1141 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
1142 hrtimer_cancel(&diso_kthread_timer
);
1144 DISO_Polling
.reset_polling
= KAL_TRUE
;
1145 DISO_Polling
.vusb_polling_measure
.notify_irq_en
= enable
;
1146 DISO_Polling
.vusb_polling_measure
.notify_irq
= flag
;
1148 hrtimer_start(&diso_kthread_timer
, ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD
)), HRTIMER_MODE_REL
);
1150 kal_uint16 threshold
= 0;
1153 threshold
= DISO_IRQ
.vusb_measure_channel
.falling_threshold
;
1155 threshold
= DISO_IRQ
.vusb_measure_channel
.rising_threshold
;
1157 threshold
= (threshold
*R_DISO_VBUS_PULL_DOWN
)/(R_DISO_VBUS_PULL_DOWN
+ R_DISO_VBUS_PULL_UP
);
1158 mt_auxadc_enableBackgroundDection(DISO_IRQ
.vusb_measure_channel
.number
, threshold
, \
1159 DISO_IRQ
.vusb_measure_channel
.period
, DISO_IRQ
.vusb_measure_channel
.debounce
, flag
);
1161 mt_auxadc_disableBackgroundDection(DISO_IRQ
.vusb_measure_channel
.number
);
1164 battery_xlog_printk(BAT_LOG_FULL
, " [%s] enable: %d, flag: %d!\n", __func__
, enable
, flag
);
1167 void set_vdc_auxadc_irq(bool enable
, bool flag
)
1169 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
1170 hrtimer_cancel(&diso_kthread_timer
);
1172 DISO_Polling
.reset_polling
= KAL_TRUE
;
1173 DISO_Polling
.vdc_polling_measure
.notify_irq_en
= enable
;
1174 DISO_Polling
.vdc_polling_measure
.notify_irq
= flag
;
1176 hrtimer_start(&diso_kthread_timer
, ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD
)), HRTIMER_MODE_REL
);
1178 kal_uint16 threshold
= 0;
1181 threshold
= DISO_IRQ
.vdc_measure_channel
.falling_threshold
;
1183 threshold
= DISO_IRQ
.vdc_measure_channel
.rising_threshold
;
1185 threshold
= (threshold
*R_DISO_DC_PULL_DOWN
)/(R_DISO_DC_PULL_DOWN
+ R_DISO_DC_PULL_UP
);
1186 mt_auxadc_enableBackgroundDection(DISO_IRQ
.vdc_measure_channel
.number
, threshold
, \
1187 DISO_IRQ
.vdc_measure_channel
.period
, DISO_IRQ
.vdc_measure_channel
.debounce
, flag
);
1189 mt_auxadc_disableBackgroundDection(DISO_IRQ
.vdc_measure_channel
.number
);
1192 battery_xlog_printk(BAT_LOG_FULL
, " [%s] enable: %d, flag: %d!\n", __func__
, enable
, flag
);
1195 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
1196 static void diso_polling_handler(struct work_struct
*work
)
1198 int trigger_channel
= -1;
1199 int trigger_flag
= -1;
1201 if(DISO_Polling
.vdc_polling_measure
.notify_irq_en
)
1202 trigger_channel
= AP_AUXADC_DISO_VDC_CHANNEL
;
1203 else if(DISO_Polling
.vusb_polling_measure
.notify_irq_en
)
1204 trigger_channel
= AP_AUXADC_DISO_VUSB_CHANNEL
;
1206 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]auxadc handler triggered\n" );
1207 switch(trigger_channel
)
1209 case AP_AUXADC_DISO_VDC_CHANNEL
:
1210 trigger_flag
= DISO_Polling
.vdc_polling_measure
.notify_irq
;
1211 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]VDC IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel
, trigger_flag
);
1212 #ifdef MTK_DISCRETE_SWITCH /*for DSC DC plugin handle */
1213 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1214 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1215 set_vusb_auxadc_irq(DISO_IRQ_ENABLE
, DISO_IRQ_FALLING
);
1216 if (trigger_flag
== DISO_IRQ_RISING
) {
1217 DISO_data
.diso_state
.pre_vusb_state
= DISO_ONLINE
;
1218 DISO_data
.diso_state
.pre_vdc_state
= DISO_OFFLINE
;
1219 DISO_data
.diso_state
.pre_otg_state
= DISO_OFFLINE
;
1220 DISO_data
.diso_state
.cur_vusb_state
= DISO_ONLINE
;
1221 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1222 DISO_data
.diso_state
.cur_otg_state
= DISO_OFFLINE
;
1223 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[2]);
1225 #else //for load switch OTG leakage handle
1226 set_vdc_auxadc_irq(DISO_IRQ_ENABLE
, (~trigger_flag
) & 0x1);
1227 if (trigger_flag
== DISO_IRQ_RISING
) {
1228 DISO_data
.diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1229 DISO_data
.diso_state
.pre_vdc_state
= DISO_OFFLINE
;
1230 DISO_data
.diso_state
.pre_otg_state
= DISO_ONLINE
;
1231 DISO_data
.diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1232 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1233 DISO_data
.diso_state
.cur_otg_state
= DISO_ONLINE
;
1234 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[5]);
1235 } else if (trigger_flag
== DISO_IRQ_FALLING
) {
1236 DISO_data
.diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1237 DISO_data
.diso_state
.pre_vdc_state
= DISO_ONLINE
;
1238 DISO_data
.diso_state
.pre_otg_state
= DISO_ONLINE
;
1239 DISO_data
.diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1240 DISO_data
.diso_state
.cur_vdc_state
= DISO_OFFLINE
;
1241 DISO_data
.diso_state
.cur_otg_state
= DISO_ONLINE
;
1242 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[1]);
1245 battery_xlog_printk(BAT_LOG_CRTI
, "[%s] wrong trigger flag!\n",__func__
);
1248 case AP_AUXADC_DISO_VUSB_CHANNEL
:
1249 trigger_flag
= DISO_Polling
.vusb_polling_measure
.notify_irq
;
1250 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]VUSB IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel
, trigger_flag
);
1251 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1252 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1253 if(trigger_flag
== DISO_IRQ_FALLING
) {
1254 DISO_data
.diso_state
.pre_vusb_state
= DISO_ONLINE
;
1255 DISO_data
.diso_state
.pre_vdc_state
= DISO_ONLINE
;
1256 DISO_data
.diso_state
.pre_otg_state
= DISO_OFFLINE
;
1257 DISO_data
.diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1258 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1259 DISO_data
.diso_state
.cur_otg_state
= DISO_OFFLINE
;
1260 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[4]);
1261 } else if (trigger_flag
== DISO_IRQ_RISING
) {
1262 DISO_data
.diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1263 DISO_data
.diso_state
.pre_vdc_state
= DISO_ONLINE
;
1264 DISO_data
.diso_state
.pre_otg_state
= DISO_OFFLINE
;
1265 DISO_data
.diso_state
.cur_vusb_state
= DISO_ONLINE
;
1266 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1267 DISO_data
.diso_state
.cur_otg_state
= DISO_OFFLINE
;
1268 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[6]);
1271 battery_xlog_printk(BAT_LOG_CRTI
, "[%s] wrong trigger flag!\n",__func__
);
1272 set_vusb_auxadc_irq(DISO_IRQ_ENABLE
, (~trigger_flag
)&0x1);
1275 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1276 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1277 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]VUSB auxadc IRQ triggered ERROR OR TEST\n");
1278 return; /* in error or unexecpt state just return */
1281 g_diso_state
= *(int*)&DISO_data
.diso_state
;
1282 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]g_diso_state: 0x%x\n", g_diso_state
);
1283 DISO_data
.irq_callback_func(0, NULL
);
1288 static irqreturn_t
diso_auxadc_irq_handler(int irq
, void *dev_id
)
1290 int trigger_channel
= -1;
1291 int trigger_flag
= -1;
1292 trigger_channel
= mt_auxadc_getCurrentChannel();
1293 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]auxadc handler triggered\n" );
1294 switch(trigger_channel
)
1296 case AP_AUXADC_DISO_VDC_CHANNEL
:
1297 trigger_flag
= mt_auxadc_getCurrentTrigger();
1298 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]VDC IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel
, trigger_flag
);
1299 #ifdef MTK_DISCRETE_SWITCH /*for DSC DC plugin handle */
1300 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1301 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1302 set_vusb_auxadc_irq(DISO_IRQ_ENABLE
, DISO_IRQ_FALLING
);
1303 if (trigger_flag
== DISO_IRQ_RISING
) {
1304 DISO_data
.diso_state
.pre_vusb_state
= DISO_ONLINE
;
1305 DISO_data
.diso_state
.pre_vdc_state
= DISO_OFFLINE
;
1306 DISO_data
.diso_state
.pre_otg_state
= DISO_OFFLINE
;
1307 DISO_data
.diso_state
.cur_vusb_state
= DISO_ONLINE
;
1308 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1309 DISO_data
.diso_state
.cur_otg_state
= DISO_OFFLINE
;
1310 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[2]);
1312 #else //for load switch OTG leakage handle
1313 set_vdc_auxadc_irq(DISO_IRQ_ENABLE
, (~trigger_flag
) & 0x1);
1314 if (trigger_flag
== DISO_IRQ_RISING
) {
1315 DISO_data
.diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1316 DISO_data
.diso_state
.pre_vdc_state
= DISO_OFFLINE
;
1317 DISO_data
.diso_state
.pre_otg_state
= DISO_ONLINE
;
1318 DISO_data
.diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1319 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1320 DISO_data
.diso_state
.cur_otg_state
= DISO_ONLINE
;
1321 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[5]);
1323 DISO_data
.diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1324 DISO_data
.diso_state
.pre_vdc_state
= DISO_ONLINE
;
1325 DISO_data
.diso_state
.pre_otg_state
= DISO_ONLINE
;
1326 DISO_data
.diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1327 DISO_data
.diso_state
.cur_vdc_state
= DISO_OFFLINE
;
1328 DISO_data
.diso_state
.cur_otg_state
= DISO_ONLINE
;
1329 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[1]);
1333 case AP_AUXADC_DISO_VUSB_CHANNEL
:
1334 trigger_flag
= mt_auxadc_getCurrentTrigger();
1335 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]VUSB IRQ triggered, channel ==%d, flag ==%d\n", trigger_channel
, trigger_flag
);
1336 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1337 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1338 if(trigger_flag
== DISO_IRQ_FALLING
) {
1339 DISO_data
.diso_state
.pre_vusb_state
= DISO_ONLINE
;
1340 DISO_data
.diso_state
.pre_vdc_state
= DISO_ONLINE
;
1341 DISO_data
.diso_state
.pre_otg_state
= DISO_OFFLINE
;
1342 DISO_data
.diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1343 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1344 DISO_data
.diso_state
.cur_otg_state
= DISO_OFFLINE
;
1345 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[4]);
1347 DISO_data
.diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1348 DISO_data
.diso_state
.pre_vdc_state
= DISO_ONLINE
;
1349 DISO_data
.diso_state
.pre_otg_state
= DISO_OFFLINE
;
1350 DISO_data
.diso_state
.cur_vusb_state
= DISO_ONLINE
;
1351 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1352 DISO_data
.diso_state
.cur_otg_state
= DISO_OFFLINE
;
1353 battery_xlog_printk(BAT_LOG_CRTI
, " cur diso_state is %s!\n",DISO_state_s
[6]);
1356 set_vusb_auxadc_irq(DISO_IRQ_ENABLE
, (~trigger_flag
)&0x1);
1359 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1360 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1361 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO]VUSB auxadc IRQ triggered ERROR OR TEST\n");
1362 return IRQ_HANDLED
; /* in error or unexecpt state just return */
1364 g_diso_state
= *(int*)&DISO_data
.diso_state
;
1365 return IRQ_WAKE_THREAD
;
1369 #if defined(MTK_DISCRETE_SWITCH) && defined(MTK_DSC_USE_EINT)
1370 void vdc_eint_handler()
1372 battery_xlog_printk(BAT_LOG_CRTI
, "[diso_eint] vdc eint irq triger\n");
1373 DISO_data
.diso_state
.cur_vdc_state
= DISO_ONLINE
;
1374 mt_eint_mask(CUST_EINT_VDC_NUM
);
1375 do_chrdet_int_task();
1379 static kal_uint32
diso_get_current_voltage(int Channel
)
1381 int ret
= 0, data
[4], i
, ret_value
= 0, ret_temp
= 0, times
= 5;
1383 if( IMM_IsAdcInitReady() == 0 ) {
1384 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO] AUXADC is not ready");
1391 ret_value
= IMM_GetOneChannelValue(Channel
, data
, &ret_temp
);
1392 if(ret_value
== 0) {
1395 times
= times
> 1 ? times
- 1 : 1;
1396 battery_xlog_printk(BAT_LOG_CRTI
, "[diso_get_current_voltage] ret_value=%d, times=%d\n",
1401 ret
= ret
*1500/4096 ;
1407 static void _get_diso_interrupt_state(void)
1411 int check_times
= 30;
1412 kal_bool vin_state
= KAL_FALSE
;
1414 #ifndef VIN_SEL_FLAG
1415 mdelay(AUXADC_CHANNEL_DELAY_PERIOD
);
1418 vol
= diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL
);
1419 vol
=(R_DISO_DC_PULL_UP
+ R_DISO_DC_PULL_DOWN
)*100*vol
/(R_DISO_DC_PULL_DOWN
)/100;
1420 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO] Current DC voltage mV = %d\n", vol
);
1423 /* set gpio mode for kpoc issue as DWS has no default setting */
1424 mt_set_gpio_mode(vin_sel_gpio_number
,0); // 0:GPIO mode
1425 mt_set_gpio_dir(vin_sel_gpio_number
,0); // 0: input, 1: output
1427 if (vol
> VDC_MIN_VOLTAGE
/1000 && vol
< VDC_MAX_VOLTAGE
/1000) {
1428 /* make sure load switch already switch done */
1431 #ifdef VIN_SEL_FLAG_DEFAULT_LOW
1432 vin_state
= mt_get_gpio_in(vin_sel_gpio_number
);
1434 vin_state
= mt_get_gpio_in(vin_sel_gpio_number
);
1435 vin_state
= (~vin_state
) & 0x1;
1439 } while ((!vin_state
) && check_times
);
1440 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO] i==%d gpio_state= %d\n",
1441 check_times
, mt_get_gpio_in(vin_sel_gpio_number
));
1443 if (0 == check_times
)
1444 diso_state
&= ~0x4; //SET DC bit as 0
1446 diso_state
|= 0x4; //SET DC bit as 1
1448 diso_state
&= ~0x4; //SET DC bit as 0
1451 mdelay(SWITCH_RISING_TIMING
+ LOAD_SWITCH_TIMING_MARGIN
); /* force delay for switching as no flag for check switching done */
1452 if (vol
> VDC_MIN_VOLTAGE
/1000 && vol
< VDC_MAX_VOLTAGE
/1000)
1453 diso_state
|= 0x4; //SET DC bit as 1
1455 diso_state
&= ~0x4; //SET DC bit as 0
1459 vol
= diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL
);
1460 vol
=(R_DISO_VBUS_PULL_UP
+ R_DISO_VBUS_PULL_DOWN
)*100*vol
/(R_DISO_VBUS_PULL_DOWN
)/100;
1461 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO] Current VBUS voltage mV = %d\n",vol
);
1463 if (vol
> VBUS_MIN_VOLTAGE
/1000 && vol
< VBUS_MAX_VOLTAGE
/1000) {
1464 if(!mt_usb_is_device()) {
1465 diso_state
|= 0x1; //SET OTG bit as 1
1466 diso_state
&= ~0x2; //SET VBUS bit as 0
1468 diso_state
&= ~0x1; //SET OTG bit as 0
1469 diso_state
|= 0x2; //SET VBUS bit as 1;
1473 diso_state
&= 0x4; //SET OTG and VBUS bit as 0
1475 battery_xlog_printk(BAT_LOG_CRTI
, "[DISO] DISO_STATE==0x%x \n",diso_state
);
1476 g_diso_state
= diso_state
;
1479 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
1480 int _get_irq_direction(int pre_vol
, int cur_vol
)
1485 if((cur_vol
- pre_vol
) > 1000)
1486 ret
= DISO_IRQ_RISING
;
1487 else if((pre_vol
- cur_vol
) > 1000)
1488 ret
= DISO_IRQ_FALLING
;
1493 static void _get_polling_state(void)
1495 int vdc_vol
= 0, vusb_vol
= 0;
1496 int vdc_vol_dir
= -1;
1497 int vusb_vol_dir
= -1;
1499 DISO_polling_channel
* VDC_Polling
= &DISO_Polling
.vdc_polling_measure
;
1500 DISO_polling_channel
* VUSB_Polling
= &DISO_Polling
.vusb_polling_measure
;
1502 vdc_vol
= diso_get_current_voltage(AP_AUXADC_DISO_VDC_CHANNEL
);
1503 vdc_vol
=(R_DISO_DC_PULL_UP
+ R_DISO_DC_PULL_DOWN
)*100*vdc_vol
/(R_DISO_DC_PULL_DOWN
)/100;
1505 vusb_vol
= diso_get_current_voltage(AP_AUXADC_DISO_VUSB_CHANNEL
);
1506 vusb_vol
=(R_DISO_VBUS_PULL_UP
+ R_DISO_VBUS_PULL_DOWN
)*100*vusb_vol
/(R_DISO_VBUS_PULL_DOWN
)/100;
1508 VDC_Polling
->preVoltage
= VDC_Polling
->curVoltage
;
1509 VUSB_Polling
->preVoltage
= VUSB_Polling
->curVoltage
;
1510 VDC_Polling
->curVoltage
= vdc_vol
;
1511 VUSB_Polling
->curVoltage
= vusb_vol
;
1513 if (DISO_Polling
.reset_polling
)
1515 DISO_Polling
.reset_polling
= KAL_FALSE
;
1516 VDC_Polling
->preVoltage
= vdc_vol
;
1517 VUSB_Polling
->preVoltage
= vusb_vol
;
1520 vdc_vol_dir
= DISO_IRQ_RISING
;
1522 vdc_vol_dir
= DISO_IRQ_FALLING
;
1525 vusb_vol_dir
= DISO_IRQ_RISING
;
1527 vusb_vol_dir
= DISO_IRQ_FALLING
;
1531 //get voltage direction
1532 vdc_vol_dir
= _get_irq_direction(VDC_Polling
->preVoltage
, VDC_Polling
->curVoltage
);
1533 vusb_vol_dir
= _get_irq_direction(VUSB_Polling
->preVoltage
, VUSB_Polling
->curVoltage
);
1536 if(VDC_Polling
->notify_irq_en
&&
1537 (vdc_vol_dir
== VDC_Polling
->notify_irq
)) {
1538 schedule_delayed_work(&diso_polling_work
, 10*HZ
/1000); //10ms
1539 battery_xlog_printk(BAT_LOG_CRTI
, "[%s] ready to trig VDC irq, irq: %d\n",
1540 __func__
,VDC_Polling
->notify_irq
);
1541 } else if(VUSB_Polling
->notify_irq_en
&&
1542 (vusb_vol_dir
== VUSB_Polling
->notify_irq
)) {
1543 schedule_delayed_work(&diso_polling_work
, 10*HZ
/1000);
1544 battery_xlog_printk(BAT_LOG_CRTI
, "[%s] ready to trig VUSB irq, irq: %d\n",
1545 __func__
, VUSB_Polling
->notify_irq
);
1546 } else if((vdc_vol
== 0) && (vusb_vol
== 0)) {
1547 VDC_Polling
->notify_irq_en
= 0;
1548 VUSB_Polling
->notify_irq_en
= 0;
1554 enum hrtimer_restart
diso_kthread_hrtimer_func(struct hrtimer
*timer
)
1556 diso_thread_timeout
= KAL_TRUE
;
1557 wake_up(&diso_polling_thread_wq
);
1559 return HRTIMER_NORESTART
;
1562 int diso_thread_kthread(void *x
)
1564 /* Run on a process content */
1566 wait_event(diso_polling_thread_wq
, (diso_thread_timeout
== KAL_TRUE
));
1568 diso_thread_timeout
= KAL_FALSE
;
1570 mutex_lock(&diso_polling_mutex
);
1572 _get_polling_state();
1574 if (DISO_Polling
.vdc_polling_measure
.notify_irq_en
||
1575 DISO_Polling
.vusb_polling_measure
.notify_irq_en
)
1576 hrtimer_start(&diso_kthread_timer
,ktime_set(0, MSEC_TO_NSEC(SW_POLLING_PERIOD
)),HRTIMER_MODE_REL
);
1578 hrtimer_cancel(&diso_kthread_timer
);
1580 mutex_unlock(&diso_polling_mutex
);
1589 static kal_uint32
charging_get_error_state(void)
1591 return charging_error
;
1594 static kal_uint32
charging_set_error_state(void *data
)
1596 kal_uint32 status
= STATUS_OK
;
1597 charging_error
= *(kal_uint32
*)(data
);
1602 static kal_uint32
charging_diso_init(void *data
)
1604 kal_uint32 status
= STATUS_OK
;
1606 #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
1607 DISO_ChargerStruct
*pDISO_data
= (DISO_ChargerStruct
*)data
;
1609 /* Initialization DISO Struct */
1610 pDISO_data
->diso_state
.cur_otg_state
= DISO_OFFLINE
;
1611 pDISO_data
->diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1612 pDISO_data
->diso_state
.cur_vdc_state
= DISO_OFFLINE
;
1614 pDISO_data
->diso_state
.pre_otg_state
= DISO_OFFLINE
;
1615 pDISO_data
->diso_state
.pre_vusb_state
= DISO_OFFLINE
;
1616 pDISO_data
->diso_state
.pre_vdc_state
= DISO_OFFLINE
;
1618 pDISO_data
->chr_get_diso_state
= KAL_FALSE
;
1619 pDISO_data
->hv_voltage
= VBUS_MAX_VOLTAGE
;
1621 #if !defined(MTK_AUXADC_IRQ_SUPPORT)
1622 hrtimer_init(&diso_kthread_timer
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
1623 diso_kthread_timer
.function
= diso_kthread_hrtimer_func
;
1624 INIT_DELAYED_WORK(&diso_polling_work
, diso_polling_handler
);
1626 kthread_run(diso_thread_kthread
, NULL
, "diso_thread_kthread");
1627 battery_xlog_printk(BAT_LOG_CRTI
, "[%s] done\n", __func__
);
1629 struct device_node
*node
;
1632 //Initial AuxADC IRQ
1633 DISO_data
.irq_line_number
= LOWBATTERY_IRQ_ID
;
1634 DISO_IRQ
.vdc_measure_channel
.number
= AP_AUXADC_DISO_VDC_CHANNEL
;
1635 DISO_IRQ
.vusb_measure_channel
.number
= AP_AUXADC_DISO_VUSB_CHANNEL
;
1636 DISO_IRQ
.vdc_measure_channel
.period
= AUXADC_CHANNEL_DELAY_PERIOD
;
1637 DISO_IRQ
.vusb_measure_channel
.period
= AUXADC_CHANNEL_DELAY_PERIOD
;
1638 DISO_IRQ
.vdc_measure_channel
.debounce
= AUXADC_CHANNEL_DEBOUNCE
;
1639 DISO_IRQ
.vusb_measure_channel
.debounce
= AUXADC_CHANNEL_DEBOUNCE
;
1641 /* use default threshold voltage, if use high voltage,maybe refine*/
1642 DISO_IRQ
.vusb_measure_channel
.falling_threshold
= VBUS_MIN_VOLTAGE
/1000;
1643 DISO_IRQ
.vdc_measure_channel
.falling_threshold
= VDC_MIN_VOLTAGE
/1000;
1644 DISO_IRQ
.vusb_measure_channel
.rising_threshold
= VBUS_MIN_VOLTAGE
/1000;
1645 DISO_IRQ
.vdc_measure_channel
.rising_threshold
= VDC_MIN_VOLTAGE
/1000;
1647 mt_irq_set_sens(pDISO_data
->irq_line_number
, MT_EDGE_SENSITIVE
);
1648 mt_irq_set_polarity(pDISO_data
->irq_line_number
, MT_POLARITY_LOW
);
1650 ret
= request_threaded_irq(pDISO_data
->irq_line_number
, diso_auxadc_irq_handler
, \
1651 pDISO_data
->irq_callback_func
, IRQF_ONESHOT
, "DISO_ADC_IRQ", NULL
);
1654 battery_xlog_printk(BAT_LOG_CRTI
, "[diso_adc]: request_irq failed.\n");
1656 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1657 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1658 battery_xlog_printk(BAT_LOG_CRTI
, "[diso_adc]: diso_init success.\n");
1662 #if defined(MTK_DISCRETE_SWITCH) && defined(MTK_DSC_USE_EINT)
1663 battery_xlog_printk(BAT_LOG_CRTI
, "[diso_eint]vdc eint irq registitation\n");
1664 mt_eint_set_hw_debounce(CUST_EINT_VDC_NUM
, CUST_EINT_VDC_DEBOUNCE_CN
);
1665 mt_eint_registration(CUST_EINT_VDC_NUM
, CUST_EINTF_TRIGGER_LOW
, vdc_eint_handler
, 0);
1666 mt_eint_mask(CUST_EINT_VDC_NUM
);
1673 static kal_uint32
charging_get_diso_state(void *data
)
1675 kal_uint32 status
= STATUS_OK
;
1677 #if defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
1678 int diso_state
= 0x0;
1679 DISO_ChargerStruct
*pDISO_data
= (DISO_ChargerStruct
*)data
;
1681 _get_diso_interrupt_state();
1682 diso_state
= g_diso_state
;
1683 battery_xlog_printk(BAT_LOG_CRTI
, "[do_chrdet_int_task] current diso state is %s!\n", DISO_state_s
[diso_state
]);
1684 if(((diso_state
>> 1) & 0x3) != 0x0)
1686 switch (diso_state
){
1688 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1689 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1690 #ifdef MTK_DISCRETE_SWITCH
1691 #ifdef MTK_DSC_USE_EINT
1692 mt_eint_unmask(CUST_EINT_VDC_NUM
);
1694 set_vdc_auxadc_irq(DISO_IRQ_ENABLE
, 1);
1697 pDISO_data
->diso_state
.cur_vusb_state
= DISO_ONLINE
;
1698 pDISO_data
->diso_state
.cur_vdc_state
= DISO_OFFLINE
;
1699 pDISO_data
->diso_state
.cur_otg_state
= DISO_OFFLINE
;
1702 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1703 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1704 set_vusb_auxadc_irq(DISO_IRQ_ENABLE
, DISO_IRQ_RISING
);
1705 pDISO_data
->diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1706 pDISO_data
->diso_state
.cur_vdc_state
= DISO_ONLINE
;
1707 pDISO_data
->diso_state
.cur_otg_state
= DISO_OFFLINE
;
1710 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1711 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1712 set_vusb_auxadc_irq(DISO_IRQ_ENABLE
,DISO_IRQ_FALLING
);
1713 pDISO_data
->diso_state
.cur_vusb_state
= DISO_ONLINE
;
1714 pDISO_data
->diso_state
.cur_vdc_state
= DISO_ONLINE
;
1715 pDISO_data
->diso_state
.cur_otg_state
= DISO_OFFLINE
;
1718 set_vdc_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1719 set_vusb_auxadc_irq(DISO_IRQ_DISABLE
, 0);
1720 pDISO_data
->diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1721 pDISO_data
->diso_state
.cur_vdc_state
= DISO_ONLINE
;
1722 pDISO_data
->diso_state
.cur_otg_state
= DISO_ONLINE
;
1724 default: // OTG only also can trigger vcdt IRQ
1725 pDISO_data
->diso_state
.cur_vusb_state
= DISO_OFFLINE
;
1726 pDISO_data
->diso_state
.cur_vdc_state
= DISO_OFFLINE
;
1727 pDISO_data
->diso_state
.cur_otg_state
= DISO_ONLINE
;
1728 battery_xlog_printk(BAT_LOG_CRTI
, " switch load vcdt irq triggerd by OTG Boost!\n");
1729 break; // OTG plugin no need battery sync action
1733 if (DISO_ONLINE
== pDISO_data
->diso_state
.cur_vdc_state
)
1734 pDISO_data
->hv_voltage
= VDC_MAX_VOLTAGE
;
1736 pDISO_data
->hv_voltage
= VBUS_MAX_VOLTAGE
;
1743 static kal_uint32 (*charging_func
[CHARGING_CMD_NUMBER
])(void *data
)=
1746 ,charging_dump_register
1748 ,charging_set_cv_voltage
1749 ,charging_get_current
1750 ,charging_set_current
1751 ,charging_set_input_current
// not support, empty function
1752 ,charging_get_charging_status
// not support, empty function
1753 ,charging_reset_watch_dog_timer
1754 ,charging_set_hv_threshold
1755 ,charging_get_hv_status
1756 ,charging_get_battery_status
1757 ,charging_get_charger_det_status
1758 ,charging_get_charger_type
1759 ,charging_get_is_pcm_timer_trigger
1760 ,charging_set_platform_reset
1761 ,charging_get_platfrom_boot_mode
1762 ,charging_set_power_off
1763 ,charging_get_power_srouce
1764 ,charging_get_csdac_full_flag
1765 ,charging_set_ta_current_pattern
1766 ,charging_set_error_state
1768 ,charging_get_diso_state
1774 * Internal_chr_control_handler
1777 * This function is called to set the charger hw
1790 kal_int32
chr_control_interface(CHARGING_CTRL_CMD cmd
, void *data
)
1793 if(cmd
< CHARGING_CMD_NUMBER
)
1794 status
= charging_func
[cmd
](data
);
1796 return STATUS_UNSUPPORTED
;