1 #include <generated/autoconf.h>
2 #include <linux/kernel.h>
3 #include <linux/init.h>
4 #include <linux/module.h>
5 #include <linux/slab.h>
6 #include <linux/sched.h>
7 #include <linux/spinlock.h>
8 #include <linux/interrupt.h>
9 #include <linux/list.h>
10 #include <linux/mutex.h>
11 #include <linux/kthread.h>
12 #include <linux/wakelock.h>
13 #include <linux/device.h>
14 #include <linux/kdev_t.h>
16 #include <linux/cdev.h>
17 #include <linux/delay.h>
18 #include <linux/platform_device.h>
19 #include <linux/aee.h>
20 #include <linux/xlog.h>
21 #include <linux/proc_fs.h>
22 #include <linux/syscalls.h>
23 #include <linux/sched.h>
24 #include <linux/writeback.h>
25 #include <linux/earlysuspend.h>
26 #include <linux/seq_file.h>
28 #include <asm/uaccess.h>
30 #include <mach/upmu_common.h>
31 #include <mach/upmu_sw.h>
32 #include <mach/upmu_hw.h>
33 #include <mach/mt_pm_ldo.h>
34 #include <mach/mt_pmic_wrap.h>
35 #include <mach/mt_gpio.h>
36 #include <mach/mtk_rtc.h>
37 #include <mach/mt_spm_mtcmos.h>
39 #include <mach/battery_common.h>
40 #include <linux/time.h>
42 // ============================================================ //
44 // ============================================================ //
45 extern kal_uint32
upmu_get_reg_value(kal_uint32 reg
);
46 extern void Charger_Detect_Init(void);
47 extern void Charger_Detect_Release(void);
49 static void hw_bc11_init(void)
52 Charger_Detect_Init();
55 upmu_set_rg_bc11_bias_en(0x1);
56 //RG_BC11_VSRC_EN[1:0]=00
57 upmu_set_rg_bc11_vsrc_en(0x0);
58 //RG_BC11_VREF_VTH = [1:0]=00
59 upmu_set_rg_bc11_vref_vth(0x0);
60 //RG_BC11_CMP_EN[1.0] = 00
61 upmu_set_rg_bc11_cmp_en(0x0);
62 //RG_BC11_IPU_EN[1.0] = 00
63 upmu_set_rg_bc11_ipu_en(0x0);
64 //RG_BC11_IPD_EN[1.0] = 00
65 upmu_set_rg_bc11_ipd_en(0x0);
67 upmu_set_rg_bc11_rst(0x1);
69 upmu_set_rg_bc11_bb_ctrl(0x1);
75 static U32
hw_bc11_DCD(void)
77 U32 wChargerAvail
= 0;
79 //RG_BC11_IPU_EN[1.0] = 10
80 upmu_set_rg_bc11_ipu_en(0x2);
81 //RG_BC11_IPD_EN[1.0] = 01
82 upmu_set_rg_bc11_ipd_en(0x1);
83 //RG_BC11_VREF_VTH = [1:0]=01
84 upmu_set_rg_bc11_vref_vth(0x1);
85 //RG_BC11_CMP_EN[1.0] = 10
86 upmu_set_rg_bc11_cmp_en(0x2);
91 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
93 //RG_BC11_IPU_EN[1.0] = 00
94 upmu_set_rg_bc11_ipu_en(0x0);
95 //RG_BC11_IPD_EN[1.0] = 00
96 upmu_set_rg_bc11_ipd_en(0x0);
97 //RG_BC11_CMP_EN[1.0] = 00
98 upmu_set_rg_bc11_cmp_en(0x0);
99 //RG_BC11_VREF_VTH = [1:0]=00
100 upmu_set_rg_bc11_vref_vth(0x0);
102 return wChargerAvail
;
105 #ifndef CONFIG_MTK_PMIC_MT6397 //only for mt6323 use
106 static U32
hw_bc11_stepA1(void)
108 U32 wChargerAvail
= 0;
110 //RG_BC11_IPU_EN[1.0] = 10
111 upmu_set_rg_bc11_ipu_en(0x2);
112 //RG_BC11_VREF_VTH = [1:0]=10
113 upmu_set_rg_bc11_vref_vth(0x2);
114 //RG_BC11_CMP_EN[1.0] = 10
115 upmu_set_rg_bc11_cmp_en(0x2);
120 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
122 //RG_BC11_IPU_EN[1.0] = 00
123 upmu_set_rg_bc11_ipu_en(0x0);
124 //RG_BC11_CMP_EN[1.0] = 00
125 upmu_set_rg_bc11_cmp_en(0x0);
127 return wChargerAvail
;
130 static U32
hw_bc11_stepA2(void)
132 U32 wChargerAvail
= 0;
134 //RG_BC11_VSRC_EN[1.0] = 10
135 upmu_set_rg_bc11_vsrc_en(0x2);
136 //RG_BC11_IPD_EN[1:0] = 01
137 upmu_set_rg_bc11_ipd_en(0x1);
138 //RG_BC11_VREF_VTH = [1:0]=00
139 upmu_set_rg_bc11_vref_vth(0x0);
140 //RG_BC11_CMP_EN[1.0] = 01
141 upmu_set_rg_bc11_cmp_en(0x1);
146 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
148 //RG_BC11_VSRC_EN[1:0]=00
149 upmu_set_rg_bc11_vsrc_en(0x0);
150 //RG_BC11_IPD_EN[1.0] = 00
151 upmu_set_rg_bc11_ipd_en(0x0);
152 //RG_BC11_CMP_EN[1.0] = 00
153 upmu_set_rg_bc11_cmp_en(0x0);
155 return wChargerAvail
;
158 static U32
hw_bc11_stepB2(void)
160 U32 wChargerAvail
= 0;
162 //RG_BC11_IPU_EN[1:0]=10
163 upmu_set_rg_bc11_ipu_en(0x2);
164 //RG_BC11_VREF_VTH = [1:0]=10
165 upmu_set_rg_bc11_vref_vth(0x1);
166 //RG_BC11_CMP_EN[1.0] = 01
167 upmu_set_rg_bc11_cmp_en(0x1);
172 wChargerAvail
= upmu_get_rgs_bc11_cmp_out();
174 //RG_BC11_IPU_EN[1.0] = 00
175 upmu_set_rg_bc11_ipu_en(0x0);
176 //RG_BC11_CMP_EN[1.0] = 00
177 upmu_set_rg_bc11_cmp_en(0x0);
178 //RG_BC11_VREF_VTH = [1:0]=00
179 upmu_set_rg_bc11_vref_vth(0x0);
181 return wChargerAvail
;
184 static void hw_bc11_done(void)
186 //RG_BC11_VSRC_EN[1:0]=00
187 upmu_set_rg_bc11_vsrc_en(0x0);
188 //RG_BC11_VREF_VTH = [1:0]=0
189 upmu_set_rg_bc11_vref_vth(0x0);
190 //RG_BC11_CMP_EN[1.0] = 00
191 upmu_set_rg_bc11_cmp_en(0x0);
192 //RG_BC11_IPU_EN[1.0] = 00
193 upmu_set_rg_bc11_ipu_en(0x0);
194 //RG_BC11_IPD_EN[1.0] = 00
195 upmu_set_rg_bc11_ipd_en(0x0);
197 upmu_set_rg_bc11_bias_en(0x0);
200 Charger_Detect_Release();
202 #if defined(CONFIG_POWER_EXT) || defined(CONFIG_MTK_FPGA)
204 CHARGER_TYPE
hw_charger_type_detection(void)
206 return STANDARD_HOST
;
211 #ifdef CONFIG_MTK_PMIC_MT6397 //for mt6397 detect flow
213 CHARGER_TYPE
hw_charger_type_detection(void)
215 CHARGER_TYPE ret
= CHARGER_UNKNOWN
;
218 if(1 == hw_bc11_DCD())
220 ret
= NONSTANDARD_CHARGER
;
222 if(1 == hw_bc11_stepA2())
224 if(1 == hw_bc11_stepB2())
226 ret
= STANDARD_CHARGER
;
238 #else //for mt6323 detect flow
240 CHARGER_TYPE
hw_charger_type_detection(void)
242 CHARGER_TYPE ret
= CHARGER_UNKNOWN
;
245 if(1 == hw_bc11_DCD())
247 if(1 == hw_bc11_stepA1())
249 ret
= APPLE_2_1A_CHARGER
;
251 ret
= NONSTANDARD_CHARGER
;
254 if(1 == hw_bc11_stepA2())
256 if(1 == hw_bc11_stepB2())
258 ret
= STANDARD_CHARGER
;