battery: adc-battery improve
[firefly-linux-kernel-4.4.55.git] / drivers / power / rk30_factory_adc_battery.c
1 /* drivers/power/rk30_adc_battery.c
2  *
3  * battery detect driver for the rk30 
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  */
15
16 #include <linux/module.h>
17 #include <linux/err.h>
18 #include <linux/platform_device.h>
19 #include <linux/power_supply.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/types.h>
22 #include <linux/pci.h>
23 #include <linux/interrupt.h>
24 #include <asm/io.h>
25 #include <asm/mach-types.h>
26 #include <asm/mach/arch.h>
27 #include <asm/mach/map.h>
28 #include <mach/gpio.h>
29 #include <linux/adc.h>
30 #include <mach/iomux.h>
31 #include <mach/board.h>
32 #include <linux/delay.h>
33 #include <linux/ktime.h>
34 #include <linux/slab.h>
35 #include <linux/syscalls.h>
36 #include <linux/fs.h>
37 #include <linux/wakelock.h>
38 #include <linux/fs.h>
39 #include <linux/string.h>
40 #include <linux/init.h>
41 #include <linux/earlysuspend.h>
42 #include <linux/suspend.h>
43 #ifdef CONFIG_EARLYSUSPEND
44 /* kernel/power/earlysuspend.c */
45 extern suspend_state_t get_suspend_state(void);
46 #endif
47
48 static int rk30_battery_dbg_level = 0;
49 module_param_named(dbg_level, rk30_battery_dbg_level, int, 0644);
50 #define DBG( args...) \
51         do { \
52                 if (rk30_battery_dbg_level) { \
53                         pr_info(args); \
54                 } \
55         } while (0)
56
57 #define TIMER_MS_COUNTS          1000   
58 #define SLOPE_SECOND_COUNTS                    15       
59 #define DISCHARGE_MIN_SECOND                   45       
60 #define CHARGE_MIN_SECOND                      45       
61 #define CHARGE_MID_SECOND                      90       
62 #define CHARGE_MAX_SECOND                      250
63 #define   CHARGE_FULL_DELAY_TIMES          10     
64 #define   USBCHARGE_IDENTIFY_TIMES        5         
65
66 #define NUM_VOLTAGE_SAMPLE                             ((SLOPE_SECOND_COUNTS * 1000) / TIMER_MS_COUNTS)  
67 #define NUM_DISCHARGE_MIN_SAMPLE                 ((DISCHARGE_MIN_SECOND * 1000) / TIMER_MS_COUNTS)       
68 #define NUM_CHARGE_MIN_SAMPLE            ((CHARGE_MIN_SECOND * 1000) / TIMER_MS_COUNTS)     
69 #define NUM_CHARGE_MID_SAMPLE            ((CHARGE_MID_SECOND * 1000) / TIMER_MS_COUNTS)      
70 #define NUM_CHARGE_MAX_SAMPLE            ((CHARGE_MAX_SECOND * 1000) / TIMER_MS_COUNTS)   
71 #define   NUM_CHARGE_FULL_DELAY_TIMES         ((CHARGE_FULL_DELAY_TIMES * 1000) / TIMER_MS_COUNTS)      
72 #define   NUM_USBCHARGE_IDENTIFY_TIMES      ((USBCHARGE_IDENTIFY_TIMES * 1000) / TIMER_MS_COUNTS)       
73
74 #define   CHARGE_IS_OK                                 1
75 #define   INVALID_CHARGE_CHECK               -1
76
77 #if defined(CONFIG_ARCH_RK3066B)
78 #define  BAT_DEFINE_VALUE                                            1800
79 #elif defined(CONFIG_ARCH_RK2928)
80 #define  BAT_DEFINE_VALUE                                         3300
81 #else
82 #define  BAT_DEFINE_VALUE                                            2500
83 #endif
84
85
86 #define BATT_FILENAME "/data/bat_last_capacity.dat"
87
88
89 #define BATTERY_APK 
90 #ifdef  BATTERY_APK
91 #define BATT_NUM  11
92 int    battery_dbg_level = 0;
93 int    battery_test_flag = 0;
94 int    gVoltageCnt = 3400;
95 int    gDoubleVoltageCnt = 6800;
96 unsigned long gSecondsCnt = 0;
97 char gDischargeFlag[3] = {"on "};
98
99
100 #ifdef CONFIG_BATTERY_RK30_VOL3V8
101 #define BATT_MAX_VOL_VALUE                             4120                     //Full  charge volate    
102 #define BATT_ZERO_VOL_VALUE                            3500                     //power down voltage
103 #define BATT_NOMAL_VOL_VALUE                         3800            
104
105 static int batt_table[2*BATT_NUM+6] =
106 {
107         0x4B434F52,0x7461625F,0x79726574,0,100,100,
108         3496, 3548, 3599, 3626, 3655, 3697, 3751, 3812, 3877, 3949, 4030,  //discharge
109         3540, 3785, 3842, 3861, 3915, 3980, 4041, 4135, 4169, 4175, 4185          //charge
110 };
111 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
112 #else
113 #define BATT_MAX_VOL_VALUE                              8284                    //Full charge voltage
114 #define BATT_ZERO_VOL_VALUE                             6800                    // power down voltage 
115 #define BATT_NOMAL_VOL_VALUE                          7600                
116
117
118 static int batt_table[2*BATT_NUM+6] =
119 {
120         0x4B434F52,0x7461625F,0x79726574,1,300,100,
121         6800, 7242, 7332, 7404, 7470, 7520, 7610, 7744, 7848, 8016, 8284,//discharge
122         7630, 7754, 7852, 7908, 7956, 8024, 8112, 8220, 8306, 8318, 8328//charge
123 };
124 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
125 #endif
126
127 #endif
128
129
130
131 /********************************************************************************/
132
133
134 enum {
135         BATTERY_STATUS                  = 0,
136         BATTERY_HEALTH                  = 1,
137         BATTERY_PRESENT                 = 2,
138         BATTERY_CAPACITY                        = 3,
139         BATTERY_AC_ONLINE                       = 4,
140         BATTERY_STATUS_CHANGED  = 5,
141         AC_STATUS_CHANGED               = 6,
142         BATTERY_INT_STATUS              = 7,
143         BATTERY_INT_ENABLE              = 8,
144 };
145
146 typedef enum {
147         CHARGER_BATTERY = 0,
148         CHARGER_USB,
149         CHARGER_AC
150 } charger_type_t;
151
152
153
154 struct rk30_adc_battery_data {
155         int irq;
156         
157         //struct timer_list       timer;
158         struct workqueue_struct *wq;
159         struct delayed_work         delay_work;
160         struct work_struct          dcwakeup_work;
161         struct work_struct                   lowerpower_work;
162         bool                    resume;
163         
164         struct rk30_adc_battery_platform_data *pdata;
165         
166         struct adc_client       *client; 
167         int                     adc_val;
168         int                     adc_samples[NUM_VOLTAGE_SAMPLE+2];
169         
170         int                     bat_status;
171         int                     bat_status_cnt;
172         int                     bat_health;
173         int                     bat_present;
174         int                     bat_voltage;
175         int                     bat_capacity;
176         int                     bat_change;
177         
178         int                     old_charge_level;
179         int                    *pSamples;
180         int                     gBatCapacityDisChargeCnt;
181         int                     gBatCapacityChargeCnt;
182         int                     gBatCapacityacChargeCnt;
183         int                     gBatCapacityusbChargeCnt ;
184         int                       gBatCapacityusbdisChargeCnt;
185         int                       capacitytmp;
186         int                     suspend_capacity;
187         int                     gBatUsbChargeCnt;
188         int                     status_lock;
189
190         struct power_supply     bat;
191         struct power_supply     usb;
192         struct power_supply     ac;
193         struct power_supply     bk_bat;
194         
195         int                     poweron_check;
196         int                     usb_charging;
197         int                     ac_charging;
198         int                      charge_check;
199         int                        charge_level;
200         
201         int                     charge_source_now;
202         int                     charge_soure_old;
203         int                     charge_start_capacity;
204         int                     charge_start_voltage;
205         int                     start_voltage_status;
206         int                     charge_up_proprotion;
207         int                     charge_down_proportion;
208         unsigned long          suspend_time;
209         unsigned long           resume_time;
210         
211         int                     full_times;
212         int                         charge_full_flag;
213
214
215 };
216 static struct rk30_adc_battery_data *gBatteryData;
217 static struct wake_lock batt_wake_lock;
218 static struct wake_lock charge_display_lock;
219 int system_lowerpower = 0;
220
221 extern int dwc_vbus_status(void);
222 extern int get_gadget_connect_flag(void);
223 extern int dwc_otg_check_dpdm(void);
224 static int  is_charge_ok(struct rk30_adc_battery_data *bat);
225 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat);
226
227
228 #ifdef  BATTERY_APK
229 //#define BAT_ADC_TABLE_LEN               11
230 static ssize_t bat_param_read(struct device *dev,struct device_attribute *attr, char *buf)
231 {
232         int i;
233         for(i=0;i<BATT_NUM;i++)
234                 printk("i=%d batt_table=%d\n",i+6,batt_table[i+6]);
235
236         for(i=0;i<BATT_NUM;i++)
237                 printk("i=%d batt_table=%d\n",i+17,batt_table[i+17]);
238         return 0;
239 }
240 DEVICE_ATTR(batparam, 0664, bat_param_read,NULL);
241
242
243 static ssize_t rkbatt_show_debug_attrs(struct device *dev,
244                                                                               struct device_attribute *attr, char *buf) 
245 {                                
246         return sprintf(buf, "%d\n", battery_dbg_level);
247 }
248
249 static ssize_t rkbatt_restore_debug_attrs(struct device *dev, 
250                                                                                   struct device_attribute *attr, const char *buf, size_t size)
251 {
252         int liTmp;
253         
254         sscanf(buf, "%d", &liTmp);
255         
256         if(liTmp != 0 && liTmp != 1)
257         {
258                 dev_err(dev, "rk29adc_restore_debug_attrs err\n");
259         }
260         else
261         {
262                 battery_dbg_level = liTmp;
263         }
264         return size;
265 }
266
267 static ssize_t rkbatt_show_state_attrs(struct device *dev,
268                                                                                 struct device_attribute *attr, char *buf) 
269 {
270 //      struct rk30_adc_battery_platform_data *pdata = gBatteryData->pdata;
271         int charge_ok_value =0 ;
272         charge_ok_value = is_charge_ok(gBatteryData) ;
273
274         return  sprintf(buf,
275                 "gBatVol=%d,gBatCap=%d,charge_ok=%d,%s\n",
276                 gBatteryData->bat_voltage,gBatteryData->bat_capacity,
277                 charge_ok_value,gDischargeFlag);
278 }
279
280 static ssize_t rkbatt_restore_state_attrs(struct device *dev, 
281                                                                                 struct device_attribute *attr, const char *buf, size_t size)
282 {
283         return size;
284 }
285
286 static ssize_t rkbatt_show_value_attrs(struct device *dev,
287                                                                             struct device_attribute *attr, char *buf) 
288 {                                
289         return sprintf(buf, "pull_up_res =%d,\npull_down_res=%d\n", batt_table[4],batt_table[5]);
290 }
291
292 static ssize_t rkbatt_restore_value_attrs(struct device *dev, 
293                                                                                 struct device_attribute *attr, const char *buf, size_t size)
294 {
295         int liUp        = 0;
296         int liDown      = 0;
297         
298         sscanf(buf, "%d,%d", &liUp,&liDown);
299         
300         if(liUp != 0 && liDown != 0)
301         {
302                 batt_table[4] = liUp;
303                 batt_table[5] = liDown;
304         }
305         return size;
306 }
307
308 static ssize_t rkbatt_show_flag_attrs(struct device *dev,
309                                                                          struct device_attribute *attr, char *buf) 
310 {                                
311         return sprintf(buf, "rk29_battery_test_flag=%d\n", battery_test_flag);
312 }
313 static ssize_t rkbatt_restore_flag_attrs(struct device *dev, 
314                                                                             struct device_attribute *attr, const char *buf, size_t size)
315 {
316         int liFlag;
317         
318         sscanf(buf, "%d", &liFlag);
319         
320         if(liFlag != 0)
321         {
322                 battery_test_flag = liFlag;
323         }
324         return size;
325 }
326 static struct device_attribute rkbatt_attrs[] = {
327         __ATTR(state, 0664, rkbatt_show_state_attrs, rkbatt_restore_state_attrs),
328         __ATTR(debug, 0664, rkbatt_show_debug_attrs, rkbatt_restore_debug_attrs),
329         __ATTR(value, 0666, rkbatt_show_value_attrs, rkbatt_restore_value_attrs),
330         __ATTR(flag,  0666, rkbatt_show_flag_attrs,  rkbatt_restore_flag_attrs),
331 };
332
333 static int create_sysfs_interfaces(struct device *dev)
334 {
335         int liTmep;
336         for (liTmep = 0; liTmep < ARRAY_SIZE(rkbatt_attrs); liTmep++)   {
337                 
338                 if (device_create_file(dev, rkbatt_attrs + liTmep)){
339                         goto error;
340                 }
341         }
342
343         return 0;
344
345 error:
346         for ( ; liTmep >= 0; liTmep--){
347                 device_remove_file(dev, rkbatt_attrs + liTmep);
348         }
349         
350         dev_err(dev, "%s:Unable to create sysfs interface\n", __func__);
351         return -1;
352 }
353
354 #endif
355
356
357 static int rk30_adc_battery_load_capacity(void)
358 {
359         char value[4];
360         int* p = (int *)value;
361         long fd = sys_open(BATT_FILENAME,O_RDONLY,0);
362
363         if(fd < 0){
364                 DBG("rk30_adc_battery_load_capacity: open file /data/bat_last_capacity.dat failed\n");
365                 return -1;
366         }
367
368         sys_read(fd,(char __user *)value,4);
369         sys_close(fd);
370
371         return (*p);
372 }
373
374 static void rk30_adc_battery_put_capacity(int loadcapacity)
375 {
376         char value[4];
377         int* p = (int *)value;
378         long fd = sys_open(BATT_FILENAME,O_CREAT | O_RDWR,0);
379
380         if(fd < 0){
381                 DBG("rk30_adc_battery_put_capacity: open file /data/bat_last_capacity.dat failed\n");
382                 return;
383         }
384         
385         *p = loadcapacity;
386         sys_write(fd, (const char __user *)value, 4);
387         sys_close(fd);
388 }
389
390 static void rk_start_charge(struct rk30_adc_battery_data *bat)
391 {
392         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
393
394         if (pdata->charge_set_pin != INVALID_GPIO){
395                 gpio_direction_output(pdata->charge_set_pin, pdata->charge_set_level);
396         }
397 }
398
399 static void rk_stop_charge(struct rk30_adc_battery_data *bat)
400 {
401         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
402
403         if (pdata->charge_set_pin != INVALID_GPIO){
404                 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
405         }
406 }
407
408 static int  get_ac_status(struct rk30_adc_battery_data *bat){
409         
410         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
411         int status = 0;
412         if (pdata->dc_det_pin != INVALID_GPIO){
413                 if (gpio_get_value (pdata->dc_det_pin) == pdata->dc_det_level){
414                                 status = 1;
415                         }else{
416                                 status = 0;
417                         }
418         }else{
419                 if(pdata->is_dc_charging){
420                         status = pdata->is_dc_charging();
421                 }
422         }
423
424         return status;
425 }
426 // state of charge  --- charge-display
427 static int  get_usb_status1(struct rk30_adc_battery_data *bat){
428
429 }
430 //state of charge ----running
431 static int  get_usb_status2(struct rk30_adc_battery_data *bat){
432
433 //      struct rk30_adc_battery_platform_data *pdata = bat->pdata;
434         int usb_status = 0; // 0--dischage ,1 ---usb charge, 2 ---ac charge
435         
436         if (1 == dwc_vbus_status()) {
437                 if (0 == get_gadget_connect_flag()){ 
438                         if (++bat->gBatUsbChargeCnt >= NUM_USBCHARGE_IDENTIFY_TIMES){
439                                 bat->gBatUsbChargeCnt = NUM_USBCHARGE_IDENTIFY_TIMES + 1;
440                                 usb_status = 2; // non-standard AC charger
441                                 if(bat ->pdata ->control_usb_charging)
442                                         bat ->pdata ->control_usb_charging(1);
443                         }
444                 }else{
445                                 
446                                 usb_status = 1; // connect to pc        
447                                 if(bat ->pdata ->control_usb_charging)
448                                         bat ->pdata ->control_usb_charging(0);
449
450                 }
451                 
452         }else{
453                 bat->gBatUsbChargeCnt = 0;
454                 if (2 == dwc_vbus_status()) {
455                         usb_status = 2; //standard AC charger
456                         
457                         if(bat ->pdata ->control_usb_charging)
458                                         bat ->pdata ->control_usb_charging(1);
459                 }else{
460                         usb_status = 0; 
461                 }
462
463
464         }
465         return usb_status;
466
467 }
468
469 static int rk_battery_get_status(struct rk30_adc_battery_data *bat)
470 {
471         int charge_on = 0;
472         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
473         int ac_ac_charging = 0, usb_ac_charging = 0;
474         int i=0;
475
476 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
477         ac_ac_charging = get_ac_status(bat);
478         if(1 == ac_ac_charging)
479                 charge_on = 1;
480 #endif
481
482 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)   
483                 if (strstr(saved_command_line,"charger")){
484                         wake_lock(&charge_display_lock);  //lock
485                         if( bat->pdata->usb_det_pin  != INVALID_GPIO ){
486                                 if( gpio_get_value(bat->pdata->usb_det_pin)== bat->pdata->usb_det_level){
487                                         if(( 1 == usb_ac_charging )||( 1 == ac_ac_charging ))
488                                                 bat -> ac_charging = 1;
489                                         if(( 1 == bat->usb_charging)||(1 == bat ->ac_charging))
490                                                 charge_on =1;
491                                         return charge_on;
492                                 }else{
493                                         if(( 0 == usb_ac_charging )&&( 0 == ac_ac_charging ))
494                                                 bat -> ac_charging = 0;
495                                         else
496                                                 bat->ac_charging = 1;
497                                         
498                                         bat->usb_charging = 0;
499                                         if(1 == bat->ac_charging)
500                                                 charge_on=1;
501                                         else
502                                                 charge_on = 0;
503                                         return charge_on;
504                                 }
505                         }else{
506
507                                 if(dwc_otg_check_dpdm() == 0){
508                                         bat->usb_charging = 0;
509                                         usb_ac_charging = 0;
510                                 }else if(dwc_otg_check_dpdm() == 1){
511                                         bat->usb_charging = 1;
512                                         if(bat -> pdata ->control_usb_charging)
513                                                 bat -> pdata ->control_usb_charging(0);
514                                 }else if(dwc_otg_check_dpdm() == 2){
515                                         bat->usb_charging = 0;
516                                         usb_ac_charging = 1;
517                                         if(bat -> pdata ->control_usb_charging)
518                                                 bat -> pdata ->control_usb_charging(1); 
519                                 }
520                                 if((1 == usb_ac_charging)||(1 == ac_ac_charging))
521                                         bat ->ac_charging = 1;
522                                 else
523                                         bat ->ac_charging = 0;
524
525                                 if(( 0 == bat ->ac_charging )&&(0 == bat->usb_charging  )){
526                                         charge_on = 0;
527                                         bat->bat_change = 1;
528                                 }
529
530                                 return charge_on;
531
532                         }
533                 }
534
535                 if (charge_on == 0){
536                         usb_ac_charging = get_usb_status2(bat); //0 --discharge, 1---usb charging,2----AC charging;
537                         if(1 == usb_ac_charging)
538                                 bat->usb_charging = 1;
539                         else
540                                 bat->usb_charging = 0;                                          
541                 }
542 #endif
543         if((usb_ac_charging == 2)||(ac_ac_charging == 1))
544                 bat -> ac_charging = 1;
545         else
546                 bat -> ac_charging = 0;
547
548         if((bat->usb_charging == 1)||(bat ->ac_charging ==1))
549                 charge_on =1;
550         
551         if(1 == bat->ac_charging )
552                         bat->charge_source_now = 1; //ac charge
553         else if( 1 == bat->usb_charging){
554                         bat->charge_source_now = 2; //ac charge
555         }else{
556                 bat->charge_soure_old =0;
557                 bat->charge_source_now=0;
558         }
559         if(bat->charge_source_now != bat->charge_soure_old){
560
561                 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){                //0.3 s
562                         msleep(1); //mdelay --- > msleep
563                         rk30_adc_battery_voltage_samples(bat);              //get new voltage
564                 }
565
566                         bat->charge_soure_old = bat->charge_source_now;
567                         bat->bat_change = 1;
568         }
569         DBG("ac_status=%d,usb_status=%d bat->bat_change = %d\n",bat -> ac_charging, bat->usb_charging ,bat->bat_change );
570         
571         return charge_on;
572 }
573
574 static int  is_charge_ok(struct rk30_adc_battery_data *bat)
575 {
576         int charge_is_ok = 0;
577         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
578
579         if( 1 != bat->charge_level)
580                 return -1;
581         
582         if((pdata->charge_ok_pin == INVALID_GPIO)&& ( pdata->charging_ok == NULL))
583                 return -1;
584         
585         if (pdata->charge_ok_pin != INVALID_GPIO){              
586                 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
587                         charge_is_ok =1;
588                 }
589         }else if( pdata->charging_ok){  
590         
591                 charge_is_ok = pdata->charging_ok();
592                 }
593         
594         return charge_is_ok;
595
596
597 }
598
599
600 static int rk30_adc_battery_status_samples(struct rk30_adc_battery_data *bat)
601 {
602         int charge_level;
603
604         charge_level = bat ->charge_level;//rk_battery_get_status(bat);
605
606         if (charge_level != bat->old_charge_level){
607                 bat->old_charge_level = charge_level;
608                 bat->bat_change  = 1;
609 #if 0
610                 if(charge_level) {            
611                         rk_start_charge(bat);
612                 }
613                 else{
614                         rk_stop_charge(bat);
615                 }
616 #endif
617                 bat->bat_status_cnt = 0;        
618         }
619         if(( 1 == charge_level )&&(1 == bat->charge_full_flag) && (bat->bat_capacity < 90)){
620                 rk_start_charge(bat);  //recharge
621                 if(bat->pdata->ctrl_charge_led != NULL)
622                         bat->pdata->ctrl_charge_led(0);
623
624         }else if (charge_level) {
625                 rk_start_charge(bat);
626                 }else{
627                         rk_stop_charge(bat);
628
629                 }
630         
631
632         if(charge_level == 0){   
633         //discharge
634                 bat->charge_full_flag = 0;
635                 bat->full_times = 0;
636                 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
637         }else{
638         //charging          
639                 if( is_charge_ok(bat)  ==  INVALID_CHARGE_CHECK){
640                         if (bat->bat_capacity == 100){
641                                 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
642                                         bat->bat_status = POWER_SUPPLY_STATUS_FULL;
643                                         bat->bat_change  = 1;
644                                         bat->charge_full_flag = 1;
645                                         if(bat->pdata->ctrl_charge_led != NULL)
646                                                 bat->pdata->ctrl_charge_led(1);
647                                         rk_stop_charge(bat);
648                                                 
649                                 }
650                         }else{
651                                 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
652                                 if(bat->pdata->ctrl_charge_led != NULL)
653                                                 bat->pdata->ctrl_charge_led(0);
654                         }
655                 }else{  // pin of charge_ok_pin
656                         if (is_charge_ok(bat) != CHARGE_IS_OK ){
657
658                                 bat->full_times = 0;
659                                 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
660                         }else{
661                                 bat->full_times++;
662
663                                 if (bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) {
664                                         bat->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
665                                 }
666
667                                 if ((bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) && (bat->bat_capacity >= 99)){
668                                         if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
669                                                 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
670                                                 rk_stop_charge(bat);
671                                                 bat->bat_capacity = 100;
672                                                 bat->bat_change  = 1;
673                                         }
674                                 }
675                                 else{
676                                         bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
677                                 }
678                         }
679                 }
680         }
681
682         return charge_level;
683 }
684 static int rk_adc_voltage(struct rk30_adc_battery_data *bat, int value)
685 {
686         int voltage;
687
688         int ref_voltage; //reference_voltage
689         int pullup_res;
690         int pulldown_res;
691
692         ref_voltage = bat ->pdata->reference_voltage;
693         pullup_res = bat ->pdata->pull_up_res;
694         pulldown_res = bat ->pdata->pull_down_res;
695
696         if(ref_voltage && pullup_res && pulldown_res){
697                 
698                 voltage =  ((value * ref_voltage * (pullup_res + pulldown_res)) / (1024 * pulldown_res));
699                 
700         }else{
701                 voltage = adc_to_voltage(value);        
702         }
703                 
704                 
705         return voltage;
706
707 }
708 static void rk_handle_ripple(struct rk30_adc_battery_data *bat, int status)
709 {
710         
711         int *p_table;
712
713         if (bat->pdata->use_board_table){
714                 p_table = bat->pdata->board_batt_table; 
715
716                 if(1 == status){
717                         if(bat->bat_voltage >= p_table[2*BATT_NUM +5]+ 10)
718                                 bat->bat_voltage = p_table[2*BATT_NUM +5]  + 10;
719                         else if(bat->bat_voltage <= p_table[BATT_NUM +6]  - 10)
720                                 bat->bat_voltage =  p_table[BATT_NUM +6] - 10;
721                 }
722                 else{
723                         if(bat->bat_voltage >= p_table[BATT_NUM +5]+ 10)
724                                 bat->bat_voltage = p_table[BATT_NUM +5]  + 10;
725                         else if(bat->bat_voltage <= p_table[6]  - 10)
726                                 bat->bat_voltage =  p_table[6] - 10;
727                 }
728         }
729
730 }
731
732 //static int *pSamples;
733 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
734 {
735         int value;
736         int i,*pStart = bat->adc_samples, num = 0;
737         int level = bat->charge_level;
738
739
740         value = bat->adc_val;
741         adc_async_read(bat->client);
742
743         *(bat->pSamples++) = rk_adc_voltage(bat,value);
744
745         bat->bat_status_cnt++;
746         if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE)  bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
747
748         num = bat->pSamples - pStart;
749         
750         if (num >= NUM_VOLTAGE_SAMPLE){
751                 bat ->pSamples = pStart;
752                 num = NUM_VOLTAGE_SAMPLE;
753                 
754         }
755
756         value = 0;
757         for (i = 0; i < num; i++){
758                 value += bat->adc_samples[i];
759         }
760         bat->bat_voltage = value / num;
761
762         /*handle  ripple */
763         if(battery_test_flag == 0)
764         {
765                 if(0 == bat->pdata->use_board_table){
766                         if(1 == level){
767                                 if(bat->bat_voltage >= batt_table[2*BATT_NUM +5]+ 10)
768                                         bat->bat_voltage = batt_table[2*BATT_NUM +5]  + 10;
769                                 else if(bat->bat_voltage <= batt_table[BATT_NUM +6]  - 10)
770                                         bat->bat_voltage =  batt_table[BATT_NUM +6] - 10;
771                         }
772                         else{
773                                 if(bat->bat_voltage >= batt_table[BATT_NUM +5]+ 10)
774                                         bat->bat_voltage = batt_table[BATT_NUM +5]  + 10;
775                                 else if(bat->bat_voltage <= batt_table[6]  - 10)
776                                         bat->bat_voltage =  batt_table[6] - 10;
777                         }
778                 }else{
779                         rk_handle_ripple(bat, level);
780                 }
781
782         }else if(battery_test_flag == 2){
783         
784                 if(batt_table[3] == 0){
785                         if(bat->bat_voltage < 3400){
786                                 if((get_seconds() - gSecondsCnt) > 30){
787                                         gSecondsCnt = get_seconds();
788                                         if((gVoltageCnt - bat->bat_voltage) > 15){
789                                                 strncpy(gDischargeFlag, "off" ,3);      
790                                         }
791                                         gVoltageCnt = bat->bat_voltage;
792
793                                 }
794                         }
795                         
796                         if(bat->bat_voltage < 3400){
797                                 bat->bat_voltage = 3400;
798                         }
799                 }
800                 else{
801                         if(bat->bat_voltage < 6800){
802                                 if((get_seconds() - gSecondsCnt) > 30){
803                                         gSecondsCnt = get_seconds();
804                                         if((gDoubleVoltageCnt - bat->bat_voltage) > 30){
805                                                 strncpy(gDischargeFlag, "off" ,3);      
806                                         }
807                                         gDoubleVoltageCnt =bat->bat_voltage;
808                                 }
809                         }
810                         if(bat->bat_voltage < 6800){
811                                 bat->bat_voltage = 6800;
812                         }       
813                 }
814         }
815 }
816
817 static int rk30_adc_battery_voltage_to_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
818 {
819         int i = 0;
820         int capacity = 0;
821
822         int  *p;
823         if (bat->pdata->use_board_table)
824                 p = bat->pdata->board_batt_table;       
825         else 
826                 p = batt_table;
827
828         if (1 == bat->charge_level){  //charge
829                 if(0 == bat->start_voltage_status ){
830                         if(BatVoltage >= (p[2*BATT_NUM +5])){
831                                 capacity = 100;
832                         }       
833                         else{
834                                 if(BatVoltage <= (p[BATT_NUM +6])){
835                                         capacity = 0;
836                                 }
837                                 else{
838                                         for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++){
839
840                                                 if(((p[i]) <= BatVoltage) && (BatVoltage <  (p[i+1]))){
841
842                                                                 capacity = (i-(BATT_NUM +6))*10 + ((BatVoltage - p[i]) *  10)/ (p[i+1]- p[i]);
843                                                         break;
844                                                 }
845                                         }
846                                 }  
847                         }
848                 }
849                 else{
850
851                         DBG("start_voltage=%d,start_capacity =%d\n", bat->charge_start_voltage, bat->charge_start_capacity);
852                         DBG("charge_down_proportion =%d,charge_up_proprotion=%d\n",bat ->charge_down_proportion,bat ->charge_up_proprotion);
853                                 if(BatVoltage >= (p[2*BATT_NUM +5])){
854                                         capacity = 100;
855                                 }else{  
856                                 
857                                         if(BatVoltage <= (p[BATT_NUM +6])){
858                                                 capacity = 0;
859                                                 }else{
860
861                                                         if(BatVoltage <bat->charge_start_voltage){
862                                                                 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
863                                                                         if(((p[i]) <= BatVoltage) && (BatVoltage <  (p[i+1]))){
864                                                                                 if( p[i+1] < bat->charge_start_voltage ){
865                                                                                         capacity =(i-(BATT_NUM +6))*(bat ->charge_down_proportion) + ((BatVoltage - p[i]) *  bat ->charge_down_proportion)/ (p[i+1]- p[i]);
866                                                                                 }
867                                                                                 else {
868                                                                                         capacity = (i-(BATT_NUM +6))*(bat ->charge_down_proportion) + ((BatVoltage - p[i]) *  bat ->charge_down_proportion)/ (bat->charge_start_voltage - p[i]);
869                                                                                 }
870                                                                                 break;
871                                                                         }
872
873
874                                                         }else{
875
876                                                                         if(BatVoltage > bat->charge_start_voltage){
877                                                                                 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
878                                                                                         if(((p[i]) <= BatVoltage) && (BatVoltage <  (p[i+1]))){
879                                                                                                 if( p[i] > bat->charge_start_voltage ){
880                                                                                                         capacity = bat->charge_start_capacity + (i - (BATT_NUM +6)-bat->charge_start_capacity/10)*(bat ->charge_up_proprotion) + ((BatVoltage - p[i]) *  bat ->charge_up_proprotion)/ (p[i+1]- p[i]);
881                                                                                                 }
882                                                                                                 else {
883                                                                                                        capacity = bat->charge_start_capacity + (i - (BATT_NUM +6)-bat->charge_start_capacity/10)*(bat ->charge_up_proprotion) + ((BatVoltage - p[i]) *  bat ->charge_up_proprotion)/ (p[i+1] - bat->charge_start_voltage );
884                                                                                                         }
885                                                                                                 break;
886                                                                                         }
887
888                                                                         }else{
889
890                                                                                 if(BatVoltage  ==  bat->charge_start_voltage)
891                                                                                         capacity = bat ->charge_start_capacity;
892                                                                                 }
893                                                                 }
894                                                         }
895                                         }
896
897                         }
898
899                 }
900                 else{  //discharge
901                         if(BatVoltage >= (p[BATT_NUM +5])){
902                                 capacity = 100;
903                         }       
904                         else{
905                                 if(BatVoltage <= (p[6])){
906                                         capacity = 0;
907                                 }
908                                 else{
909                                         for(i = 6; i < BATT_NUM +5; i++){
910                                                 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
911                                                         capacity = (i-6)*10+ ((BatVoltage - p[i]) *10 )/ (p[i+1]- p[i]) ;
912                                                         break;
913                                                 }
914                                         }
915                                 }  
916
917                         }
918
919
920                 }
921
922     return capacity;
923 }
924
925 static void rk_usb_charger(struct rk30_adc_battery_data *bat)
926 {
927
928         int capacity = 0;
929 //      struct rk30_adc_battery_platform_data *pdata = bat->pdata;
930         int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
931         int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
932
933         if((1 == bat ->charge_level)&&( 0 == bat ->start_voltage_status)){
934                         bat ->charge_start_voltage = bat ->bat_voltage;
935                         bat ->start_voltage_status = 1;
936                         bat ->charge_start_capacity = bat ->bat_capacity;
937                         bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
938                         bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
939         }
940
941         capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
942
943                 if (capacity > bat->bat_capacity){
944                         if(capacity > bat->bat_capacity + 10 )
945                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10;  //5s
946                         else if(capacity > bat->bat_capacity + 7 )
947                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
948                                 else if(capacity > bat->bat_capacity + 3 )
949                                         timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
950                         if (++(bat->gBatCapacityusbChargeCnt) >= timer_of_charge_sample){
951                                 bat->gBatCapacityusbChargeCnt  = 0;
952                                 if (bat->bat_capacity <= 99){
953                                         bat->bat_capacity++;
954                                         bat->bat_change  = 1;
955                                 }
956                         }
957                         bat->gBatCapacityChargeCnt = 0;
958                         bat ->gBatCapacityusbdisChargeCnt = 0;//get_suspend_state(void)
959                 }else if(( get_suspend_state() == PM_SUSPEND_MEM)&&(capacity < bat->bat_capacity)){
960                 // if((gpio_get_value (bat->pdata->back_light_pin) == 1)&&(capacity < bat->bat_capacity)){
961                         if (capacity < bat->bat_capacity){
962                                 if(capacity + 10 > bat->bat_capacity  )
963                                         timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10;  //5s
964                                 else if(capacity  + 7 > bat->bat_capacity )
965                                         timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
966                                         else if(capacity  + 3> bat->bat_capacity )
967                                                 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
968                                 
969                                 if (++(bat->gBatCapacityusbdisChargeCnt) >= timer_of_discharge_sample){
970                                         bat->gBatCapacityusbdisChargeCnt = 0;
971                                         if (bat->bat_capacity > 0){
972                                                 bat->bat_capacity-- ;
973                                                 bat->bat_change  = 1;
974                                         }
975                                 }
976                                 
977                         }
978                         bat->gBatCapacityusbChargeCnt  = 0;
979
980                 }
981                 else if(get_suspend_state() == PM_SUSPEND_MEM){
982                         //if(gpio_get_value (bat->pdata->back_light_pin) == 0){
983
984
985                         bat->gBatCapacityusbdisChargeCnt = 0;
986                         // (bat->gBatCapacityusbChargeCnt)++;
987                         if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
988                                 if( is_charge_ok(bat) == CHARGE_IS_OK){
989
990                                         if (++bat->gBatCapacityusbChargeCnt >= timer_of_charge_sample-30){
991                                                 bat->gBatCapacityusbChargeCnt = 0;
992                                                         if (bat->bat_capacity <= 99){
993                                                                 bat->bat_capacity++;
994                                                                 bat->bat_change  = 1;
995                                                         }
996                                         }
997                                 }else{
998                                                 if (capacity > bat->capacitytmp){
999                                                         bat->gBatCapacityChargeCnt = 0;
1000                                                 }else{
1001
1002                                                         if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
1003                                                                 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1004
1005                                                                 if (bat->bat_capacity < 99){
1006                                                                         bat->bat_capacity++;
1007                                                                         bat->bat_change  = 1;
1008                                                                 }
1009                                                         }
1010                                                 }
1011                                         }
1012
1013                                 }
1014                                 else{
1015                                         if (capacity > bat->capacitytmp){
1016                                                         bat->gBatCapacityChargeCnt = 0;
1017                                         }else{
1018                                                 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityusbChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
1019                                                         bat->gBatCapacityusbChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1020                                                                 if (bat->bat_capacity <= 99){
1021                                                                         bat->bat_capacity++;
1022                                                                         bat->bat_change  = 1;
1023                                                         }
1024                                                 }
1025                                         }
1026                         }
1027
1028                 }
1029                 bat->capacitytmp = capacity;
1030
1031 }
1032 static void rk_ac_charger(struct rk30_adc_battery_data *bat)
1033 {
1034         int capacity = 0;
1035         int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1036
1037         if((1 == bat->charge_level)&&( 0 == bat->start_voltage_status)){
1038                 bat->charge_start_voltage = bat->bat_voltage;
1039                 bat->start_voltage_status = 1;
1040                 bat->charge_start_capacity = bat->bat_capacity;
1041                 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1042                 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1043         }
1044         capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1045                 if (capacity > bat->bat_capacity){
1046                         if(capacity > bat->bat_capacity + 10 )
1047                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10;  //5s
1048                         else if(capacity > bat->bat_capacity + 7 )
1049                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
1050                                 else if(capacity > bat->bat_capacity + 3 )
1051                                         timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
1052                         if (++(bat->gBatCapacityacChargeCnt) >= timer_of_charge_sample){
1053                                 bat->gBatCapacityacChargeCnt  = 0;
1054                                 if (bat->bat_capacity <= 99){
1055                                         bat->bat_capacity++;
1056                                         bat->bat_change  = 1;
1057                                 }
1058                         }
1059                         bat->gBatCapacityChargeCnt = 0;
1060                 }
1061                 else{  
1062                             bat->gBatCapacityacChargeCnt = 0;
1063                             (bat->gBatCapacityChargeCnt)++;
1064                                 if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
1065                                         if( is_charge_ok(bat) == CHARGE_IS_OK){
1066                                                 if (bat->gBatCapacityChargeCnt >= timer_of_charge_sample){
1067                                                         bat->gBatCapacityChargeCnt = 0;
1068                                                         if (bat->bat_capacity < 99){
1069                                                                 bat->bat_capacity++;
1070                                                                 bat->bat_change  = 1;
1071                                                         }
1072                                                 }
1073                                         }else{
1074                                                 if (capacity > bat->capacitytmp){
1075                                                         bat->gBatCapacityChargeCnt = 0;
1076                                                 }
1077                                                 else{
1078
1079                                                         if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
1080                                                                 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1081
1082                                                                 if (bat->bat_capacity < 99){
1083                                                                         bat->bat_capacity++;
1084                                                                         bat->bat_change  = 1;
1085                                                                 }
1086                                                         }
1087                                                 }
1088                                         }
1089
1090                         }else{
1091                                 if (capacity > bat->capacitytmp){
1092                                         bat->gBatCapacityChargeCnt = 0;
1093                                 }
1094                                 else{
1095
1096                                         if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
1097                                                 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1098
1099                                                 if (bat->bat_capacity <= 99){
1100                                                         bat->bat_capacity++;
1101                                                         bat->bat_change  = 1;
1102                                                 }
1103                                         }
1104                                 }
1105                                 
1106
1107                         }            
1108                 }
1109                 bat->capacitytmp = capacity;
1110 }
1111 static void rk_battery_charger(struct rk30_adc_battery_data *bat)
1112 {
1113
1114         int capacity = 0;
1115         int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
1116         
1117         capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1118
1119                 if (capacity < bat->bat_capacity){
1120                         if(capacity + 3 > bat->bat_capacity  )
1121                                 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5;  //5s
1122                         else if(capacity  + 7 > bat->bat_capacity )
1123                                 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10; //10s
1124                                 else if(capacity  + 10> bat->bat_capacity )
1125                                         timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 15; // 13
1126
1127                         if (++(bat->gBatCapacityDisChargeCnt) >= timer_of_discharge_sample){
1128                                 bat->gBatCapacityDisChargeCnt = 0;
1129                                 if (bat->bat_capacity > 0){
1130                                         bat->bat_capacity-- ;
1131                                         bat->bat_change  = 1;
1132                                 }
1133                         }
1134                 }
1135                 else{
1136                         bat->gBatCapacityDisChargeCnt = 0;
1137                 }
1138                 bat->gBatCapacityChargeCnt = 0;
1139                 bat->gBatCapacityusbdisChargeCnt=0 ;
1140                 bat->gBatCapacityusbChargeCnt =0;
1141                 bat->gBatCapacityacChargeCnt = 0;
1142                 bat->start_voltage_status = 0;
1143                 
1144                 bat->capacitytmp = capacity;
1145
1146
1147
1148 }
1149
1150 static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat)
1151 {
1152 //      int capacity = 0;
1153 //      int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1154         int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
1155
1156         if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE)  {
1157                 bat->gBatCapacityDisChargeCnt = 0;
1158                 bat->gBatCapacityChargeCnt    = 0;
1159                 bat->gBatCapacityacChargeCnt = 0;
1160                 return;
1161         }
1162         
1163         if(1 == bat->charge_level){
1164 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)   
1165                 if(1 == bat->usb_charging)
1166                         rk_usb_charger(bat);
1167                 else
1168                         rk_ac_charger(bat);
1169 #else
1170                 rk_ac_charger(bat);
1171 #endif
1172         }else{
1173                 rk_battery_charger(bat);
1174
1175         }
1176         
1177 }
1178
1179 //static int poweron_check = 0;
1180 static void rk30_adc_battery_poweron_capacity_check(struct rk30_adc_battery_data *bat)
1181 {
1182
1183         int new_capacity, old_capacity;
1184          int cnt = 50 ;
1185
1186         new_capacity = bat ->bat_capacity;
1187 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1188         if(dwc_otg_check_dpdm() != 0)
1189                 bat ->bat_status = POWER_SUPPLY_STATUS_CHARGING; // add for charging.
1190 #endif
1191                 
1192         while( cnt -- ){
1193             old_capacity = rk30_adc_battery_load_capacity();
1194             if( old_capacity >= 0 ){
1195                 break ;
1196             }
1197             msleep(100);
1198         }
1199
1200         if ((old_capacity < 0) || (old_capacity > 100)){
1201                 old_capacity = new_capacity;
1202         }    
1203
1204         if (bat ->bat_status == POWER_SUPPLY_STATUS_FULL){
1205                 if (new_capacity > 80){
1206                         bat ->bat_capacity = 100;
1207                 }
1208         }
1209         else if (bat ->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1210         //chargeing state
1211
1212                 if( bat  ->pdata->is_reboot_charging == 1)
1213                         bat ->bat_capacity = (old_capacity < 10) ?(old_capacity+2):old_capacity;
1214                 else
1215                         bat ->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1216         }else{
1217                 if(new_capacity > old_capacity + 50 )
1218                         bat ->bat_capacity = new_capacity;
1219                 else
1220                         bat ->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;  //avoid the value of capacity increase 
1221         }
1222
1223
1224         bat ->bat_change = 1;
1225 }
1226 #define to_battery_usb_device_info(x) container_of((x), \
1227                 struct rk30_adc_battery_data, usb);
1228
1229 static int rk30_adc_battery_get_usb_property(struct power_supply *psy, 
1230                                     enum power_supply_property psp,
1231                                     union power_supply_propval *val)
1232 {
1233         struct rk30_adc_battery_data *bat=  to_battery_usb_device_info(psy);
1234
1235         switch (psp) {
1236                 case POWER_SUPPLY_PROP_ONLINE:
1237                         if (psy->type == POWER_SUPPLY_TYPE_USB){
1238                                 val->intval = bat ->usb_charging;
1239                                 if( 1 == bat->charge_full_flag)
1240                                         val->intval = 0;
1241
1242                         }
1243                         break;
1244
1245                 default:
1246                         return -EINVAL;
1247         }
1248         
1249         return 0;
1250
1251 }
1252
1253 static enum power_supply_property rk30_adc_battery_usb_props[] = {
1254     
1255         POWER_SUPPLY_PROP_ONLINE,
1256 };
1257
1258 static struct power_supply rk30_usb_supply = 
1259 {
1260         .name = "usb",
1261         .type = POWER_SUPPLY_TYPE_USB,
1262
1263         .get_property   = rk30_adc_battery_get_usb_property,
1264
1265         .properties     = rk30_adc_battery_usb_props,
1266         .num_properties = ARRAY_SIZE(rk30_adc_battery_usb_props),
1267 };
1268
1269 static irqreturn_t rk30_adc_battery_dc_wakeup(int irq, void *dev_id)
1270 {   
1271         disable_irq_nosync(irq);
1272         queue_work(gBatteryData->wq, &gBatteryData->dcwakeup_work);
1273         return IRQ_HANDLED;
1274 }
1275
1276 #define to_battery_ac_device_info(x) container_of((x), \
1277                 struct rk30_adc_battery_data, ac);
1278
1279 static int rk30_adc_battery_get_ac_property(struct power_supply *psy,
1280                         enum power_supply_property psp,
1281                         union power_supply_propval *val)
1282 {
1283         int ret;
1284
1285         struct rk30_adc_battery_data *bat = to_battery_ac_device_info(psy);
1286
1287         switch (psp) {
1288         case POWER_SUPPLY_PROP_ONLINE:
1289                 if (psy->type == POWER_SUPPLY_TYPE_MAINS){
1290                         val->intval = bat ->ac_charging;
1291                         if( 1 == bat->charge_full_flag)
1292                                 val->intval = 0;
1293
1294                 }
1295                 break;
1296                 
1297         default:
1298                 ret = -EINVAL;
1299                 break;
1300         }
1301
1302         return 0;
1303 }
1304
1305 static enum power_supply_property rk30_adc_battery_ac_props[] = 
1306 {
1307         POWER_SUPPLY_PROP_ONLINE,
1308 };
1309
1310 static struct power_supply rk30_ac_supply = 
1311 {
1312         .name = "ac",
1313         .type = POWER_SUPPLY_TYPE_MAINS,
1314
1315         .get_property   = rk30_adc_battery_get_ac_property,
1316
1317         .properties     = rk30_adc_battery_ac_props,
1318         .num_properties = ARRAY_SIZE(rk30_adc_battery_ac_props),
1319 };
1320 static void rk30_adc_battery_dcdet_delaywork(struct work_struct *work)
1321 {
1322
1323         int ret;
1324         struct rk30_adc_battery_platform_data *pdata;
1325         int irq;
1326         int irq_flag;
1327         struct rk30_adc_battery_data  *bat = container_of((work), \
1328                 struct rk30_adc_battery_data, dcwakeup_work);
1329
1330         rk28_send_wakeup_key(); // wake up the system
1331
1332         
1333         pdata    = bat->pdata;
1334         irq        = gpio_to_irq(pdata->dc_det_pin);
1335         free_irq(irq, NULL);
1336         msleep(10);
1337         irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1338         ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);// reinitialize the DC irq 
1339         if (ret) {
1340                 free_irq(irq, NULL);
1341         }
1342
1343         power_supply_changed(&bat ->ac);
1344
1345         bat ->bat_status_cnt = 0;        //the state of battery is change
1346
1347 }
1348
1349
1350 static int rk30_adc_battery_get_status(struct rk30_adc_battery_data *bat)
1351 {
1352         return (bat->bat_status);
1353 }
1354
1355 static int rk30_adc_battery_get_health(struct rk30_adc_battery_data *bat)
1356 {
1357         return POWER_SUPPLY_HEALTH_GOOD;
1358 }
1359
1360 static int rk30_adc_battery_get_present(struct rk30_adc_battery_data *bat)
1361 {
1362         return (bat->bat_voltage < BATT_MAX_VOL_VALUE) ? 0 : 1;
1363 }
1364
1365 static int rk30_adc_battery_get_voltage(struct rk30_adc_battery_data *bat)
1366 {
1367         return (bat->bat_voltage );
1368 }
1369
1370 static int rk30_adc_battery_get_capacity(struct rk30_adc_battery_data *bat)
1371 {
1372         return (bat->bat_capacity);
1373 }
1374
1375 static int rk30_adc_battery_get_property(struct power_supply *psy,
1376                                  enum power_supply_property psp,
1377                                  union power_supply_propval *val)
1378 {               
1379         int ret = 0;
1380         struct rk30_adc_battery_data  *bat = container_of((psy), \
1381                         struct rk30_adc_battery_data, bat);
1382         switch (psp) {
1383                 case POWER_SUPPLY_PROP_STATUS:
1384                         val->intval = rk30_adc_battery_get_status(bat);
1385                         DBG("gBatStatus=%d\n",val->intval);
1386                         break;
1387                 case POWER_SUPPLY_PROP_HEALTH:
1388                         val->intval = rk30_adc_battery_get_health(bat);
1389                         DBG("gBatHealth=%d\n",val->intval);
1390                         break;
1391                 case POWER_SUPPLY_PROP_PRESENT:
1392                         val->intval = rk30_adc_battery_get_present(bat);
1393                         DBG("gBatPresent=%d\n",val->intval);
1394                         break;
1395                 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1396                         val ->intval = rk30_adc_battery_get_voltage(bat);
1397                         DBG("gBatVoltage=%d\n",val->intval);
1398                         break;
1399                 case POWER_SUPPLY_PROP_CAPACITY:
1400                         if(battery_test_flag == 2)
1401                                 val->intval = 50;
1402                         else
1403                                 val->intval = rk30_adc_battery_get_capacity(bat);
1404                         DBG("gBatCapacity=%d%%\n",val->intval);
1405                         break;
1406                 case POWER_SUPPLY_PROP_TECHNOLOGY:
1407                         val->intval = POWER_SUPPLY_TECHNOLOGY_LION;     
1408                         break;
1409                 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1410                         val->intval = BATT_MAX_VOL_VALUE;
1411                         break;
1412                 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1413                         val->intval = BATT_ZERO_VOL_VALUE;
1414                         break;
1415                 default:
1416                         ret = -EINVAL;
1417                         break;
1418         }
1419
1420         return ret;
1421 }
1422
1423 static enum power_supply_property rk30_adc_battery_props[] = {
1424
1425         POWER_SUPPLY_PROP_STATUS,
1426         POWER_SUPPLY_PROP_HEALTH,
1427         POWER_SUPPLY_PROP_PRESENT,
1428         POWER_SUPPLY_PROP_VOLTAGE_NOW,
1429         POWER_SUPPLY_PROP_TECHNOLOGY,
1430         POWER_SUPPLY_PROP_CAPACITY,
1431         POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1432         POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1433 };
1434
1435 static struct power_supply rk30_battery_supply = 
1436 {
1437         .name = "battery",
1438         .type = POWER_SUPPLY_TYPE_BATTERY,
1439
1440         .get_property   = rk30_adc_battery_get_property,
1441
1442         .properties     = rk30_adc_battery_props,
1443         .num_properties = ARRAY_SIZE(rk30_adc_battery_props),
1444 };
1445
1446 #ifdef CONFIG_PM
1447 static void rk30_adc_battery_resume_check(struct rk30_adc_battery_data *bat)
1448 {
1449         int i;
1450         int level,oldlevel;
1451         int new_capacity, old_capacity;
1452 //      struct rk30_adc_battery_data *bat = gBatteryData;
1453
1454         bat ->old_charge_level = -1;
1455         bat ->pSamples = bat->adc_samples;
1456
1457         adc_sync_read(bat->client);                             //start adc sample
1458         level = oldlevel =  rk_battery_get_status(bat);//rk30_adc_battery_status_samples(bat);//init charge status
1459
1460         for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) {               //0.3 s   
1461         
1462                 mdelay(1);
1463                 rk30_adc_battery_voltage_samples(bat);              //get voltage
1464                 level =          rk_battery_get_status(bat);// rk30_adc_battery_status_samples(bat);       //check charge status
1465                 if (oldlevel != level){         
1466                     oldlevel = level;                               //if charge status changed, reset sample
1467                     i = 0;
1468                 }        
1469         }
1470         new_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1471         old_capacity =bat-> suspend_capacity;
1472
1473         //if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1474         if( 1 == level ){
1475         //chargeing state
1476                 bat->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1477         }
1478         else{
1479                 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;  // aviod the value of capacity increase    dicharge
1480         }
1481
1482 }
1483
1484 static int rk30_adc_battery_suspend(struct platform_device *dev, pm_message_t state)
1485 {
1486         int irq;
1487         struct rk30_adc_battery_data *data = platform_get_drvdata(dev);
1488
1489         data ->suspend_capacity = data->bat_capacity;
1490         data ->suspend_time = get_seconds();
1491         cancel_delayed_work(&data ->delay_work);
1492         
1493         if( data ->pdata->batt_low_pin != INVALID_GPIO){
1494                 
1495                 irq = gpio_to_irq(data ->pdata->batt_low_pin);
1496                 enable_irq(irq);
1497                 enable_irq_wake(irq);
1498         }
1499
1500         return 0;
1501 }
1502
1503 static int rk30_adc_battery_resume(struct platform_device *dev)
1504 {
1505         int irq;
1506         struct rk30_adc_battery_data *data = platform_get_drvdata(dev);
1507         data ->resume_time = get_seconds();
1508         data ->resume = true;
1509         queue_delayed_work(data->wq, &data ->delay_work, msecs_to_jiffies(100));
1510         if( data ->pdata->batt_low_pin != INVALID_GPIO){
1511                 
1512                 irq = gpio_to_irq(data ->pdata ->batt_low_pin);
1513                 disable_irq_wake(irq);
1514                 disable_irq(irq);
1515         }
1516         return 0;
1517 }
1518 #else
1519 #define rk30_adc_battery_suspend NULL
1520 #define rk30_adc_battery_resume NULL
1521 #endif
1522
1523
1524 unsigned long AdcTestCnt = 0;
1525 static void rk30_adc_battery_timer_work(struct work_struct *work)
1526 {
1527 struct rk30_adc_battery_data  *bat = container_of((work), \
1528                 struct rk30_adc_battery_data, delay_work);
1529
1530 #ifdef CONFIG_PM
1531         if (bat ->resume) {
1532                 if( (bat->resume_time - bat->suspend_time) >= 3600 )
1533                         rk30_adc_battery_resume_check(bat);
1534                 else
1535                         bat->bat_capacity = bat->suspend_capacity;
1536                 bat ->resume = false;
1537         }
1538 #endif
1539
1540         if (bat ->poweron_check){   
1541                 bat ->poweron_check = 0;
1542                 rk30_adc_battery_poweron_capacity_check(bat);
1543         }
1544
1545         bat ->charge_level = rk_battery_get_status(bat);
1546         rk30_adc_battery_status_samples(bat);
1547         rk30_adc_battery_voltage_samples(bat);
1548         rk30_adc_battery_capacity_samples(bat);
1549
1550         if( 0 == bat ->pdata ->charging_sleep){
1551                 if( 1 == bat->charge_level){  // charge
1552                         if(0 == bat->status_lock ){                     
1553                                 wake_lock(&batt_wake_lock);  //lock
1554                                 bat ->status_lock = 1; 
1555                         }
1556                 }
1557                 else{
1558                         if(1 == bat ->status_lock ){                    
1559                                 wake_unlock(&batt_wake_lock);  //unlock
1560                                 bat ->status_lock = 0; 
1561                         }
1562
1563                 }
1564         }
1565         
1566         /*update battery parameter after adc and capacity has been changed*/
1567         if(bat ->bat_change){
1568                 bat ->bat_change= 0;
1569                 if(0 == bat ->bat_capacity){
1570                         bat ->ac_charging = 0;
1571                         bat ->usb_charging = 0;
1572
1573                 }
1574                 rk30_adc_battery_put_capacity(bat ->bat_capacity);
1575                 power_supply_changed(&bat ->bat);
1576                 power_supply_changed(&bat ->ac);
1577 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1578                 power_supply_changed(&bat ->usb);
1579 #endif
1580
1581         }
1582
1583         //if (rk30_battery_dbg_level){
1584                 if (++AdcTestCnt >= 2)
1585                         {
1586                         AdcTestCnt = 0;
1587
1588                         DBG("Status = %d, RealAdcVal = %d, RealVol = %d,gBatVol = %d, gBatCap = %d, RealCapacity = %d, batt_dischargecnt = %d\n,  chargecnt = %d,ac_count = %d, usb_count =%d ,usb_dischargecount =%d\n", 
1589                         bat ->bat_status, bat ->adc_val, rk_adc_voltage(bat, bat ->adc_val), 
1590                         bat ->bat_voltage, bat ->bat_capacity, bat ->capacitytmp, bat ->gBatCapacityDisChargeCnt, bat ->gBatCapacityChargeCnt,
1591                         bat ->gBatCapacityacChargeCnt, bat ->gBatCapacityusbChargeCnt, bat ->gBatCapacityusbdisChargeCnt);
1592
1593                 }
1594         //}
1595         queue_delayed_work(bat ->wq, &bat ->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1596
1597 }
1598
1599
1600 static int rk30_adc_battery_io_init(struct rk30_adc_battery_platform_data *pdata)
1601 {
1602         int ret = 0;
1603         
1604         if (pdata->io_init) {
1605                 pdata->io_init();
1606                 return 0;
1607         }
1608         
1609         //charge control pin
1610         if (pdata->charge_set_pin != INVALID_GPIO){
1611                 ret = gpio_request(pdata->charge_set_pin, NULL);
1612                 if (ret) {
1613                         printk("failed to request dc_det gpio\n");
1614                         goto error;
1615                         }
1616                 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
1617         }
1618         
1619         //dc charge detect pin
1620         if (pdata->dc_det_pin != INVALID_GPIO){
1621                 ret = gpio_request(pdata->dc_det_pin, NULL);
1622                 if (ret) {
1623                         printk("failed to request dc_det gpio\n");
1624                         goto error;
1625                 }
1626         
1627                 gpio_pull_updown(pdata->dc_det_pin, GPIOPullUp);//important
1628                 ret = gpio_direction_input(pdata->dc_det_pin);
1629                 if (ret) {
1630                         printk("failed to set gpio dc_det input\n");
1631                         goto error;
1632                 }
1633         }
1634         
1635         //charge ok detect
1636         if (pdata->charge_ok_pin != INVALID_GPIO){
1637                 ret = gpio_request(pdata->charge_ok_pin, NULL);
1638                 if (ret) {
1639                         printk("failed to request charge_ok gpio\n");
1640                         goto error;
1641                 }
1642         
1643                 gpio_pull_updown(pdata->charge_ok_pin, GPIOPullUp);//important
1644                 ret = gpio_direction_input(pdata->charge_ok_pin);
1645                 if (ret) {
1646                         printk("failed to set gpio charge_ok input\n");
1647                         goto error;
1648                 }
1649         }
1650         //batt low pin
1651         if( pdata->batt_low_pin != INVALID_GPIO){
1652                 ret = gpio_request(pdata->batt_low_pin, NULL);
1653                 if (ret) {
1654                         printk("failed to request batt_low_pin gpio\n");
1655                         goto error;
1656                 }
1657         
1658                 gpio_pull_updown(pdata->batt_low_pin, GPIOPullUp); 
1659                 ret = gpio_direction_input(pdata->batt_low_pin);
1660                 if (ret) {
1661                         printk("failed to set gpio batt_low_pin input\n");
1662                         goto error;
1663                 }
1664         }
1665     
1666         return 0;
1667 error:
1668         return -1;
1669 }
1670
1671 extern void kernel_power_off(void);
1672 int get_battery_status(void)
1673 {
1674         return system_lowerpower;
1675 }
1676 static void rk30_adc_battery_check(struct rk30_adc_battery_data *bat)
1677 {
1678         int i;
1679         int level,oldlevel;
1680         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1681
1682 //      pSamples = bat->adc_samples;
1683
1684         adc_sync_read(bat->client);                             //start adc sample
1685         level = oldlevel =       rk_battery_get_status(bat);// rk30_adc_battery_status_samples(bat);//init charge status
1686
1687         for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){                //0.3 s
1688                 mdelay(1);
1689                 rk30_adc_battery_voltage_samples(bat);              //get voltage
1690                 //level = rk30_adc_battery_status_samples(bat);       //check charge status
1691                 level = rk_battery_get_status(bat);
1692
1693                 if (oldlevel != level){
1694                         oldlevel = level;                               //if charge status changed, reset sample
1695                         i = 0;
1696                 }    
1697                 bat->charge_level = level;
1698         }
1699
1700
1701         bat->bat_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);  //init bat_capacity
1702
1703         if((1 == level)&&(0 == bat->start_voltage_status )){
1704                         bat->charge_start_voltage = bat->bat_voltage;
1705                         bat->start_voltage_status = 1;
1706                         bat->charge_start_capacity = bat->bat_capacity;
1707                         bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1708                         bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1709         }
1710         
1711         if (get_ac_status(bat) || dwc_otg_check_dpdm() ){
1712                 if (is_charge_ok(bat)  == 1){
1713                         bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1714                         bat->bat_capacity = 100;
1715                 }
1716 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1717                 if( 0 != dwc_otg_check_dpdm() )
1718                         bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1719                 if(dwc_otg_check_dpdm() == 0){
1720                         bat->usb_charging = 0;
1721                 }else if(dwc_otg_check_dpdm() == 1){
1722                         bat->usb_charging = 1;
1723                         if(bat -> pdata ->control_usb_charging)
1724                                 bat -> pdata ->control_usb_charging(0);
1725                 }else if(dwc_otg_check_dpdm() == 2){
1726                         bat->usb_charging = 0;
1727                         bat -> ac_charging = 1;
1728                         if(bat -> pdata ->control_usb_charging)
1729                                 bat -> pdata ->control_usb_charging(1); 
1730                 }
1731 #endif
1732                 if(1 == get_ac_status(bat)){
1733                         bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1734                         bat -> ac_charging = 1;
1735                 }
1736                 power_supply_changed(&bat ->ac);
1737 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1738                 power_supply_changed(&bat ->usb);
1739 #endif
1740
1741         }
1742 #if 0
1743         if (bat->bat_capacity == 0) {
1744                 bat->bat_capacity = 1;
1745                 system_lowerpower = 1;
1746         }
1747 #endif
1748         if(0 !=bat ->pdata->low_voltage_protection ){
1749                 if((bat->bat_voltage <=  bat ->pdata->low_voltage_protection)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING))
1750                         system_lowerpower = 1;
1751         }else{
1752                 if((bat->bat_voltage <= BATT_ZERO_VOL_VALUE)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING))
1753                         system_lowerpower = 1;
1754
1755         }       
1756 #if 1
1757                 if ((bat->bat_voltage <= BATT_ZERO_VOL_VALUE)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING)){
1758                         kernel_power_off();
1759                 }
1760 #endif
1761
1762 }
1763
1764 static void rk30_adc_battery_callback(struct adc_client *client, void *param, int result)
1765 {
1766         struct rk30_adc_battery_data  *bat = container_of((client), \
1767                                 struct rk30_adc_battery_data, client);
1768
1769         if (result < 0){
1770                 DBG("adc_battery_callback    resule < 0 , the value ");
1771                 return;
1772         }else{
1773                 gBatteryData->adc_val = result;
1774                 DBG("result = %d, gBatteryData->adc_val = %d\n", result, gBatteryData->adc_val );
1775         }
1776         return;
1777 }
1778
1779 static void rk30_adc_battery_lowerpower_delaywork(struct work_struct *work)
1780 {
1781         int irq;
1782
1783         struct rk30_adc_battery_data  *bat = container_of((work), \
1784                         struct rk30_adc_battery_data, lowerpower_work);
1785
1786         if( bat->pdata->batt_low_pin != INVALID_GPIO){
1787                 irq = gpio_to_irq(bat ->pdata ->batt_low_pin);
1788                 disable_irq(irq);
1789         }
1790
1791         printk("lowerpower\n");
1792         rk28_send_wakeup_key(); // wake up the system   
1793         return;
1794 }
1795
1796
1797 static irqreturn_t rk30_adc_battery_low_wakeup(int irq,void *dev_id)
1798 {
1799         queue_work(gBatteryData->wq, &gBatteryData->lowerpower_work);
1800         return IRQ_HANDLED;
1801 }
1802
1803 static int rk30_adc_battery_probe(struct platform_device *pdev)
1804 {
1805         int    ret;
1806         int    irq;
1807         int    irq_flag;
1808         struct adc_client                   *client;
1809         struct rk30_adc_battery_data          *data;
1810         struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1811         gSecondsCnt = get_seconds();
1812         data = kzalloc(sizeof(*data), GFP_KERNEL);
1813         if (data == NULL) {
1814                 ret = -ENOMEM;
1815                 goto err_data_alloc_failed;
1816         }
1817         memset(data, 0, sizeof(struct rk30_adc_battery_data));
1818         gBatteryData = data;
1819
1820         platform_set_drvdata(pdev, data);
1821
1822         data->pdata = pdata;
1823         data->status_lock = 0;  
1824         data->old_charge_level = -1;
1825         data->capacitytmp = 0;
1826         data->suspend_capacity = 0;
1827         data->ac_charging = 0;
1828         data->usb_charging = 0;
1829         data->full_times = 0;
1830         data->gBatCapacityDisChargeCnt =0;
1831         data->gBatCapacityChargeCnt=0;
1832         data->gBatCapacityusbdisChargeCnt=0 ;
1833         data->gBatCapacityusbChargeCnt =0;
1834         data->gBatCapacityacChargeCnt = 0;
1835         data->charge_source_now = 0;
1836         data->charge_soure_old = 0;
1837         data->start_voltage_status = 0;
1838         data->charge_full_flag =0;
1839         data->pSamples = data->adc_samples;
1840
1841         data->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1842         wake_lock_init(&batt_wake_lock, WAKE_LOCK_SUSPEND, "batt_lock");        
1843         wake_lock_init(&charge_display_lock, WAKE_LOCK_SUSPEND, "charge_display_lock"); //charge_display_lock
1844         
1845         ret = rk30_adc_battery_io_init(pdata);
1846          if (ret) {
1847                 ret = -EINVAL;
1848                 goto err_io_init;
1849         }
1850     
1851         memset(data->adc_samples, 0, sizeof(int)*(NUM_VOLTAGE_SAMPLE + 2));
1852
1853          //register adc for battery sample
1854          if(0 == pdata->adc_channel)
1855                 client = adc_register(0, rk30_adc_battery_callback, NULL);  //pdata->adc_channel = ani0
1856         else
1857                 client = adc_register(pdata->adc_channel, rk30_adc_battery_callback, NULL);  
1858         if(!client){
1859                 ret = -EINVAL;
1860                 goto err_adc_register_failed;
1861         }
1862             
1863          //variable init
1864         data->client  = client;
1865         data->adc_val = adc_sync_read(client);
1866
1867         data ->bat = rk30_battery_supply;
1868         ret = power_supply_register(&pdev->dev,&data ->bat);
1869         if (ret){
1870                 ret = -EINVAL;
1871                 printk(KERN_INFO "fail to battery power_supply_register\n");
1872                 goto err_battery_failed;
1873         }
1874 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)   
1875         data ->usb = rk30_usb_supply;
1876         ret = power_supply_register(&pdev->dev, &data ->usb);
1877         if (ret){
1878                 ret = -EINVAL;
1879                 printk(KERN_INFO "fail to usb power_supply_register\n");
1880                 goto err_usb_failed;
1881         }
1882 #endif
1883         data ->ac = rk30_ac_supply;
1884         ret = power_supply_register(&pdev->dev, &data ->ac);
1885         if (ret) {
1886                 ret = -EINVAL;
1887                 printk(KERN_INFO "fail to ac power_supply_register\n");
1888                 goto err_ac_failed;
1889         }
1890
1891 #if  defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1892         //init dc dectet irq & delay work
1893         if (pdata->dc_det_pin != INVALID_GPIO){
1894                 INIT_WORK(&data->dcwakeup_work, rk30_adc_battery_dcdet_delaywork);
1895                 
1896                 irq = gpio_to_irq(pdata->dc_det_pin);           
1897                 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1898                 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);
1899                 if (ret) {
1900                         ret = -EINVAL;
1901                         printk("failed to request dc det irq\n");
1902                         goto err_dcirq_failed;
1903                 }
1904                 enable_irq_wake(irq);  
1905         
1906         }
1907 #endif
1908
1909         // batt low irq lowerpower_work
1910         if( pdata->batt_low_pin != INVALID_GPIO){
1911                 
1912                 if (gpio_get_value(pdata->batt_low_pin) ==0){
1913                        mdelay(20);         
1914                        if (gpio_get_value(pdata->batt_low_pin) ==0){
1915                          printk("lower power\n");
1916                                kernel_power_off(); 
1917                        }
1918                 }
1919                 
1920                 INIT_WORK(&data->lowerpower_work, rk30_adc_battery_lowerpower_delaywork);               
1921                 irq = gpio_to_irq(pdata->batt_low_pin);         
1922                 ret = request_irq(irq, rk30_adc_battery_low_wakeup, IRQF_TRIGGER_LOW, "batt_low_irq", NULL);
1923                 if (ret) {
1924                         ret = -EINVAL;
1925                         printk("failed to request batt_low_irq irq\n");
1926                         goto err_lowpowerirq_failed;
1927                 }
1928                 disable_irq(irq);
1929
1930         }
1931
1932 #ifdef BATTERY_APK
1933         ret = device_create_file(&pdev->dev,&dev_attr_batparam);
1934         if(ret){
1935                 ret = -EINVAL;
1936                 printk(KERN_ERR "failed to create bat param file\n");
1937                 goto err_battery_failed;
1938         }
1939                 
1940         ret = create_sysfs_interfaces(&pdev->dev);
1941         if (ret < 0)
1942         {
1943                 ret = -EINVAL;
1944                 dev_err(&pdev->dev,               
1945                         "device rk30_adc_batterry sysfs register failed\n");
1946                 goto err_sysfs;
1947         }
1948 #endif 
1949         //Power on Battery detect
1950         rk30_adc_battery_check(data);
1951
1952         data->wq = create_singlethread_workqueue("adc_battd");
1953         INIT_DELAYED_WORK(&data->delay_work, rk30_adc_battery_timer_work);
1954
1955         if(1 == pdata->save_capacity ){
1956                 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS*10));
1957                 data ->poweron_check = 1;
1958         }else{
1959                 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1960                 data ->poweron_check = 0;
1961         }
1962
1963         printk(KERN_INFO "rk30_adc_battery: driver initialized\n");
1964         
1965         return 0;
1966 err_sysfs:      
1967 err_usb_failed:
1968         power_supply_unregister(&data ->usb);
1969 err_ac_failed:
1970         power_supply_unregister(&data ->ac);
1971
1972 err_battery_failed:
1973         power_supply_unregister(&data ->bat);
1974     
1975 err_dcirq_failed:
1976         free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1977 #if 1
1978  err_lowpowerirq_failed:
1979         free_irq(gpio_to_irq(pdata->batt_low_pin), data);
1980 #endif
1981 err_adc_register_failed:
1982 err_io_init:    
1983 err_data_alloc_failed:
1984         kfree(data);
1985
1986         printk("rk30_adc_battery: error!\n");
1987     
1988         return ret;
1989 }
1990
1991 static int rk30_adc_battery_remove(struct platform_device *pdev)
1992 {
1993         struct rk30_adc_battery_data *data = platform_get_drvdata(pdev);
1994         struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1995
1996         cancel_delayed_work(&data->delay_work); 
1997 #if  defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1998                 power_supply_unregister(&data ->usb);
1999 #endif
2000         power_supply_unregister(&data ->ac);
2001         power_supply_unregister(&data ->bat);
2002
2003         free_irq(gpio_to_irq(pdata->dc_det_pin), data);
2004
2005         kfree(data);
2006         
2007         return 0;
2008 }
2009
2010 static struct platform_driver rk30_adc_battery_driver = {
2011         .probe          = rk30_adc_battery_probe,
2012         .remove         = rk30_adc_battery_remove,
2013         .suspend                = rk30_adc_battery_suspend,
2014         .resume         = rk30_adc_battery_resume,
2015         .driver = {
2016                 .name = "rk30-battery",
2017                 .owner  = THIS_MODULE,
2018         }
2019 };
2020
2021 static int __init rk30_adc_battery_init(void)
2022 {
2023         return platform_driver_register(&rk30_adc_battery_driver);
2024 }
2025
2026 static void __exit rk30_adc_battery_exit(void)
2027 {
2028         platform_driver_unregister(&rk30_adc_battery_driver);
2029 }
2030 module_init(rk30_adc_battery_init);//module_init(rk30_adc_battery_init);//
2031 //subsys_initcall(rk30_adc_battery_init);
2032 //fs_initcall(rk30_adc_battery_init);
2033 module_exit(rk30_adc_battery_exit);
2034
2035 MODULE_DESCRIPTION("Battery detect driver for the rk30");
2036 MODULE_AUTHOR("luowei lw@rock-chips.com");
2037 MODULE_LICENSE("GPL");