rk2928 rk30: support usb charging
[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
39 #if 0
40 #define DBG(x...)   printk(x)
41 #else
42 #define DBG(x...)
43 #endif
44
45 static int rk30_battery_dbg_level = 0;
46 module_param_named(dbg_level, rk30_battery_dbg_level, int, 0644);
47 #define pr_bat( args...) \
48         do { \
49                 if (rk30_battery_dbg_level) { \
50                         pr_info(args); \
51                 } \
52         } while (0)
53
54
55 /*******************ÒÔϲÎÊý¿ÉÒÔÐÞ¸Ä******************************/
56 #define TIMER_MS_COUNTS          1000   //¶¨Ê±Æ÷µÄ³¤¶Èms
57 //ÒÔϲÎÊýÐèÒª¸ù¾Ýʵ¼Ê²âÊÔµ÷Õû
58 #define SLOPE_SECOND_COUNTS                    15       //ͳ¼ÆµçѹбÂʵÄʱ¼ä¼ä¸ôs
59 #define DISCHARGE_MIN_SECOND                   45       //×î¿ì·Åµçµç1%ʱ¼ä
60 #define CHARGE_MIN_SECOND                      45       //×î¿ì³äµçµç1%ʱ¼ä
61 #define CHARGE_MID_SECOND                      90       //ÆÕͨ³äµçµç1%ʱ¼ä
62 #define CHARGE_MAX_SECOND                      250      //×³äµçµç1%ʱ¼ä
63 #define   CHARGE_FULL_DELAY_TIMES          10          //³äµçÂú¼ì²â·À¶¶Ê±¼ä
64 #define   USBCHARGE_IDENTIFY_TIMES        5           //²åÈëUSB»ìÁ÷£¬pcʶ±ð¼ì²âʱ¼ä
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 #if defined(CONFIG_ARCH_RK3066B)
77 #define  BAT_DEFINE_VALUE                                            1800
78 #elif defined(CONFIG_ARCH_RK2928)
79 #define  BAT_DEFINE_VALUE                                         3300
80 #else
81 #define  BAT_DEFINE_VALUE                                            2500
82 #endif
83
84
85 #define BATT_FILENAME "/data/bat_last_capacity.dat"
86
87 static struct wake_lock batt_wake_lock;
88
89
90 struct batt_vol_cal{
91         u32 disp_cal;
92         u32 dis_charge_vol;
93         u32 charge_vol;
94 };
95 #if 0
96
97 #ifdef CONFIG_BATTERY_RK30_VOL3V8
98
99 #define BATT_MAX_VOL_VALUE                             4120                     //ÂúµçʱµÄµç³Øµçѹ       
100 #define BATT_ZERO_VOL_VALUE                            3400                     //¹Ø»úʱµÄµç³Øµçѹ
101 #define BATT_NOMAL_VOL_VALUE                         3800               
102 //divider resistance 
103 #define BAT_PULL_UP_R                                         200
104 #define BAT_PULL_DOWN_R                                    200
105
106 static struct batt_vol_cal  batt_table[] = {
107         {0,3400,3520},{1,3420,3525},{2,3420,3575},{3,3475,3600},{5,3505,3620},{7,3525,3644},
108         {9,3540,3662},{11,3557,3670},{13,3570,3684},{15,3580,3700},{17,3610,3715},
109         {19,3630,3720},{21,3640,3748},{23,3652,3756},{25,3662,3775},{27,3672,3790},
110         {29,3680,3810},{31,3687,3814},{33,3693,3818},{35,3699,3822},{37,3705,3825},
111         {39,3710,3830},{41,3714,3832},{43,3718,3834},{45,3722,3836},{47,3726,3837},
112         {49,3730,3839},{51,3734,3841},{53,3738,3842},{55,3742,3844},{57,3746,3844},
113         {59,3750,3855},{61,3756,3860},{63,3764,3864},{65,3774,3871},{67,3786,3890},
114         {69,3800,3910},{71,3808,3930},{73,3817,3977},{75,3827,3977},{77,3845,3997},
115         {79,3950,4030},{81,3964,4047},{83,3982,4064},{85,4002,4080},{87,4026,4096},
116         {89,4030,4132},{91,4034,4144},{93,4055,4150},{95,4085,4195},{97,4085,4195},{100,4120,4200},
117 };
118 #else
119 #define BATT_MAX_VOL_VALUE                              8284                    //Full charge voltage
120 #define BATT_ZERO_VOL_VALUE                             6800                    // power down voltage 
121 #define BATT_NOMAL_VOL_VALUE                          7600                
122
123 //¶¨ÒåADC²ÉÑù·Öѹµç×裬ÒÔʵ¼ÊֵΪ׼£¬µ¥Î»K
124
125 #define BAT_PULL_UP_R                                         300 
126 #define BAT_PULL_DOWN_R                                    100
127
128 static struct batt_vol_cal  batt_table[] = {
129         {0,6800,7400},    {1,6840,7440},    {2,6880,7480},     {3,6950,7450},       {5,7010,7510},    {7,7050,7550},
130         {9,7080,7580},    {11,7104,7604},   {13,7140,7640},   {15,7160,7660},      {17,7220,7720},
131         {19,7260,7760},  {21,7280,7780},   {23,7304,7802},   {25,7324,7824},      {27,7344,7844},
132         {29,7360,7860},  {31,7374,7874},   {33,7386,7886},   {35,7398,7898},      {37,7410,7910},//500
133         {39,7420,7920},  {41,7424,7928},   {43,7436,7947},   {45,7444,7944},      {47,7450,7958}, //508
134         {49,7460,7965},  {51,7468,7975},   {53, 7476,7990},  {55,7482,8000},      {57,7492,8005}, // 5 14
135         {59,7500,8011},  {61,7510,8033},   {63,7528,8044},   {65,7548,8055},      {67,7560,8066},//506
136         {69,7600,8070},  {71,7618,8075},   {73,7634,8080},   {75,7654,8085},      {77,7690,8100}, //400
137         {79,7900,8180},  {81,7920,8210},   {83,7964,8211},   {85,8000,8214},      {87,8002,8218},//290
138         {89,8012, 8220}, {91,8022,8235},   {93,8110,8260},   {95,8140,8290},       {97,8170,8300},  {100,8200 ,8310},//110
139
140 };
141 #endif
142
143
144
145 #define BATT_NUM  ARRAY_SIZE(batt_table)
146 #endif
147
148 #define BATTERY_APK 
149
150 #ifdef  BATTERY_APK
151
152 #define BATT_NUM  11
153 #include <linux/fs.h>
154 int    battery_dbg_level = 0;
155 int    battery_test_flag = 0;
156 int gVoltageCnt = 3400;
157 int gDoubleVoltageCnt = 6800;
158 #ifdef CONFIG_BATTERY_RK30_VOL3V8
159 #define BATT_MAX_VOL_VALUE                             4120                     //ÂúµçʱµÄµç³Øµçѹ       
160 #define BATT_ZERO_VOL_VALUE                            3400                     //¹Ø»úʱµÄµç³Øµçѹ
161 #define BATT_NOMAL_VOL_VALUE                         3800     
162          
163 //int    pull_up_res  =100;
164 //int    pull_down_res = 100;
165
166
167 static int batt_table[2*BATT_NUM+6] =
168 {
169         0x4B434F52,0x7461625F,0x79726574,0,100,100,
170         3496, 3548, 3599, 3626, 3655, 3697, 3751, 3812, 3877, 3949, 4030,  //discharge
171         3540, 3785, 3842, 3861, 3915, 3980, 4041, 4135, 4169, 4175, 4185          //charge
172 };
173 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
174 #else
175 #define BATT_MAX_VOL_VALUE                              8284                    //Full charge voltage
176 #define BATT_ZERO_VOL_VALUE                             6800                    // power down voltage 
177 #define BATT_NOMAL_VOL_VALUE                          7600                
178 //int    pull_up_res  =300;
179 //int    pull_down_res = 100;
180 //¶¨ÒåADC²ÉÑù·Öѹµç×裬ÒÔʵ¼ÊֵΪ׼£¬µ¥Î»K
181
182 static int batt_table[2*BATT_NUM+6] =
183 {
184         0x4B434F52,0x7461625F,0x79726574,1,300,100,
185         6800,7242,7332,7404,7470,7520,7610,7744,7848,8016,8284,
186         7630, 7754, 7852, 7908, 7956, 8024, 8112, 8220, 8306, 8318, 8328
187 };
188 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
189
190
191 #endif
192 #else
193 //#define adc_to_voltage(adc_val)                           ((adc_val * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R))
194 #endif
195 int Cnt=0;
196 unsigned long gSecondsCnt = 0;
197
198 char gDischargeFlag[3] = {"on "};
199
200
201 /********************************************************************************/
202
203 extern int dwc_vbus_status(void);
204 extern int get_msc_connect_flag(void);
205
206 struct rk30_adc_battery_data {
207         int irq;
208         
209         //struct timer_list       timer;
210         struct workqueue_struct *wq;
211         struct delayed_work         delay_work;
212         struct work_struct          dcwakeup_work;
213         struct work_struct                   lowerpower_work;
214         bool                    resume;
215         
216         struct rk30_adc_battery_platform_data *pdata;
217
218         int                     full_times;
219         
220         struct adc_client       *client; 
221         int                     adc_val;
222         int                     adc_samples[NUM_VOLTAGE_SAMPLE+2];
223         
224         int                     bat_status;
225         int                     bat_status_cnt;
226         int                     bat_health;
227         int                     bat_present;
228         int                     bat_voltage;
229         int                     bat_capacity;
230         int                     bat_change;
231         
232         int                     old_charge_level;
233         int                    *pSamples;
234         int                     gBatCapacityDisChargeCnt;
235         int                     gBatCapacityChargeCnt;
236         int               capacitytmp;
237         int                     poweron_check;
238         int                     suspend_capacity;
239         int                     gBatUsbChargeCnt;
240         int                     status_lock;
241
242         int                    usb_charging;
243         int                    ac_charging;
244
245
246 };
247 static struct rk30_adc_battery_data *gBatteryData;
248
249
250 #ifdef  BATTERY_APK
251 #define BAT_ADC_TABLE_LEN               11
252 static ssize_t bat_param_read(struct device *dev,struct device_attribute *attr, char *buf)
253 {
254 #if 1
255         int i;
256         for(i=0;i<BATT_NUM;i++)
257                 printk("i=%d batt_table=%d\n",i+6,batt_table[i+6]);
258
259         for(i=0;i<BATT_NUM;i++)
260                 printk("i=%d batt_table=%d\n",i+17,batt_table[i+17]);
261 #endif
262         return 0;
263 }
264 DEVICE_ATTR(batparam, 0664, bat_param_read,NULL);
265
266
267 static ssize_t rkbatt_show_debug_attrs(struct device *dev,
268                                               struct device_attribute *attr, char *buf) 
269 {                                
270         return sprintf(buf, "%d\n", battery_dbg_level);
271 }
272
273 static ssize_t rkbatt_restore_debug_attrs(struct device *dev, 
274                                                 struct device_attribute *attr,
275                                                 const char *buf, size_t size)
276 {
277         int liTmp;
278         
279         sscanf(buf, "%d", &liTmp);
280         
281         if(liTmp != 0 && liTmp != 1)
282         {
283                 dev_err(dev, "rk29adc_restore_debug_attrs err\n");
284         }
285         else
286         {
287                 battery_dbg_level = liTmp;
288         }
289         return size;
290 }
291 static int  is_charge_ok(struct rk30_adc_battery_data *bat);
292
293 static ssize_t rkbatt_show_state_attrs(struct device *dev,
294                                               struct device_attribute *attr,
295                                               char *buf) 
296 {
297 //      struct rk30_adc_battery_platform_data *pdata = gBatteryData->pdata;
298         int charge_ok_value =0 ;
299         charge_ok_value = is_charge_ok(gBatteryData) ;
300
301         return  sprintf(buf,
302                 "gBatVol=%d,gBatCap=%d,charge_ok=%d,%s\n",
303                 gBatteryData->bat_voltage,gBatteryData->bat_capacity,
304                 charge_ok_value,gDischargeFlag);
305 }
306
307 static ssize_t rkbatt_restore_state_attrs(struct device *dev, 
308                                                 struct device_attribute *attr,
309                                                 const char *buf, size_t size)
310 {
311         return size;
312 }
313
314 static ssize_t rkbatt_show_value_attrs(struct device *dev,
315                                               struct device_attribute *attr, char *buf) 
316 {                                
317         return sprintf(buf, "pull_up_res =%d,\npull_down_res=%d\n", batt_table[4],batt_table[5]);
318 }
319
320 static ssize_t rkbatt_restore_value_attrs(struct device *dev, 
321                                                 struct device_attribute *attr,
322                                                 const char *buf, size_t size)
323 {
324         int liUp        = 0;
325         int liDown      = 0;
326         
327         sscanf(buf, "%d,%d", &liUp,&liDown);
328         
329         if(liUp != 0 && liDown != 0)
330         {
331                 batt_table[4] = liUp;
332                 batt_table[5] = liDown;
333         }
334         else
335         {
336                 //nothing
337         }
338         return size;
339 }
340
341 static ssize_t rkbatt_show_flag_attrs(struct device *dev,
342                                               struct device_attribute *attr, char *buf) 
343 {                                
344         return sprintf(buf, "rk29_battery_test_flag=%d\n", battery_test_flag);
345 }
346 static ssize_t rkbatt_restore_flag_attrs(struct device *dev, 
347                                                 struct device_attribute *attr,
348                                                 const char *buf, size_t size)
349 {
350         int liFlag;
351         
352         sscanf(buf, "%d", &liFlag);
353         
354         if(liFlag != 0)
355         {
356                 battery_test_flag = liFlag;
357         }
358         return size;
359 }
360 static struct device_attribute rkbatt_attrs[] = {
361         __ATTR(state, 0664, rkbatt_show_state_attrs, rkbatt_restore_state_attrs),
362         __ATTR(debug, 0664, rkbatt_show_debug_attrs, rkbatt_restore_debug_attrs),
363         __ATTR(value, 0666, rkbatt_show_value_attrs, rkbatt_restore_value_attrs),
364         __ATTR(flag,  0666, rkbatt_show_flag_attrs,  rkbatt_restore_flag_attrs),
365 };
366
367 static int create_sysfs_interfaces(struct device *dev)
368 {
369         int liTmep;
370         for (liTmep = 0; liTmep < ARRAY_SIZE(rkbatt_attrs); liTmep++)
371         {
372                 if (device_create_file(dev, rkbatt_attrs + liTmep))
373                 {
374                         goto error;
375                 }
376         }
377
378         return 0;
379
380 error:
381         for ( ; liTmep >= 0; liTmep--)
382         {
383                 device_remove_file(dev, rkbatt_attrs + liTmep);
384         }
385         
386         dev_err(dev, "%s:Unable to create sysfs interface\n", __func__);
387         return -1;
388 }
389
390 #endif
391
392
393
394 enum {
395         BATTERY_STATUS          = 0,
396         BATTERY_HEALTH          = 1,
397         BATTERY_PRESENT         = 2,
398         BATTERY_CAPACITY        = 3,
399         BATTERY_AC_ONLINE       = 4,
400         BATTERY_STATUS_CHANGED  = 5,
401         AC_STATUS_CHANGED       = 6,
402         BATTERY_INT_STATUS          = 7,
403         BATTERY_INT_ENABLE          = 8,
404 };
405
406 typedef enum {
407         CHARGER_BATTERY = 0,
408         CHARGER_USB,
409         CHARGER_AC
410 } charger_type_t;
411
412
413
414
415
416 static int rk30_adc_battery_load_capacity(void)
417 {
418         char value[4];
419         int* p = (int *)value;
420         long fd = sys_open(BATT_FILENAME,O_RDONLY,0);
421
422         if(fd < 0){
423                 pr_bat("rk30_adc_battery_load_capacity: open file /data/bat_last_capacity.dat failed\n");
424                 return -1;
425         }
426
427         sys_read(fd,(char __user *)value,4);
428         sys_close(fd);
429
430         return (*p);
431 }
432
433 static void rk30_adc_battery_put_capacity(int loadcapacity)
434 {
435         char value[4];
436         int* p = (int *)value;
437         long fd = sys_open(BATT_FILENAME,O_CREAT | O_RDWR,0);
438
439         if(fd < 0){
440                 pr_bat("rk30_adc_battery_put_capacity: open file /data/bat_last_capacity.dat failed\n");
441                 return;
442         }
443         
444         *p = loadcapacity;
445         sys_write(fd, (const char __user *)value, 4);
446
447         sys_close(fd);
448 }
449
450 static void rk30_adc_battery_charge_enable(struct rk30_adc_battery_data *bat)
451 {
452         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
453
454         if (pdata->charge_set_pin != INVALID_GPIO){
455                 gpio_direction_output(pdata->charge_set_pin, pdata->charge_set_level);
456         }
457 }
458
459 static void rk30_adc_battery_charge_disable(struct rk30_adc_battery_data *bat)
460 {
461         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
462
463         if (pdata->charge_set_pin != INVALID_GPIO){
464                 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
465         }
466 }
467
468 //extern int suspend_flag;
469 static int rk30_adc_battery_get_charge_level(struct rk30_adc_battery_data *bat)
470 {
471         int charge_on = 0;
472         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
473
474 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
475         if (pdata->dc_det_pin != INVALID_GPIO){
476                 if (gpio_get_value (pdata->dc_det_pin) == pdata->dc_det_level){
477                         //charge_on = 1;
478                         bat -> ac_charging = 1;
479                 }
480                 else{
481                         bat -> ac_charging = 0;
482
483                 }
484         }
485         else{
486                 if(pdata->is_dc_charging){
487                         //charge_on =pdata->is_dc_charging();
488                         bat ->ac_charging = pdata->is_dc_charging();;
489                 }
490         }
491 #endif
492         if(1 == pdata->spport_usb_charging){
493                 if (charge_on == 0){
494                         if (1 == dwc_vbus_status()) {
495                                 if (0 == get_msc_connect_flag()){ 
496                                         if (++bat->gBatUsbChargeCnt >= NUM_USBCHARGE_IDENTIFY_TIMES){
497                                                 bat->gBatUsbChargeCnt = NUM_USBCHARGE_IDENTIFY_TIMES + 1;
498                                                 //charge_on = 1;
499                                                 bat->usb_charging =1;
500                                                 if(bat -> pdata ->control_usb_charging)
501                                                         bat -> pdata ->control_usb_charging(0);
502
503                                                 //printk("1 == dwc_vbus_status\n");
504                                         }
505                                 }                            
506                         }else{
507                                 bat->gBatUsbChargeCnt = 0;
508                                 if (2 == dwc_vbus_status()) {
509                                         //charge_on = 1;
510                                         bat->usb_charging =1;
511                                         if(bat -> pdata ->control_usb_charging)
512                                                         bat -> pdata ->control_usb_charging(1);
513                                         //printk("2 == dwc_vbus_status\n");
514                                 }else{
515                                         bat->usb_charging =0;
516                                 }
517                 }
518                 }
519         }
520 #if 0
521         if (pdata->spport_usb_charging)  //is usb charging 
522                 if(pdata->is_usb_charging)
523                         charge_on = pdata->is_usb_charging();
524
525 #endif
526         if((bat->usb_charging == 1)||(bat ->ac_charging ==1))
527                 charge_on =1;
528         return charge_on;
529 }
530 static int  is_charge_ok(struct rk30_adc_battery_data *bat)
531 {
532         int charge_is_ok = 0;
533         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
534
535         if((pdata->charge_ok_pin == INVALID_GPIO)&& ( pdata->charging_ok == NULL))
536                 return -1;
537         
538         if (pdata->charge_ok_pin != INVALID_GPIO){              
539                 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level)
540                 {
541                         charge_is_ok =1;
542                 }
543         }else if( pdata->charging_ok)
544                 {       
545                 charge_is_ok = pdata->charging_ok();
546                 }
547         return charge_is_ok;
548
549
550 }
551
552
553 //int old_charge_level;
554 static int rk30_adc_battery_status_samples(struct rk30_adc_battery_data *bat)
555 {
556         int charge_level;
557         
558 //      struct rk30_adc_battery_platform_data *pdata = bat->pdata;
559
560         charge_level = rk30_adc_battery_get_charge_level(bat);
561
562         //¼ì²â³äµç״̬±ä»¯Çé¿ö
563         if (charge_level != bat->old_charge_level){
564                 bat->old_charge_level = charge_level;
565                 bat->bat_change  = 1;
566                 
567                 if(charge_level) {            
568                         rk30_adc_battery_charge_enable(bat);
569                 }
570                 else{
571                         rk30_adc_battery_charge_disable(bat);
572                 }
573                 bat->bat_status_cnt = 0;        //״̬±ä»¯¿ªÊ¼¼ÆÊý
574         }
575
576         if(charge_level == 0){   
577         //discharge
578                 bat->full_times = 0;
579                 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
580         }
581         else{
582         //CHARGE            
583                 if( is_charge_ok(bat)  ==  INVALID_CHARGE_CHECK){
584
585                         if (bat->bat_capacity == 100){
586                                 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
587                                         bat->bat_status = POWER_SUPPLY_STATUS_FULL;
588                                         bat->bat_change  = 1;
589                                 }
590                         }
591                         else{
592                                 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
593                         }
594                 }
595                 else{  // pin of charge_ok_pin
596                         if (is_charge_ok(bat) != CHARGE_IS_OK ){
597
598                                 bat->full_times = 0;
599                                 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
600                         }
601                         else{
602         //¼ì²âµ½³äµçÂúµçƽ±êÖ¾
603                                 bat->full_times++;
604
605                                 if (bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) {
606                                         bat->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
607                                 }
608
609                                 if ((bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) && (bat->bat_capacity >= 99)){
610                                         if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
611                                                 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
612                                                 bat->bat_capacity = 100;
613                                                 bat->bat_change  = 1;
614                                         }
615                                 }
616                                 else{
617                                         bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
618                                 }
619                         }
620                 }
621         }
622
623         return charge_level;
624 }
625 static int rk_adc_voltage(int value)
626 {
627         int voltage;
628
629         int ref_voltage; //reference_voltage
630         int pullup_res;
631         int pulldown_res;
632
633         ref_voltage = gBatteryData ->pdata->reference_voltage;
634         pullup_res = gBatteryData ->pdata->pull_up_res;
635         pulldown_res = gBatteryData ->pdata->pull_down_res;
636
637         if(ref_voltage && pullup_res && pulldown_res){
638                 
639                 voltage =  ((value * ref_voltage * (pullup_res + pulldown_res)) / (1024 * pulldown_res));
640                 
641         }else{
642                 voltage = adc_to_voltage(value);        
643         }
644                 
645                 
646         return voltage;
647
648 }
649 static void rk_handle_ripple(struct rk30_adc_battery_data *bat, int status)
650 {
651         
652 #if  0
653                 if(1 == status){
654                         if(bat->bat_voltage >=  bat->pdata->charge_table[bat->pdata->table_size-1]+ 10)
655                                 bat->bat_voltage = bat->pdata->charge_table[bat->pdata->table_size-1]  + 10;
656                         else if(bat->bat_voltage <= bat->pdata->charge_table[0] - 10)
657                                 bat->bat_voltage =   bat->pdata->charge_table[0] - 10;
658                 }
659                 else{
660                         if(bat->bat_voltage >=  bat->pdata->discharge_table[bat->pdata->table_size-1]+ 10)
661                                 bat->bat_voltage =  bat->pdata->discharge_table[ bat->pdata->table_size-1] + 10;
662                         else if(bat->bat_voltage <=   bat->pdata->discharge_table[ 0]  - 10)
663                                 bat->bat_voltage =   bat->pdata->discharge_table[ 0] - 10;
664
665                 }
666 #endif 
667         int *p_table;
668
669         if (bat->pdata->use_board_table){
670                 p_table = bat->pdata->board_batt_table; 
671
672                 if(1 == status){
673                         if(bat->bat_voltage >= p_table[2*BATT_NUM +5]+ 10)
674                                 bat->bat_voltage = p_table[2*BATT_NUM +5]  + 10;
675                         else if(bat->bat_voltage <= p_table[BATT_NUM +6]  - 10)
676                                 bat->bat_voltage =  p_table[BATT_NUM +6] - 10;
677                 }
678                 else{
679                         if(bat->bat_voltage >= p_table[BATT_NUM +5]+ 10)
680                                 bat->bat_voltage = p_table[BATT_NUM +5]  + 10;
681                         else if(bat->bat_voltage <= p_table[6]  - 10)
682                                 bat->bat_voltage =  p_table[6] - 10;
683                 }
684         }
685
686 }
687
688 static int *pSamples;
689 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
690 {
691         int value;
692         int i,*pStart = bat->adc_samples, num = 0;
693         int level = rk30_adc_battery_get_charge_level(bat);
694
695
696         value = bat->adc_val;
697         adc_async_read(bat->client);
698
699         *pSamples++ = rk_adc_voltage(value);
700
701         bat->bat_status_cnt++;
702         if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE)  bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
703
704         num = pSamples - pStart;
705         
706         if (num >= NUM_VOLTAGE_SAMPLE){
707                 pSamples = pStart;
708                 num = NUM_VOLTAGE_SAMPLE;
709                 
710         }
711
712         value = 0;
713         for (i = 0; i < num; i++){
714                 value += bat->adc_samples[i];
715         }
716         bat->bat_voltage = value / num;
717
718         /*Ïû³ýë´Ìµçѹ*/
719         if(battery_test_flag == 0)
720         {
721                 if(0 == bat->pdata->use_board_table){
722                         if(1 == level){
723                                 if(bat->bat_voltage >= batt_table[2*BATT_NUM +5]+ 10)
724                                         bat->bat_voltage = batt_table[2*BATT_NUM +5]  + 10;
725                                 else if(bat->bat_voltage <= batt_table[BATT_NUM +6]  - 10)
726                                         bat->bat_voltage =  batt_table[BATT_NUM +6] - 10;
727                         }
728                         else{
729                                 if(bat->bat_voltage >= batt_table[BATT_NUM +5]+ 10)
730                                         bat->bat_voltage = batt_table[BATT_NUM +5]  + 10;
731                                 else if(bat->bat_voltage <= batt_table[6]  - 10)
732                                         bat->bat_voltage =  batt_table[6] - 10;
733                         }
734                 }else{
735                         rk_handle_ripple(bat, level);
736                 }
737
738         }else if(battery_test_flag == 2){
739         
740                 if(batt_table[3] == 0){
741                         if(bat->bat_voltage < 3400){
742                                 //printk("gSecondsCnt=%ld,get_seconds()=%ld,(get_seconds() - gSecondsCnt)=%ld-------------------1\n",gSecondsCnt,get_seconds(),(get_seconds() - gSecondsCnt));
743                                 if((get_seconds() - gSecondsCnt) > 30){
744                                         gSecondsCnt = get_seconds();
745                                         //printk("gSecondsCnt=%ld,gVoltageCnt=%d,(gVoltageCnt - bat->bat_voltage)=%d,bat->bat_voltage=%d-------------------2\n",gSecondsCnt,gVoltageCnt,(gVoltageCnt - bat->bat_voltage),bat->bat_voltage);
746                                         if((gVoltageCnt - bat->bat_voltage) > 15){
747                                                 //gVoltageCnt = bat->bat_voltage;
748                                                 //printk("gVoltageCnt=%d-------------------3\n",gVoltageCnt);
749                                                 strncpy(gDischargeFlag, "off" ,3);      
750                                         }
751                                         gVoltageCnt = bat->bat_voltage;
752
753                                 }
754                         }
755                         
756                         if(bat->bat_voltage < 3400){
757                                 bat->bat_voltage = 3400;
758                         }
759                 }
760                 else{
761                         if(bat->bat_voltage < 6800){
762                                 //printk("gSecondsCnt=%ld,get_seconds()=%ld,(get_seconds() - gSecondsCnt)=%ld-------------------1\n",gSecondsCnt,get_seconds(),(get_seconds() - gSecondsCnt));
763                                 if((get_seconds() - gSecondsCnt) > 30){
764                                         gSecondsCnt = get_seconds();
765                                         //printk("gSecondsCnt=%ld,gVoltageCnt=%d,(gVoltageCnt - bat->bat_voltage)=%d,bat->bat_voltage=%d-------------------2\n",gSecondsCnt,gVoltageCnt,(gVoltageCnt - bat->bat_voltage),bat->bat_voltage);
766                                         if((gDoubleVoltageCnt - bat->bat_voltage) > 30){
767                                                 //gVoltageCnt = bat->bat_voltage;
768                                                 //printk("gVoltageCnt=%d-------------------3\n",gVoltageCnt);
769                                                 strncpy(gDischargeFlag, "off" ,3);      
770                                         }
771                                         gDoubleVoltageCnt =bat->bat_voltage;
772                                 }
773                         }
774                         if(bat->bat_voltage < 6800){
775                                 bat->bat_voltage = 6800;
776                         }       
777                 }
778         }
779 /****************************************************/
780 }
781 #if 0
782 static int rk_voltage_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
783 {
784
785         int i = 0;
786         int capacity = 0;
787         int size =bat->pdata->table_size;
788         int *p;
789         int *p_capacity = bat->pdata->property_tabel;
790         
791         if (rk30_adc_battery_get_charge_level(bat)){  //charge
792                 p =  bat->pdata->charge_table;
793                 if(BatVoltage >= (p[size - 1])){
794                         capacity = 99;
795                 }       
796                 else{
797                         if(BatVoltage <= (p[0])){
798                                 capacity = 0;
799                         }
800                         else{
801                                 for(i = 0; i < size - 1; i++){
802
803                                         if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
804                                                 capacity = p_capacity[i] + ((BatVoltage - p[i]) *  (p_capacity[i+1] -p_capacity[i]))/ (p[i+1]- p[i]);
805                                                 break;
806                                         }
807                                 }
808                         }  
809                 }
810
811         }
812         else{  //discharge
813                 p =  bat->pdata->discharge_table;
814                 if(BatVoltage >= (p[size - 1])){
815                         capacity = 100;
816                 }       
817                 else{
818                         if(BatVoltage <= p[0]){
819                                 capacity = 0;
820                         }
821                         else{
822                                 for(i = 0; i < size - 1; i++){
823                                         if((p[i] <= BatVoltage) &&( BatVoltage < p[i+1])){
824                                                 capacity =  p_capacity[i]+ ((BatVoltage - p[i]) * (p_capacity[i+1] -p_capacity[i] ) )/ (p[i+1]- p[i]) ;
825                                                 break;
826                                         }
827                                 }
828                         }  
829
830                 }
831
832
833         }
834             return capacity;
835
836
837 }
838
839 #endif
840 static int rk30_adc_battery_voltage_to_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
841 {
842         int i = 0;
843         int capacity = 0;
844
845         int  *p;
846         if (bat->pdata->use_board_table)
847                 p = bat->pdata->board_batt_table;       
848         else 
849                 p = batt_table;
850
851 //      rk30_battery_table_info_dump(p);
852
853         if (rk30_adc_battery_get_charge_level(bat)){  //charge
854                         if(BatVoltage >= (p[2*BATT_NUM +5])){
855                                 capacity = 100;
856                         }       
857                         else{
858                                 if(BatVoltage <= (p[BATT_NUM +6])){
859                                         capacity = 0;
860                                 }
861                                 else{
862                                         for(i = BATT_NUM +6; i <2*BATT_NUM +6; i++){
863
864                                                 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
865                                                         capacity = (i-(BATT_NUM +6))*10 + ((BatVoltage - p[i]) *  10)/ (p[i+1]- p[i]);
866                                                         break;
867                                                 }
868                                         }
869                                 }  
870                         }
871
872                 }else{  //discharge
873                         if(BatVoltage >= (p[BATT_NUM +5])){
874                                 capacity = 100;
875                         }       
876                         else{
877                                 if(BatVoltage <= (p[6])){
878                                         capacity = 0;
879                                 }
880                                 else{
881                                         for(i = 6; i < BATT_NUM +6; i++){
882                                                 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
883                                                         capacity = (i-6)*10+ ((BatVoltage - p[i]) *10 )/ (p[i+1]- p[i]) ;
884                                                         break;
885                                                 }
886                                         }
887                                 }  
888
889                         }
890
891
892                 }
893
894 //      }
895     return capacity;
896 }
897
898 static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat)
899 {
900         int capacity = 0;
901 //      struct rk30_adc_battery_platform_data *pdata = bat->pdata;
902         int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
903         int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
904
905         //³ä·Åµç״̬±ä»¯ºó£¬BufferÌîÂú֮ǰ£¬²»¸üÐÂ
906         if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE)  {
907                 bat->gBatCapacityDisChargeCnt = 0;
908                 bat->gBatCapacityChargeCnt    = 0;
909                 return;
910         }
911         
912         capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
913             
914         if (rk30_adc_battery_get_charge_level(bat)){
915                 if (capacity > bat->bat_capacity){
916                         if(capacity > bat->bat_capacity + 10 )
917                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10;  //5s
918                         else if(capacity > bat->bat_capacity + 7 )
919                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
920                                 else if(capacity > bat->bat_capacity + 3 )
921                                         timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
922                         //ʵ¼Ê²ÉÑùµ½µÄÈÝÁ¿±ÈÏÔʾµÄÈÝÁ¿´ó£¬Öð¼¶ÉÏÉý
923                         if (++(bat->gBatCapacityDisChargeCnt) >= timer_of_charge_sample){
924                                 bat->gBatCapacityDisChargeCnt  = 0;
925                                 if (bat->bat_capacity < 99){
926                                         bat->bat_capacity++;
927                                         bat->bat_change  = 1;
928                                 }
929                         }
930                         bat->gBatCapacityChargeCnt = 0;
931                 }
932                 else{  //   Êµ¼ÊµÄÈÝÁ¿±È²ÉÑù±È ÏÔʾµÄÈÝÁ¿Ð¡
933                             bat->gBatCapacityDisChargeCnt = 0;
934                             (bat->gBatCapacityChargeCnt)++;
935                                 if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
936                         //if (pdata->charge_ok_pin != INVALID_GPIO){
937                                 //if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
938                                 if( is_charge_ok(bat) == CHARGE_IS_OK){
939                                         if(capacity > bat->bat_capacity + 10 )
940                                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -13;  //  2s
941                                         else if(capacity > bat->bat_capacity + 7 )
942                                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10; //10s
943                                         else if(capacity > bat->bat_capacity + 2 )
944                                                 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -8; //7s                                 
945                                 //¼ì²âµ½µç³Ø³äÂú±êÖ¾£¬Í¬Ê±³¤Ê±¼äÄÚ³äµçµçѹÎޱ仯£¬¿ªÊ¼Æô¶¯¼Æʱ³äµç£¬¿ìËÙÉÏÉýÈÝÁ¿
946                                         if (bat->gBatCapacityChargeCnt >= timer_of_charge_sample){
947                                                 bat->gBatCapacityChargeCnt = 0;
948                                                 if (bat->bat_capacity < 99){
949                                                         bat->bat_capacity++;
950                                                         bat->bat_change  = 1;
951                                                 }
952                                         }
953                                 }
954                                 else{
955 #if 0                                   
956                                         if (capacity > capacitytmp){
957                                         //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
958                                                 gBatCapacityChargeCnt = 0;
959                                         }
960                                         else if (/*bat->bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
961                                                 gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
962
963                                                 if (bat->bat_capacity < 99){
964                                                 bat->bat_capacity++;
965                                                 bat->bat_change  = 1;
966                                                 }
967                                         }
968                                 }
969 #else                   //  ·ÀÖ¹µç³ØÀÏ»¯ºó³öÏֳ岻ÂúµÄÇé¿ö£¬
970                                         if (capacity > bat->capacitytmp){
971                                         //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
972                                                 bat->gBatCapacityChargeCnt = 0;
973                                         }
974                                         else{
975
976                                                 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
977                                                         bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
978
979                                                         if (bat->bat_capacity < 99){
980                                                                 bat->bat_capacity++;
981                                                                 bat->bat_change  = 1;
982                                                         }
983                                                 }
984                                         }
985                                 }
986 #endif
987
988                         }
989                         else{
990                         //ûÓгäµçÂú¼ì²â½Å£¬³¤Ê±¼äÄÚµçѹÎޱ仯£¬¶¨Ê±Æ÷Ä£Äâ³äµç
991                                 if (capacity > bat->capacitytmp){
992                                 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
993                                         bat->gBatCapacityChargeCnt = 0;
994                                 }
995                                 else{
996
997                                         if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
998                                                 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
999
1000                                                 if (bat->bat_capacity < 99){
1001                                                         bat->bat_capacity++;
1002                                                         bat->bat_change  = 1;
1003                                                 }
1004                                         }
1005                                 }
1006                                 
1007
1008                         }            
1009                 }
1010         }    
1011         else{   
1012         //·Åµçʱ,Ö»ÔÊÐíµçѹϽµ
1013                 if (capacity < bat->bat_capacity){
1014                         if(capacity + 10 > bat->bat_capacity  )
1015                                 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10;  //5s
1016                         else if(capacity  + 7 > bat->bat_capacity )
1017                                 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
1018                                 else if(capacity  + 3> bat->bat_capacity )
1019                                         timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
1020
1021                         if (++(bat->gBatCapacityDisChargeCnt) >= timer_of_discharge_sample){
1022                                 bat->gBatCapacityDisChargeCnt = 0;
1023                                 if (bat->bat_capacity > 0){
1024                                         bat->bat_capacity-- ;
1025                                         bat->bat_change  = 1;
1026                                 }
1027                         }
1028                 }
1029                 else{
1030                         bat->gBatCapacityDisChargeCnt = 0;
1031                 }
1032                 bat->gBatCapacityChargeCnt = 0;
1033         }
1034                 bat->capacitytmp = capacity;
1035 }
1036
1037 //static int poweron_check = 0;
1038 static void rk30_adc_battery_poweron_capacity_check(void)
1039 {
1040
1041         int new_capacity, old_capacity;
1042          int cnt = 50 ;
1043
1044         new_capacity = gBatteryData->bat_capacity;
1045
1046         while( cnt -- ){
1047             old_capacity = rk30_adc_battery_load_capacity();
1048            // printk("------------------->> : %d \n",old_capacity);
1049             if( old_capacity >= 0 ){
1050                 break ;
1051             }
1052             msleep(100);
1053         }
1054 //      printk("---------------------------------------------------------->> : %d \n",old_capacity);
1055         if ((old_capacity < 0) || (old_capacity > 100)){
1056                 old_capacity = new_capacity;
1057         }    
1058
1059         if (gBatteryData->bat_status == POWER_SUPPLY_STATUS_FULL){
1060                 if (new_capacity > 80){
1061                         gBatteryData->bat_capacity = 100;
1062                 }
1063         }
1064         else if (gBatteryData->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1065         //chargeing state
1066         //ÎÊÌ⣺
1067 //      //1£©³¤Ê±¼ä¹Ø»ú·ÅÖú󣬿ª»úºó¶ÁÈ¡µÄÈÝÁ¿Ô¶Ô¶´óÓÚʵ¼ÊÈÝÁ¿Ôõô°ì£¿
1068 //      //2£©Èç¹û²»ÕâÑù×ö£¬¶Ìʱ¼ä¹Ø»úÔÙ¿ª»ú£¬Ç°ºóÈÝÁ¿²»Ò»ÖÂÓÖ¸ÃÔõô°ì£¿
1069 //      //3£©Ò»ÏÂÄÇÖÖ·½Ê½ºÏÊÊ£¿
1070         //gBatteryData->bat_capacity = new_capacity;
1071                 gBatteryData->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1072         }else{
1073
1074                 if(new_capacity > old_capacity + 50 )
1075                         gBatteryData->bat_capacity = new_capacity;
1076                 else
1077                         gBatteryData->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;  //avoid the value of capacity increase 
1078         }
1079
1080
1081         printk("capacity = %d, new_capacity = %d, old_capacity = %d\n",gBatteryData->bat_capacity, new_capacity, old_capacity);
1082
1083         gBatteryData->bat_change = 1;
1084 }
1085
1086 static int rk30_adc_battery_get_usb_property(struct power_supply *psy, 
1087                                     enum power_supply_property psp,
1088                                     union power_supply_propval *val)
1089 {
1090         charger_type_t charger;
1091         charger =  CHARGER_USB;
1092
1093         switch (psp) {
1094         case POWER_SUPPLY_PROP_ONLINE:
1095                 if (psy->type == POWER_SUPPLY_TYPE_USB)
1096                         val->intval = gBatteryData ->usb_charging;
1097                 //printk("%s:%d\n",__FUNCTION__,val->intval);
1098                 break;
1099
1100         default:
1101                 return -EINVAL;
1102         }
1103         
1104         return 0;
1105
1106 }
1107
1108 static enum power_supply_property rk30_adc_battery_usb_props[] = {
1109     
1110         POWER_SUPPLY_PROP_ONLINE,
1111 };
1112
1113 static struct power_supply rk30_usb_supply = 
1114 {
1115         .name = "usb",
1116         .type = POWER_SUPPLY_TYPE_USB,
1117
1118         .get_property   = rk30_adc_battery_get_usb_property,
1119
1120         .properties     = rk30_adc_battery_usb_props,
1121         .num_properties = ARRAY_SIZE(rk30_adc_battery_usb_props),
1122 };
1123
1124 #if defined(CONFIG_BATTERY_RK30_AC_CHARGE)
1125 static irqreturn_t rk30_adc_battery_dc_wakeup(int irq, void *dev_id)
1126 {   
1127         queue_work(gBatteryData->wq, &gBatteryData->dcwakeup_work);
1128         return IRQ_HANDLED;
1129 }
1130
1131
1132 static int rk30_adc_battery_get_ac_property(struct power_supply *psy,
1133                         enum power_supply_property psp,
1134                         union power_supply_propval *val)
1135 {
1136         int ret = 0;
1137         charger_type_t charger;
1138         charger =  CHARGER_USB;
1139         switch (psp) {
1140         case POWER_SUPPLY_PROP_ONLINE:
1141                 if (psy->type == POWER_SUPPLY_TYPE_MAINS)
1142                 {
1143                         //if (rk30_adc_battery_get_charge_level(gBatteryData))
1144                         val->intval = gBatteryData ->ac_charging;
1145                 }
1146                 DBG("%s:%d\n",__FUNCTION__,val->intval);
1147                 break;
1148                 
1149         default:
1150                 ret = -EINVAL;
1151                 break;
1152         }
1153
1154         return ret;
1155 }
1156
1157 static enum power_supply_property rk30_adc_battery_ac_props[] = 
1158 {
1159         POWER_SUPPLY_PROP_ONLINE,
1160 };
1161
1162 static struct power_supply rk30_ac_supply = 
1163 {
1164         .name = "ac",
1165         .type = POWER_SUPPLY_TYPE_MAINS,
1166
1167         .get_property   = rk30_adc_battery_get_ac_property,
1168
1169         .properties     = rk30_adc_battery_ac_props,
1170         .num_properties = ARRAY_SIZE(rk30_adc_battery_ac_props),
1171 };
1172
1173 static void rk30_adc_battery_dcdet_delaywork(struct work_struct *work)
1174 {
1175         int ret;
1176         struct rk30_adc_battery_platform_data *pdata;
1177         int irq;
1178         int irq_flag;
1179         
1180         pdata    = gBatteryData->pdata;
1181         irq        = gpio_to_irq(pdata->dc_det_pin);
1182         irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1183
1184         rk28_send_wakeup_key(); // wake up the system
1185
1186         free_irq(irq, NULL);
1187         ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);// reinitialize the DC irq 
1188         if (ret) {
1189                 free_irq(irq, NULL);
1190         }
1191
1192         power_supply_changed(&rk30_ac_supply);
1193
1194         gBatteryData->bat_status_cnt = 0;        //the state of battery is change
1195
1196 }
1197
1198
1199 #endif
1200
1201 static int rk30_adc_battery_get_status(struct rk30_adc_battery_data *bat)
1202 {
1203         return (bat->bat_status);
1204 }
1205
1206 static int rk30_adc_battery_get_health(struct rk30_adc_battery_data *bat)
1207 {
1208         return POWER_SUPPLY_HEALTH_GOOD;
1209 }
1210
1211 static int rk30_adc_battery_get_present(struct rk30_adc_battery_data *bat)
1212 {
1213         return (bat->bat_voltage < BATT_MAX_VOL_VALUE) ? 0 : 1;
1214 }
1215
1216 static int rk30_adc_battery_get_voltage(struct rk30_adc_battery_data *bat)
1217 {
1218         return (bat->bat_voltage );
1219 }
1220
1221 static int rk30_adc_battery_get_capacity(struct rk30_adc_battery_data *bat)
1222 {
1223         return (bat->bat_capacity);
1224 }
1225
1226 static int rk30_adc_battery_get_property(struct power_supply *psy,
1227                                  enum power_supply_property psp,
1228                                  union power_supply_propval *val)
1229 {               
1230         int ret = 0;
1231
1232         switch (psp) {
1233                 case POWER_SUPPLY_PROP_STATUS:
1234                         val->intval = rk30_adc_battery_get_status(gBatteryData);
1235                         DBG("gBatStatus=%d\n",val->intval);
1236                         break;
1237                 case POWER_SUPPLY_PROP_HEALTH:
1238                         val->intval = rk30_adc_battery_get_health(gBatteryData);
1239                         DBG("gBatHealth=%d\n",val->intval);
1240                         break;
1241                 case POWER_SUPPLY_PROP_PRESENT:
1242                         val->intval = rk30_adc_battery_get_present(gBatteryData);
1243                         DBG("gBatPresent=%d\n",val->intval);
1244                         break;
1245                 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1246                         val ->intval = rk30_adc_battery_get_voltage(gBatteryData);
1247                         DBG("gBatVoltage=%d\n",val->intval);
1248                         break;
1249                 //      case POWER_SUPPLY_PROP_CURRENT_NOW:
1250                 //              val->intval = 1100;
1251                 //              break;
1252                 case POWER_SUPPLY_PROP_CAPACITY:
1253                         if(battery_test_flag == 2)
1254                                 val->intval = 50;
1255                         else
1256                                 val->intval = rk30_adc_battery_get_capacity(gBatteryData);
1257                         DBG("gBatCapacity=%d%%\n",val->intval);
1258                         break;
1259                 case POWER_SUPPLY_PROP_TECHNOLOGY:
1260                         val->intval = POWER_SUPPLY_TECHNOLOGY_LION;     
1261                         break;
1262                 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1263                         val->intval = BATT_MAX_VOL_VALUE;
1264                         break;
1265                 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1266                         val->intval = BATT_ZERO_VOL_VALUE;
1267                         break;
1268                 default:
1269                         ret = -EINVAL;
1270                         break;
1271         }
1272
1273         return ret;
1274 }
1275
1276 static enum power_supply_property rk30_adc_battery_props[] = {
1277
1278         POWER_SUPPLY_PROP_STATUS,
1279         POWER_SUPPLY_PROP_HEALTH,
1280         POWER_SUPPLY_PROP_PRESENT,
1281         POWER_SUPPLY_PROP_VOLTAGE_NOW,
1282 //      POWER_SUPPLY_PROP_CURRENT_NOW,
1283         POWER_SUPPLY_PROP_TECHNOLOGY,
1284         POWER_SUPPLY_PROP_CAPACITY,
1285         POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1286         POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1287 };
1288
1289 static struct power_supply rk30_battery_supply = 
1290 {
1291         .name = "battery",
1292         .type = POWER_SUPPLY_TYPE_BATTERY,
1293
1294         .get_property   = rk30_adc_battery_get_property,
1295
1296         .properties     = rk30_adc_battery_props,
1297         .num_properties = ARRAY_SIZE(rk30_adc_battery_props),
1298 };
1299
1300 #ifdef CONFIG_PM
1301 static void rk30_adc_battery_resume_check(void)
1302 {
1303         int i;
1304         int level,oldlevel;
1305         int new_capacity, old_capacity;
1306         struct rk30_adc_battery_data *bat = gBatteryData;
1307
1308         bat->old_charge_level = -1;
1309         pSamples = bat->adc_samples;
1310
1311         adc_sync_read(bat->client);                             //start adc sample
1312         level = oldlevel = rk30_adc_battery_status_samples(bat);//init charge status
1313
1314         for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) {               //0.3 s   
1315         
1316                 mdelay(1);
1317                 rk30_adc_battery_voltage_samples(bat);              //get voltage
1318                 level = rk30_adc_battery_status_samples(bat);       //check charge status
1319                 if (oldlevel != level){         
1320                     oldlevel = level;                               //if charge status changed, reset sample
1321                     i = 0;
1322                 }        
1323         }
1324         new_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1325         old_capacity =gBatteryData-> suspend_capacity;
1326
1327         if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1328         //chargeing state
1329                 bat->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1330         }
1331         else{
1332                 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;  // aviod the value of capacity increase    dicharge
1333         }
1334
1335 }
1336
1337 static int rk30_adc_battery_suspend(struct platform_device *dev, pm_message_t state)
1338 {
1339         int irq;
1340         gBatteryData->suspend_capacity = gBatteryData->bat_capacity;
1341         cancel_delayed_work(&gBatteryData->delay_work);
1342         
1343         if( gBatteryData->pdata->batt_low_pin != INVALID_GPIO){
1344                 
1345                 irq = gpio_to_irq(gBatteryData->pdata->batt_low_pin);
1346                 enable_irq(irq);
1347                 enable_irq_wake(irq);
1348         }
1349
1350         return 0;
1351 }
1352
1353 static int rk30_adc_battery_resume(struct platform_device *dev)
1354 {
1355         int irq;
1356         gBatteryData->resume = true;
1357         queue_delayed_work(gBatteryData->wq, &gBatteryData->delay_work, msecs_to_jiffies(100));
1358         if( gBatteryData->pdata->batt_low_pin != INVALID_GPIO){
1359                 
1360                 irq = gpio_to_irq(gBatteryData->pdata->batt_low_pin);
1361                 disable_irq_wake(irq);
1362                 disable_irq(irq);
1363         }
1364         return 0;
1365 }
1366 #else
1367 #define rk30_adc_battery_suspend NULL
1368 #define rk30_adc_battery_resume NULL
1369 #endif
1370
1371
1372 unsigned long AdcTestCnt = 0;
1373 static void rk30_adc_battery_timer_work(struct work_struct *work)
1374 {
1375 #ifdef CONFIG_PM
1376         if (gBatteryData->resume) {
1377                 rk30_adc_battery_resume_check();
1378                 gBatteryData->resume = false;
1379         }
1380 #endif
1381
1382
1383         rk30_adc_battery_status_samples(gBatteryData);
1384
1385         if (gBatteryData->poweron_check){   
1386                 gBatteryData->poweron_check = 0;
1387                 rk30_adc_battery_poweron_capacity_check();
1388         }
1389
1390         rk30_adc_battery_voltage_samples(gBatteryData);
1391         rk30_adc_battery_capacity_samples(gBatteryData);
1392
1393         if( 0 == gBatteryData ->pdata ->charging_sleep){
1394                 if( 1 == rk30_adc_battery_get_charge_level(gBatteryData)){  // charge
1395                         if(0 == gBatteryData->status_lock ){                    
1396                                 wake_lock(&batt_wake_lock);  //lock
1397                                 gBatteryData->status_lock = 1; 
1398                         }
1399                 }
1400                 else{
1401                         if(1 == gBatteryData->status_lock ){                    
1402                                 wake_unlock(&batt_wake_lock);  //unlock
1403                                 gBatteryData->status_lock = 0; 
1404                         }
1405
1406                 }
1407         }
1408         
1409         
1410         /*update battery parameter after adc and capacity has been changed*/
1411         if(gBatteryData->bat_change){
1412                 gBatteryData->bat_change = 0;
1413                 rk30_adc_battery_put_capacity(gBatteryData->bat_capacity);
1414                 power_supply_changed(&rk30_battery_supply);
1415 #if  defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1416                 if (gBatteryData->pdata->dc_det_pin == INVALID_GPIO){
1417                         power_supply_changed(&rk30_ac_supply);
1418                 }
1419
1420 #endif
1421                  if(1 == gBatteryData->pdata->spport_usb_charging){
1422                         power_supply_changed(&rk30_usb_supply);
1423                  }
1424
1425
1426         }
1427
1428         if (rk30_battery_dbg_level){
1429                 if (++AdcTestCnt >= 2)
1430                         {
1431                         AdcTestCnt = 0;
1432
1433                         pr_bat("Status = %d, RealAdcVal = %d, RealVol = %d,gBatVol = %d, gBatCap = %d, RealCapacity = %d, dischargecnt = %d, chargecnt = %d\n", 
1434                         gBatteryData->bat_status, gBatteryData->adc_val, rk_adc_voltage(gBatteryData->adc_val), 
1435                         gBatteryData->bat_voltage, gBatteryData->bat_capacity, gBatteryData->capacitytmp, gBatteryData->gBatCapacityDisChargeCnt,gBatteryData-> gBatCapacityChargeCnt);
1436
1437                 }
1438         }
1439         queue_delayed_work(gBatteryData->wq, &gBatteryData->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1440
1441 }
1442
1443
1444 static int rk30_adc_battery_io_init(struct rk30_adc_battery_platform_data *pdata)
1445 {
1446         int ret = 0;
1447         
1448         if (pdata->io_init) {
1449                 pdata->io_init();
1450                 return 0;
1451         }
1452         
1453         //charge control pin
1454         if (pdata->charge_set_pin != INVALID_GPIO){
1455                 ret = gpio_request(pdata->charge_set_pin, NULL);
1456                 if (ret) {
1457                         printk("failed to request dc_det gpio\n");
1458                         goto error;
1459                         }
1460                 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
1461         }
1462         
1463         //dc charge detect pin
1464         if (pdata->dc_det_pin != INVALID_GPIO){
1465                 ret = gpio_request(pdata->dc_det_pin, NULL);
1466                 if (ret) {
1467                         printk("failed to request dc_det gpio\n");
1468                         goto error;
1469                 }
1470         
1471                 gpio_pull_updown(pdata->dc_det_pin, GPIOPullUp);//important
1472                 ret = gpio_direction_input(pdata->dc_det_pin);
1473                 if (ret) {
1474                         printk("failed to set gpio dc_det input\n");
1475                         goto error;
1476                 }
1477         }
1478         
1479         //charge ok detect
1480         if (pdata->charge_ok_pin != INVALID_GPIO){
1481                 ret = gpio_request(pdata->charge_ok_pin, NULL);
1482                 if (ret) {
1483                         printk("failed to request charge_ok gpio\n");
1484                         goto error;
1485                 }
1486         
1487                 gpio_pull_updown(pdata->charge_ok_pin, GPIOPullUp);//important
1488                 ret = gpio_direction_input(pdata->charge_ok_pin);
1489                 if (ret) {
1490                         printk("failed to set gpio charge_ok input\n");
1491                         goto error;
1492                 }
1493         }
1494         //batt low pin
1495         if( pdata->batt_low_pin != INVALID_GPIO){
1496                 ret = gpio_request(pdata->batt_low_pin, NULL);
1497                 if (ret) {
1498                         printk("failed to request batt_low_pin gpio\n");
1499                         goto error;
1500                 }
1501         
1502                 gpio_pull_updown(pdata->batt_low_pin, GPIOPullUp); 
1503                 ret = gpio_direction_input(pdata->batt_low_pin);
1504                 if (ret) {
1505                         printk("failed to set gpio batt_low_pin input\n");
1506                         goto error;
1507                 }
1508         }
1509     
1510         return 0;
1511 error:
1512         return -1;
1513 }
1514
1515 extern void kernel_power_off(void);
1516 static void rk30_adc_battery_check(struct rk30_adc_battery_data *bat)
1517 {
1518         int i;
1519         int level,oldlevel;
1520         struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1521         //printk("%s--%d:\n",__FUNCTION__,__LINE__);
1522
1523         bat->old_charge_level = -1;
1524         bat->capacitytmp = 0;
1525         bat->suspend_capacity = 0;
1526         
1527         pSamples = bat->adc_samples;
1528
1529         adc_sync_read(bat->client);                             //start adc sample
1530         level = oldlevel = rk30_adc_battery_status_samples(bat);//init charge status
1531
1532         bat->full_times = 0;
1533         for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){                //0.3 s
1534                 mdelay(1);
1535                 rk30_adc_battery_voltage_samples(bat);              //get voltage
1536                 //level = rk30_adc_battery_status_samples(bat);       //check charge status
1537                 level = rk30_adc_battery_get_charge_level(bat);
1538
1539                 if (oldlevel != level){
1540                         oldlevel = level;                               //if charge status changed, reset sample
1541                         i = 0;
1542                 }        
1543         }
1544
1545         bat->bat_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);  //init bat_capacity
1546
1547         
1548         bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1549         if (rk30_adc_battery_get_charge_level(bat)){
1550                 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1551
1552                 if (pdata->charge_ok_pin != INVALID_GPIO){
1553                         if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
1554                                 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1555                                 bat->bat_capacity = 100;
1556                         }
1557                 }
1558         }
1559
1560
1561
1562 #if 0
1563 #if 1
1564         rk30_adc_battery_poweron_capacity_check();
1565 #else
1566         gBatteryData->poweron_check = 1;
1567 #endif
1568         gBatteryData->poweron_check = 0;
1569 #endif
1570 /*******************************************
1571 //¿ª»ú²ÉÑùµ½µÄµçѹºÍÉϴιػú±£´æµçѹÏà²î½Ï´ó£¬Ôõô´¦Àí£¿
1572 if (bat->bat_capacity > old_capacity)
1573 {
1574 if ((bat->bat_capacity - old_capacity) > 20)
1575 {
1576
1577 }
1578 }
1579 else if (bat->bat_capacity < old_capacity)
1580 {
1581 if ((old_capacity > bat->bat_capacity) > 20)
1582 {
1583
1584 }
1585 }
1586 *********************************************/
1587         if (bat->bat_capacity == 0) bat->bat_capacity = 1;
1588
1589
1590         if(1==gBatteryData -> pdata->low_voltage_protection)
1591                 if ((bat->bat_voltage <= BATT_ZERO_VOL_VALUE)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING)){
1592                         kernel_power_off();
1593                 }
1594
1595 }
1596
1597 static void rk30_adc_battery_callback(struct adc_client *client, void *param, int result)
1598 {
1599 #if 0
1600         struct rk30_adc_battery_data  *info = container_of(client, struct rk30_adc_battery_data,
1601                 client);
1602         info->adc_val = result;
1603 #endif
1604         if (result < 0){
1605                 pr_bat("adc_battery_callback    resule < 0 , the value ");
1606                 return;
1607         }
1608         else{
1609                 gBatteryData->adc_val = result;
1610                 pr_bat("result = %d, gBatteryData->adc_val = %d\n", result, gBatteryData->adc_val );
1611         }
1612         return;
1613 }
1614
1615 #if 1
1616 static void rk30_adc_battery_lowerpower_delaywork(struct work_struct *work)
1617 {
1618         int irq;
1619         if( gBatteryData->pdata->batt_low_pin != INVALID_GPIO){
1620                 irq = gpio_to_irq(gBatteryData->pdata->batt_low_pin);
1621                 disable_irq(irq);
1622         }
1623
1624         printk("lowerpower\n");
1625         rk28_send_wakeup_key(); // wake up the system   
1626         return;
1627 }
1628
1629
1630 static irqreturn_t rk30_adc_battery_low_wakeup(int irq,void *dev_id)
1631 {
1632         queue_work(gBatteryData->wq, &gBatteryData->lowerpower_work);
1633         return IRQ_HANDLED;
1634 }
1635
1636 #endif
1637
1638 static int rk30_adc_battery_probe(struct platform_device *pdev)
1639 {
1640         int    ret;
1641         int    irq;
1642         int    irq_flag;
1643         struct adc_client                   *client;
1644         struct rk30_adc_battery_data          *data;
1645         struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1646         gSecondsCnt = get_seconds();
1647         data = kzalloc(sizeof(*data), GFP_KERNEL);
1648         if (data == NULL) {
1649                 ret = -ENOMEM;
1650                 goto err_data_alloc_failed;
1651         }
1652         memset(data, 0, sizeof(struct rk30_adc_battery_data));
1653         gBatteryData = data;
1654
1655         platform_set_drvdata(pdev, data);
1656
1657         data->pdata = pdata;
1658         data->status_lock = 0;  
1659         ret = rk30_adc_battery_io_init(pdata);
1660          if (ret) {
1661                 goto err_io_init;
1662         }
1663     
1664         memset(data->adc_samples, 0, sizeof(int)*(NUM_VOLTAGE_SAMPLE + 2));
1665
1666          //register adc for battery sample
1667          if(0 == pdata->adc_channel)
1668         client = adc_register(0, rk30_adc_battery_callback, NULL);  //pdata->adc_channel = ani0
1669         else
1670                 client = adc_register(pdata->adc_channel, rk30_adc_battery_callback, NULL);  
1671         if(!client)
1672                 goto err_adc_register_failed;
1673             
1674          //variable init
1675         data->client  = client;
1676         data->adc_val = adc_sync_read(client);
1677
1678         ret = power_supply_register(&pdev->dev, &rk30_battery_supply);
1679         if (ret){
1680                 printk(KERN_INFO "fail to battery power_supply_register\n");
1681                 goto err_battery_failed;
1682         }
1683 #ifdef BATTERY_APK
1684         ret = device_create_file(&pdev->dev,&dev_attr_batparam);
1685         if(ret)
1686         {
1687                 printk(KERN_ERR "failed to create bat param file\n");
1688                 goto err_battery_failed;
1689         }
1690                 
1691 #endif 
1692          if(1 == pdata->spport_usb_charging){
1693         ret = power_supply_register(&pdev->dev, &rk30_usb_supply);
1694         if (ret){
1695                 printk(KERN_INFO "fail to usb power_supply_register\n");
1696                 goto err_usb_failed;
1697         }
1698          }
1699         wake_lock_init(&batt_wake_lock, WAKE_LOCK_SUSPEND, "batt_lock");        
1700
1701         data->wq = create_singlethread_workqueue("adc_battd");
1702         INIT_DELAYED_WORK(&data->delay_work, rk30_adc_battery_timer_work);
1703         //Power on Battery detect
1704         rk30_adc_battery_check(data);
1705         if(1 == pdata->save_capacity ){
1706                 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS*10));
1707                 gBatteryData->poweron_check = 1;
1708         }else{
1709                 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1710                 gBatteryData->poweron_check = 0;
1711         }
1712
1713 #if  defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1714         ret = power_supply_register(&pdev->dev, &rk30_ac_supply);
1715         if (ret) {
1716                 printk(KERN_INFO "fail to ac power_supply_register\n");
1717                 goto err_ac_failed;
1718         }
1719         //init dc dectet irq & delay work
1720         if (pdata->dc_det_pin != INVALID_GPIO){
1721                 INIT_WORK(&data->dcwakeup_work, rk30_adc_battery_dcdet_delaywork);
1722                 
1723                 irq = gpio_to_irq(pdata->dc_det_pin);           
1724                 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1725                 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);
1726                 if (ret) {
1727                         printk("failed to request dc det irq\n");
1728                         goto err_dcirq_failed;
1729                 }
1730                 enable_irq_wake(irq);  
1731         
1732         }
1733 #endif
1734
1735 #if 1
1736         // batt low irq lowerpower_work
1737         if( pdata->batt_low_pin != INVALID_GPIO){
1738                 INIT_WORK(&data->lowerpower_work, rk30_adc_battery_lowerpower_delaywork);
1739                 
1740                 irq = gpio_to_irq(pdata->batt_low_pin);
1741                 ret = request_irq(irq, rk30_adc_battery_low_wakeup, IRQF_TRIGGER_LOW, "batt_low_irq", NULL);
1742
1743                 if (ret) {
1744                         printk("failed to request batt_low_irq irq\n");
1745                         goto err_lowpowerirq_failed;
1746                 }
1747                 disable_irq(irq);
1748         
1749         }
1750 #endif
1751
1752 #ifdef  BATTERY_APK
1753         ret = create_sysfs_interfaces(&pdev->dev);
1754         if (ret < 0)
1755         {
1756                 dev_err(&pdev->dev,               
1757                         "device rk30_adc_batterry sysfs register failed\n");
1758                 goto err_sysfs;
1759         }
1760
1761 #endif 
1762         printk(KERN_INFO "rk30_adc_battery: driver initialized\n");
1763         
1764         return 0;
1765 err_sysfs:      
1766 err_usb_failed:
1767         power_supply_unregister(&rk30_usb_supply);
1768
1769 err_ac_failed:
1770 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1771         power_supply_unregister(&rk30_ac_supply);
1772 #endif
1773
1774 err_battery_failed:
1775         power_supply_unregister(&rk30_battery_supply);
1776     
1777 err_dcirq_failed:
1778         free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1779 #if 1
1780  err_lowpowerirq_failed:
1781         free_irq(gpio_to_irq(pdata->batt_low_pin), data);
1782 #endif
1783 err_adc_register_failed:
1784 err_io_init:    
1785 err_data_alloc_failed:
1786         kfree(data);
1787
1788         printk("rk30_adc_battery: error!\n");
1789     
1790         return ret;
1791 }
1792
1793 static int rk30_adc_battery_remove(struct platform_device *pdev)
1794 {
1795         struct rk30_adc_battery_data *data = platform_get_drvdata(pdev);
1796         struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1797
1798         cancel_delayed_work(&gBatteryData->delay_work); 
1799          if(1 == pdata->spport_usb_charging){   
1800         power_supply_unregister(&rk30_usb_supply);
1801          }
1802 #if defined(CONFIG_BATTERY_RK30_AC_CHARGE)
1803         power_supply_unregister(&rk30_ac_supply);
1804 #endif
1805         power_supply_unregister(&rk30_battery_supply);
1806
1807         free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1808
1809         kfree(data);
1810         
1811         return 0;
1812 }
1813
1814 static struct platform_driver rk30_adc_battery_driver = {
1815         .probe          = rk30_adc_battery_probe,
1816         .remove         = rk30_adc_battery_remove,
1817         .suspend                = rk30_adc_battery_suspend,
1818         .resume         = rk30_adc_battery_resume,
1819         .driver = {
1820                 .name = "rk30-battery",
1821                 .owner  = THIS_MODULE,
1822         }
1823 };
1824
1825 static int __init rk30_adc_battery_init(void)
1826 {
1827         return platform_driver_register(&rk30_adc_battery_driver);
1828 }
1829
1830 static void __exit rk30_adc_battery_exit(void)
1831 {
1832         platform_driver_unregister(&rk30_adc_battery_driver);
1833 }
1834
1835 module_init(rk30_adc_battery_init);//module_init(rk30_adc_battery_init);//subsys_initcall(rk30_adc_battery_init);
1836 module_exit(rk30_adc_battery_exit);
1837
1838 MODULE_DESCRIPTION("Battery detect driver for the rk30");
1839 MODULE_AUTHOR("luowei lw@rock-chips.com");
1840 MODULE_LICENSE("GPL");