Merge tag 'lsk-android-14.05' into develop-3.10
[firefly-linux-kernel-4.4.55.git] / drivers / power / cw2015_battery.c
1 /*
2  * RockChip ADC Battery Driver 
3  * Copyright (C) 2012, RockChip
4  *
5  * Authors: xuhuicong <xhc@rock-chips.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  */
12
13 //#define DEBUG   1
14 #include <linux/gpio.h>
15 #include <linux/of_gpio.h>
16 #include <linux/platform_device.h>
17 #include <linux/power_supply.h>
18 #include <linux/workqueue.h>
19 #include <linux/kernel.h>
20 #include <linux/i2c.h>
21 #include <linux/module.h>
22 #include <linux/delay.h>
23 #include <linux/power/cw2015_battery.h>
24 #include <linux/time.h>
25 #include <linux/interrupt.h>
26 #include <linux/irq.h>
27 #include <linux/slab.h>
28
29 #define CW2015_GPIO_HIGH  1
30 #define CW2015_GPIO_LOW   0
31
32 #define REG_VERSION             0x0
33 #define REG_VCELL               0x2
34 #define REG_SOC                 0x4
35 #define REG_RRT_ALERT           0x6
36 #define REG_CONFIG              0x8
37 #define REG_MODE                0xA
38 #define REG_BATINFO             0x10
39
40 #define MODE_SLEEP_MASK         (0x3<<6)
41 #define MODE_SLEEP              (0x3<<6)
42 #define MODE_NORMAL             (0x0<<6)
43 #define MODE_QUICK_START        (0x3<<4)
44 #define MODE_RESTART            (0xf<<0)
45
46 #define CONFIG_UPDATE_FLG       (0x1<<1)
47 #define ATHD                    (0x0<<3)        //ATHD = 0%
48
49 #define CW_I2C_SPEED            100000          // default i2c speed set 100khz
50 #define BATTERY_UP_MAX_CHANGE   420             // the max time allow battery change quantity
51 #define BATTERY_DOWN_CHANGE   60                // the max time allow battery change quantity
52 #define BATTERY_DOWN_MIN_CHANGE_RUN 30          // the min time allow battery change quantity when run
53 #define BATTERY_DOWN_MIN_CHANGE_SLEEP 1800      // the min time allow battery change quantity when run 30min
54
55 #define BATTERY_DOWN_MAX_CHANGE_RUN_AC_ONLINE 3600
56
57 #define NO_STANDARD_AC_BIG_CHARGE_MODE 1
58 // #define SYSTEM_SHUTDOWN_VOLTAGE  3400000        //set system shutdown voltage related in battery info.
59 #define BAT_LOW_INTERRUPT    1
60
61 #define USB_CHARGER_MODE        1
62 #define AC_CHARGER_MODE         2
63
64 extern int dwc_otg_check_dpdm(void);
65 extern int get_gadget_connect_flag(void);
66 extern int dwc_vbus_status( void );
67
68 struct cw_battery {
69         struct i2c_client *client;
70         struct workqueue_struct *battery_workqueue;
71         struct delayed_work battery_delay_work;
72         struct delayed_work dc_wakeup_work;
73         struct delayed_work bat_low_wakeup_work;
74         struct cw_bat_platform_data plat_data;
75
76         struct power_supply rk_bat;
77         struct power_supply rk_ac;
78         struct power_supply rk_usb;
79
80         long sleep_time_capacity_change;      // the sleep time from capacity change to present, it will set 0 when capacity change 
81         long run_time_capacity_change;
82
83         long sleep_time_charge_start;      // the sleep time from insert ac to present, it will set 0 when insert ac
84         long run_time_charge_start;
85
86         int dc_online;
87         int usb_online;
88         int charger_mode;
89         int charger_init_mode;
90         int capacity;
91         int voltage;
92         int status;
93         int time_to_empty;
94         int alt;
95
96         int bat_change;
97 };
98
99 static int i2c_master_reg8_send(const struct i2c_client *client, const char reg, const char *buf, int count, int scl_rate)
100 {
101         struct i2c_adapter *adap=client->adapter;
102         struct i2c_msg msg;
103         int ret;
104         char *tx_buf = (char *)kzalloc(count + 1, GFP_KERNEL);
105         if(!tx_buf)
106                 return -ENOMEM;
107         tx_buf[0] = reg;
108         memcpy(tx_buf+1, buf, count); 
109
110         msg.addr = client->addr;
111         msg.flags = client->flags;
112         msg.len = count + 1;
113         msg.buf = (char *)tx_buf;
114         msg.scl_rate = scl_rate;
115
116         ret = i2c_transfer(adap, &msg, 1);
117         kfree(tx_buf);
118         return (ret == 1) ? count : ret;
119
120 }
121
122 static int i2c_master_reg8_recv(const struct i2c_client *client, const char reg, char *buf, int count, int scl_rate)
123 {
124         struct i2c_adapter *adap=client->adapter;
125         struct i2c_msg msgs[2];
126         int ret;
127         char reg_buf = reg;
128         
129         msgs[0].addr = client->addr;
130         msgs[0].flags = client->flags;
131         msgs[0].len = 1;
132         msgs[0].buf = &reg_buf;
133         msgs[0].scl_rate = scl_rate;
134
135         msgs[1].addr = client->addr;
136         msgs[1].flags = client->flags | I2C_M_RD;
137         msgs[1].len = count;
138         msgs[1].buf = (char *)buf;
139         msgs[1].scl_rate = scl_rate;
140
141         ret = i2c_transfer(adap, msgs, 2);
142
143         return (ret == 2)? count : ret;
144 }
145
146 static int cw_read(struct i2c_client *client, u8 reg, u8 buf[])
147 {
148         int ret;
149         ret = i2c_master_reg8_recv(client, reg, buf, 1, CW_I2C_SPEED);
150         return ret;
151 }
152
153 static int cw_write(struct i2c_client *client, u8 reg, u8 const buf[])
154 {
155         int ret;
156         ret = i2c_master_reg8_send(client, reg, buf, 1, CW_I2C_SPEED);
157         return ret;
158 }
159
160 static int cw_read_word(struct i2c_client *client, u8 reg, u8 buf[])
161 {
162         int ret;
163         ret = i2c_master_reg8_recv(client, reg, buf, 2, CW_I2C_SPEED);
164         return ret;
165 }
166
167 #if 0
168 static int cw_write_word(struct i2c_client *client, u8 reg, u8 const buf[])
169 {
170         int ret;
171         ret = i2c_master_reg8_send(client, reg, buf, 2, CW_I2C_SPEED);
172         return ret;
173 }
174 #endif
175
176
177
178 static int cw_update_config_info(struct cw_battery *cw_bat)
179 {
180         int ret;
181         u8 reg_val;
182         u8 i;
183         u8 reset_val;
184
185         dev_info(&cw_bat->client->dev, "func: %s-------\n", __func__);
186         
187         /* make sure no in sleep mode */
188         ret = cw_read(cw_bat->client, REG_MODE, &reg_val);
189         if (ret < 0)
190                 return ret;
191
192         reset_val = reg_val;
193         if((reg_val & MODE_SLEEP_MASK) == MODE_SLEEP) {
194                 dev_err(&cw_bat->client->dev, "Error, device in sleep mode, cannot update battery info\n");
195                 return -1;
196         }
197
198         /* update new battery info */
199         for (i = 0; i < SIZE_BATINFO; i++) {
200                 dev_info(&cw_bat->client->dev, "cw_bat->plat_data.cw_bat_config_info[%d] = 0x%x\n", i, \
201                                 cw_bat->plat_data.cw_bat_config_info[i]);
202                 ret = cw_write(cw_bat->client, REG_BATINFO + i, (u8 *)&cw_bat->plat_data.cw_bat_config_info[i]);
203
204                 if (ret < 0) 
205                         return ret;
206         }
207
208         /* readback & check */
209         for (i = 0; i < SIZE_BATINFO; i++) {
210                 ret = cw_read(cw_bat->client, REG_BATINFO + i, &reg_val);
211                 if (reg_val != cw_bat->plat_data.cw_bat_config_info[i])
212                         return -1;
213         }
214         
215         /* set cw2015/cw2013 to use new battery info */
216         ret = cw_read(cw_bat->client, REG_CONFIG, &reg_val);
217         if (ret < 0)
218                 return ret;
219
220         reg_val |= CONFIG_UPDATE_FLG;   /* set UPDATE_FLAG */
221         reg_val &= 0x07;                /* clear ATHD */
222         reg_val |= ATHD;                /* set ATHD */
223         ret = cw_write(cw_bat->client, REG_CONFIG, &reg_val);
224         if (ret < 0)
225                 return ret;
226
227         /* check 2015/cw2013 for ATHD & update_flag */ 
228         ret = cw_read(cw_bat->client, REG_CONFIG, &reg_val);
229         if (ret < 0)
230                 return ret;
231         
232         if (!(reg_val & CONFIG_UPDATE_FLG)) {
233                 dev_info(&cw_bat->client->dev, "update flag for new battery info have not set..\n");
234         }
235
236         if ((reg_val & 0xf8) != ATHD) {
237                 dev_info(&cw_bat->client->dev, "the new ATHD have not set..\n");
238         }
239
240         /* reset */
241         reset_val &= ~(MODE_RESTART);
242         reg_val = reset_val | MODE_RESTART;
243         ret = cw_write(cw_bat->client, REG_MODE, &reg_val);
244         if (ret < 0)
245                 return ret;
246
247         msleep(10);
248         ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
249         if (ret < 0)
250                 return ret;
251         
252         return 0;
253 }
254
255 static int cw_init(struct cw_battery *cw_bat)
256 {
257         int ret;
258         int i;
259         u8 reg_val = MODE_SLEEP;
260 #if 0
261         ret = cw_read(cw_bat->client, REG_MODE, &reg_val);
262         if (ret < 0)
263                 return ret;
264 #endif
265         if ((reg_val & MODE_SLEEP_MASK) == MODE_SLEEP) {
266                 reg_val = MODE_NORMAL;
267                 ret = cw_write(cw_bat->client, REG_MODE, &reg_val);
268                 if (ret < 0) 
269                         return ret;
270         }
271
272         ret = cw_read(cw_bat->client, REG_CONFIG, &reg_val);
273         if (ret < 0)
274                 return ret;
275
276         if ((reg_val & 0xf8) != ATHD) {
277                 dev_info(&cw_bat->client->dev, "the new ATHD have not set\n");
278                 reg_val &= 0x07;    /* clear ATHD */
279                 reg_val |= ATHD;    /* set ATHD */
280                 ret = cw_write(cw_bat->client, REG_CONFIG, &reg_val);
281                 if (ret < 0)
282                         return ret;
283         }
284
285         ret = cw_read(cw_bat->client, REG_CONFIG, &reg_val);
286         if (ret < 0) 
287                 return ret;
288
289         if (!(reg_val & CONFIG_UPDATE_FLG)) {
290                 dev_info(&cw_bat->client->dev, "update flag for new battery info have not set\n");
291                 ret = cw_update_config_info(cw_bat);
292                 if (ret < 0)
293                         return ret;
294         } else {
295                 for(i = 0; i < SIZE_BATINFO; i++) { 
296                         ret = cw_read(cw_bat->client, (REG_BATINFO + i), &reg_val);
297                         if (ret < 0)
298                                 return ret;
299                         
300                         if (cw_bat->plat_data.cw_bat_config_info[i] != reg_val)
301                                 break;
302                 }
303
304                 if (i != SIZE_BATINFO) {
305                         dev_info(&cw_bat->client->dev, "update flag for new battery info have not set\n"); 
306                         ret = cw_update_config_info(cw_bat);
307                         if (ret < 0)
308                                 return ret;
309                 }
310         }
311
312         for (i = 0; i < 30; i++) {
313                 ret = cw_read(cw_bat->client, REG_SOC, &reg_val);
314                 if (ret < 0)
315                         return ret;
316                 else if (reg_val <= 0x64) 
317                         break;
318                 
319                 msleep(100);
320                 if (i > 25)
321                         dev_err(&cw_bat->client->dev, "cw2015/cw2013 input unvalid power error\n");
322
323         }
324         if (i >=30){
325                    reg_val = MODE_SLEEP;
326              ret = cw_write(cw_bat->client, REG_MODE, &reg_val);
327              dev_info(&cw_bat->client->dev, "report battery capacity error");
328              return -1;
329         } 
330         return 0;
331 }
332
333 static void cw_update_time_member_charge_start(struct cw_battery *cw_bat)
334 {
335         struct timespec ts;
336         int new_run_time;
337         int new_sleep_time;
338
339         ktime_get_ts(&ts);
340         new_run_time = ts.tv_sec;
341
342         get_monotonic_boottime(&ts);
343         new_sleep_time = ts.tv_sec - new_run_time;
344
345         cw_bat->run_time_charge_start = new_run_time;
346         cw_bat->sleep_time_charge_start = new_sleep_time; 
347 }
348
349 static void cw_update_time_member_capacity_change(struct cw_battery *cw_bat)
350 {
351         struct timespec ts;
352         int new_run_time;
353         int new_sleep_time;
354
355         ktime_get_ts(&ts);
356         new_run_time = ts.tv_sec;
357
358         get_monotonic_boottime(&ts);
359         new_sleep_time = ts.tv_sec - new_run_time;
360
361         cw_bat->run_time_capacity_change = new_run_time;
362         cw_bat->sleep_time_capacity_change = new_sleep_time; 
363 }
364
365 static int cw_quickstart(struct cw_battery *cw_bat)
366 {
367         int ret = 0;
368         u8 reg_val = MODE_QUICK_START;
369
370         ret = cw_write(cw_bat->client, REG_MODE, &reg_val);     //(MODE_QUICK_START | MODE_NORMAL));  // 0x30
371         if(ret < 0) {
372                 dev_err(&cw_bat->client->dev, "Error quick start1\n");
373                 return ret;
374         }
375         
376         reg_val = MODE_NORMAL;
377         ret = cw_write(cw_bat->client, REG_MODE, &reg_val);
378         if(ret < 0) {
379                 dev_err(&cw_bat->client->dev, "Error quick start2\n");
380                 return ret;
381         }
382         return 1;
383 }
384
385 static int cw_get_capacity(struct cw_battery *cw_bat)
386 {
387         int cw_capacity;
388         int ret;
389         u8 reg_val;
390
391         struct timespec ts;
392         long new_run_time;
393         long new_sleep_time;
394         long capacity_or_aconline_time;
395         int allow_change;
396         int allow_capacity;
397         static int if_quickstart = 0;
398         static int jump_flag =0;
399         static int reset_loop =0;
400         int charge_time;
401         u8 reset_val;
402
403
404         ret = cw_read(cw_bat->client, REG_SOC, &reg_val);
405         //ret = cw_read_word(cw_bat->client, REG_SOC, reg_val);
406         if (ret < 0)
407                 return ret;
408         cw_capacity = reg_val;   
409              
410         if ((cw_capacity == 0)&&(if_quickstart ==0)) {
411                 dev_info(&cw_bat->client->dev, "the cw201x capacity is 0 !!!!!!!, funciton: %s, line: %d\n", __func__, __LINE__);
412                 
413                 reset_val = MODE_SLEEP;               
414                 ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
415                 if (ret < 0)
416                     return ret;
417                 reset_val = MODE_NORMAL;
418                 msleep(10);
419                 ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
420                 if (ret < 0)
421                     return ret;
422                 dev_info(&cw_bat->client->dev, "report battery capacity error1");                              
423 //                ret = cw_update_config_info(cw_bat);
424 //                   if (ret) 
425 //                     return ret;
426                 if_quickstart =1;
427          }                       
428         else 
429                 dev_dbg(&cw_bat->client->dev, "the cw201x capacity is %d, funciton: %s\n", cw_capacity, __func__);
430         
431         if ((cw_capacity < 0) || (cw_capacity > 100)) {
432                 dev_err(&cw_bat->client->dev, "get cw_capacity error; cw_capacity = %d\n", cw_capacity);
433                 reset_loop++;
434                 
435             if (reset_loop >5){ 
436                 
437                 reset_val = MODE_SLEEP;               
438                 ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
439                 if (ret < 0)
440                     return ret;
441                 reset_val = MODE_NORMAL;
442                 msleep(10);
443                 ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
444                 if (ret < 0)
445                     return ret;
446                 dev_info(&cw_bat->client->dev, "report battery capacity error");                              
447                 ret = cw_update_config_info(cw_bat);
448                    if (ret) 
449                      return ret;
450                 reset_loop =0;  
451                              
452             }
453                                      
454             return cw_capacity;
455         }else {
456                 reset_loop =0;
457         }
458
459         ktime_get_ts(&ts);
460         new_run_time = ts.tv_sec;
461
462         get_monotonic_boottime(&ts);
463         new_sleep_time = ts.tv_sec - new_run_time;
464
465         if (((cw_bat->charger_mode > 0) && (cw_capacity <= (cw_bat->capacity - 1)) && (cw_capacity > (cw_bat->capacity - 9)))
466                         || ((cw_bat->charger_mode == 0) && (cw_capacity == (cw_bat->capacity + 1)))) {             // modify battery level swing
467
468                 if (!(cw_capacity == 0 && cw_bat->capacity <= 2)) {                     
469                                     cw_capacity = cw_bat->capacity;
470                             }
471                                 }        
472
473         if ((cw_bat->charger_mode > 0) && (cw_capacity >= 95) && (cw_capacity <= cw_bat->capacity)) {     // avoid no charge full
474
475                 capacity_or_aconline_time = (cw_bat->sleep_time_capacity_change > cw_bat->sleep_time_charge_start) ? cw_bat->sleep_time_capacity_change : cw_bat->sleep_time_charge_start;
476                 capacity_or_aconline_time += (cw_bat->run_time_capacity_change > cw_bat->run_time_charge_start) ? cw_bat->run_time_capacity_change : cw_bat->run_time_charge_start;
477                 allow_change = (new_sleep_time + new_run_time - capacity_or_aconline_time) / BATTERY_UP_MAX_CHANGE;
478                 if (allow_change > 0) {
479                         allow_capacity = cw_bat->capacity + allow_change; 
480                         cw_capacity = (allow_capacity <= 100) ? allow_capacity : 100;
481                         jump_flag =1;
482                 } else if (cw_capacity <= cw_bat->capacity) {
483                         cw_capacity = cw_bat->capacity; 
484                 }
485
486         }
487        
488         else if ((cw_bat->charger_mode == 0) && (cw_capacity <= cw_bat->capacity ) && (cw_capacity >= 90) && (jump_flag == 1)) {     // avoid battery level jump to CW_BAT
489                 capacity_or_aconline_time = (cw_bat->sleep_time_capacity_change > cw_bat->sleep_time_charge_start) ? cw_bat->sleep_time_capacity_change : cw_bat->sleep_time_charge_start;
490                 capacity_or_aconline_time += (cw_bat->run_time_capacity_change > cw_bat->run_time_charge_start) ? cw_bat->run_time_capacity_change : cw_bat->run_time_charge_start;
491                 allow_change = (new_sleep_time + new_run_time - capacity_or_aconline_time) / BATTERY_DOWN_CHANGE;
492                 if (allow_change > 0) {
493                         allow_capacity = cw_bat->capacity - allow_change; 
494                         if (cw_capacity >= allow_capacity){
495                                 jump_flag =0;
496                         }
497                         else{
498                                 cw_capacity = (allow_capacity <= 100) ? allow_capacity : 100;
499                         }
500                 } else if (cw_capacity <= cw_bat->capacity) {
501                         cw_capacity = cw_bat->capacity;
502                 }
503         }
504                                 
505                                 if ((cw_capacity == 0) && (cw_bat->capacity > 1)) {              // avoid battery level jump to 0% at a moment from more than 2%
506                 allow_change = ((new_run_time - cw_bat->run_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_RUN);
507                 allow_change += ((new_sleep_time - cw_bat->sleep_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_SLEEP);
508
509                 allow_capacity = cw_bat->capacity - allow_change;
510                 cw_capacity = (allow_capacity >= cw_capacity) ? allow_capacity: cw_capacity;
511                 dev_info(&cw_bat->client->dev, "report GGIC POR happened");
512                 reset_val = MODE_SLEEP;               
513                 ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
514                 if (ret < 0)
515                     return ret;
516                 reset_val = MODE_NORMAL;
517                 msleep(10);
518                 ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
519                 if (ret < 0)
520                     return ret;
521                 dev_info(&cw_bat->client->dev, "report battery capacity error");                              
522                 ret = cw_update_config_info(cw_bat);
523                    if (ret) 
524                      return ret;  
525                 dev_info(&cw_bat->client->dev, "report battery capacity jump 0 ");                                                                    
526         }
527  
528 #if 1   
529         if((cw_bat->charger_mode > 0) &&(cw_capacity == 0))
530         {                 
531                 charge_time = new_sleep_time + new_run_time - cw_bat->sleep_time_charge_start - cw_bat->run_time_charge_start;
532                 if ((charge_time > BATTERY_DOWN_MAX_CHANGE_RUN_AC_ONLINE) && (if_quickstart == 0)) {
533                               //cw_quickstart(cw_bat);          // if the cw_capacity = 0 the cw2015 will qstrt/
534                                reset_val = MODE_SLEEP;               
535                    ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
536                    if (ret < 0)
537                       return ret;
538                    reset_val = MODE_NORMAL;
539                    msleep(10);
540                    ret = cw_write(cw_bat->client, REG_MODE, &reset_val);
541                    if (ret < 0)
542                       return ret;
543                    dev_info(&cw_bat->client->dev, "report battery capacity error");                              
544                    ret = cw_update_config_info(cw_bat);
545                    if (ret) 
546                       return ret;
547                               dev_info(&cw_bat->client->dev, "report battery capacity still 0 if in changing");
548                         if_quickstart = 1;
549                 }
550         } else if ((if_quickstart == 1)&&(cw_bat->charger_mode == 0)) {
551                 if_quickstart = 0;
552         }
553
554 #endif
555
556 #if 0
557         if (gpio_is_valid(cw_bat->plat_data.chg_ok_pin)) {
558                 if(gpio_get_value(cw_bat->plat_data.chg_ok_pin) != cw_bat->plat_data.chg_ok_level) {
559                         if (cw_capacity == 100) {
560                                 cw_capacity = 99;
561                         }
562                 } else {
563                         if (cw_bat->charger_mode > 0) {
564                                 cw_capacity = 100;
565                         }
566                 }
567         }
568 #endif
569
570 #ifdef SYSTEM_SHUTDOWN_VOLTAGE
571         if ((cw_bat->charger_mode == 0) && (cw_capacity <= 10) && (cw_bat->voltage <= SYSTEM_SHUTDOWN_VOLTAGE)){             
572                 if (if_quickstart == 10){                       
573                         cw_quickstart(cw_bat);
574                         if_quickstart = 12;
575                         cw_capacity = 0;
576                 } else if (if_quickstart <= 10)
577                         if_quickstart =if_quickstart+2;
578                 dev_info(&cw_bat->client->dev, "the cw201x voltage is less than SYSTEM_SHUTDOWN_VOLTAGE !!!!!!!, funciton: %s, line: %d\n", __func__, __LINE__);
579         } else if ((cw_bat->charger_mode > 0)&& (if_quickstart <= 12)) {
580                 if_quickstart = 0;
581         }
582 #endif
583         return cw_capacity;
584 }
585
586 static int cw_get_vol(struct cw_battery *cw_bat)
587 {
588         int ret;
589         u8 reg_val[2];
590         u16 value16, value16_1, value16_2, value16_3;
591         int voltage;
592
593         ret = cw_read_word(cw_bat->client, REG_VCELL, reg_val);
594         if (ret < 0)
595                 return ret;
596         value16 = (reg_val[0] << 8) + reg_val[1];
597         
598         ret = cw_read_word(cw_bat->client, REG_VCELL, reg_val);
599         if (ret < 0)
600                 return ret;
601         value16_1 = (reg_val[0] << 8) + reg_val[1];
602
603         ret = cw_read_word(cw_bat->client, REG_VCELL, reg_val);
604         if (ret < 0)
605                 return ret;
606         value16_2 = (reg_val[0] << 8) + reg_val[1];
607                 
608                 
609         if(value16 > value16_1)
610             {    
611                 value16_3 = value16;
612                     value16 = value16_1;
613                     value16_1 = value16_3;
614         }
615                 
616         if(value16_1 > value16_2)
617             {
618                 value16_3 =value16_1;
619                         value16_1 =value16_2;
620                         value16_2 =value16_3;
621             }
622                         
623         if(value16 >value16_1)
624             {    
625                 value16_3 =value16;
626                         value16 =value16_1;
627                         value16_1 =value16_3;
628         }                       
629
630         voltage = value16_1 * 305;
631
632         dev_dbg(&cw_bat->client->dev, "the cw201x voltage=%d,reg_val=%x %x\n",voltage,reg_val[0],reg_val[1]);
633         return voltage;
634 }
635
636 #ifdef BAT_LOW_INTERRUPT
637 static int cw_get_alt(struct cw_battery *cw_bat)
638 {
639         int ret = 0;
640         u8 reg_val;
641         u8 value8 = 0;
642         int alrt;
643         
644         ret = cw_read(cw_bat->client, REG_RRT_ALERT, &reg_val);
645         if (ret < 0)
646                 return ret;
647         value8 = reg_val;
648         alrt = value8 >>7;
649         
650         //dev_info(&cw_bat->client->dev, "read RRT %d%%. value16 0x%x\n", alrt, value16);
651         value8 = value8&0x7f;
652         reg_val = value8;
653         ret = cw_write(cw_bat->client, REG_RRT_ALERT, &reg_val);
654         if(ret < 0) {
655                 dev_err(&cw_bat->client->dev, "Error clear ALRT\n");
656                 return ret;
657         }
658         
659         return alrt;
660 }
661 #endif
662
663
664 static int cw_get_time_to_empty(struct cw_battery *cw_bat)
665 {
666         int ret;
667         u8 reg_val;
668         u16 value16;
669
670         ret = cw_read(cw_bat->client, REG_RRT_ALERT, &reg_val);
671         if (ret < 0)
672                 return ret;
673
674         value16 = reg_val;
675
676         ret = cw_read(cw_bat->client, REG_RRT_ALERT + 1, &reg_val);
677         if (ret < 0)
678                 return ret;
679
680         value16 = ((value16 << 8) + reg_val) & 0x1fff;
681         return value16;
682 }
683
684 static void rk_bat_update_capacity(struct cw_battery *cw_bat)
685 {
686         int cw_capacity;
687
688         cw_capacity = cw_get_capacity(cw_bat);
689         if ((cw_capacity >= 0) && (cw_capacity <= 100) && (cw_bat->capacity != cw_capacity)) {
690                 cw_bat->capacity = cw_capacity;
691                 cw_bat->bat_change = 1;
692                 cw_update_time_member_capacity_change(cw_bat);
693
694                 if (cw_bat->capacity == 0)
695                         dev_info(&cw_bat->client->dev, "report battery capacity 0 and will shutdown if no changing");
696
697         }
698 }
699
700
701
702 static void rk_bat_update_vol(struct cw_battery *cw_bat)
703 {
704         int ret;
705         ret = cw_get_vol(cw_bat);
706         if ((ret >= 0) && (cw_bat->voltage != ret)) {
707                 cw_bat->voltage = ret;
708              //   cw_bat->bat_change = 1;
709         }
710 }
711
712 static void rk_bat_update_status(struct cw_battery *cw_bat)
713 {
714         int status;
715
716
717         if (cw_bat->charger_mode > 0) {
718                 if (cw_bat->capacity >= 100) 
719                         status=POWER_SUPPLY_STATUS_FULL;
720                 else
721                         status=POWER_SUPPLY_STATUS_CHARGING;
722         } else {
723                 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
724         }
725
726         if (cw_bat->status != status) {
727                 cw_bat->status = status;
728                 cw_bat->bat_change = 1;
729        
730         } 
731 }
732
733 static void rk_bat_update_time_to_empty(struct cw_battery *cw_bat)
734 {
735         int ret;
736         ret = cw_get_time_to_empty(cw_bat);
737         if ((ret >= 0) && (cw_bat->time_to_empty != ret)) {
738                 cw_bat->time_to_empty = ret;
739               //  cw_bat->bat_change = 1;
740         }
741         
742 }
743
744 static int rk_ac_update_online(struct cw_battery *cw_bat)
745 {
746         int ret = 0;
747
748         if(!gpio_is_valid(cw_bat->plat_data.dc_det_pin)) {
749                 cw_bat->dc_online = 0;
750                 printk("%s cw2015 dc charger but without dc_det_pin,maybe error\n",__func__);
751                 return 0;
752         }
753
754         if (gpio_get_value(cw_bat->plat_data.dc_det_pin) == cw_bat->plat_data.dc_det_level) {
755                 if (cw_bat->dc_online != 1) {
756                         cw_update_time_member_charge_start(cw_bat);
757                         cw_bat->dc_online = 1;
758                         if (cw_bat->charger_mode != AC_CHARGER_MODE)
759                                 cw_bat->charger_mode = AC_CHARGER_MODE;
760  
761                         ret = 1;
762                 }
763         } else {
764                 if (cw_bat->dc_online != 0) {
765                         cw_update_time_member_charge_start(cw_bat);
766                         cw_bat->dc_online = 0;
767                         if (cw_bat->usb_online == 0)
768                                 cw_bat->charger_mode = 0;
769                         ret = 1;
770                 }
771         }
772         return ret;
773 }
774
775 static int get_usb_charge_state(struct cw_battery *cw_bat)
776 {
777         int charge_time;
778         int time_from_boot;
779         struct timespec ts;
780
781         int gadget_status = get_gadget_connect_flag();
782         int usb_status = dwc_vbus_status();
783
784         get_monotonic_boottime(&ts);
785         time_from_boot = ts.tv_sec;
786         
787         if (cw_bat->charger_init_mode) { 
788                 if (usb_status == 1 || usb_status == 2) {
789                         cw_bat->charger_init_mode = 0;
790                 } else if (time_from_boot < 8) {
791                         usb_status = cw_bat->charger_init_mode;
792                 } else if (strstr(saved_command_line,"charger")) {
793                         cw_bat->charger_init_mode = dwc_otg_check_dpdm();
794                         usb_status = cw_bat->charger_init_mode;
795                 }
796         }
797 #ifdef NO_STANDARD_AC_BIG_CHARGE_MODE 
798         if (cw_bat->usb_online == 1) {
799                 
800                 charge_time = time_from_boot - cw_bat->sleep_time_charge_start - cw_bat->run_time_charge_start;
801                 if (charge_time > 3) {
802                         if (gadget_status == 0 && dwc_vbus_status() == 1) {
803                                 usb_status = 2;
804                         }
805                 }
806         }
807 #endif
808
809         dev_dbg(&cw_bat->client->dev, "%s usb_status=[%d],cw_bat->charger_mode=[%d],cw_bat->gadget_status=[%d], cw_bat->charger_init_mode = [%d]\n",__func__,usb_status,cw_bat->charger_mode,gadget_status, cw_bat->charger_init_mode);
810
811         return usb_status;
812 }
813
814 static int rk_usb_update_online(struct cw_battery *cw_bat)
815 {
816         int ret = 0;
817         int usb_status = 0;
818       
819        
820         usb_status = get_usb_charge_state(cw_bat);        
821         if (usb_status == 2) {
822                 if (cw_bat->charger_mode != AC_CHARGER_MODE) {
823                         cw_bat->charger_mode = AC_CHARGER_MODE;
824                         ret = 1;
825                 }
826                 if (gpio_is_valid(cw_bat->plat_data.chg_mode_sel_pin)) {
827                         if (gpio_get_value (cw_bat->plat_data.chg_mode_sel_pin) != cw_bat->plat_data.chg_mode_sel_level)
828                                 gpio_direction_output(cw_bat->plat_data.chg_mode_sel_pin, (cw_bat->plat_data.chg_mode_sel_level==CW2015_GPIO_LOW) ? CW2015_GPIO_LOW : CW2015_GPIO_HIGH);
829                 }
830                 
831                 if (cw_bat->usb_online != 1) {
832                         cw_bat->usb_online = 1;
833                         cw_update_time_member_charge_start(cw_bat);
834                 }
835                 
836         } else if (usb_status == 1) {
837                 if ((cw_bat->charger_mode != USB_CHARGER_MODE) && (cw_bat->dc_online == 0)) {
838                         cw_bat->charger_mode = USB_CHARGER_MODE;
839                         ret = 1;
840                 }
841                 
842                 if (gpio_is_valid(cw_bat->plat_data.chg_mode_sel_pin)) {
843                         if (gpio_get_value (cw_bat->plat_data.chg_mode_sel_pin) == cw_bat->plat_data.chg_mode_sel_level)
844                                 gpio_direction_output(cw_bat->plat_data.chg_mode_sel_pin, (cw_bat->plat_data.chg_mode_sel_level==CW2015_GPIO_LOW) ? CW2015_GPIO_HIGH : CW2015_GPIO_LOW);
845                 }
846                 if (cw_bat->usb_online != 1){
847                         cw_bat->usb_online = 1;
848                         cw_update_time_member_charge_start(cw_bat);
849                 }
850
851         } else if (usb_status == 0 && cw_bat->usb_online != 0) {
852
853                 if (gpio_is_valid(cw_bat->plat_data.chg_mode_sel_pin)) {
854                         if (gpio_get_value (cw_bat->plat_data.chg_mode_sel_pin == cw_bat->plat_data.chg_mode_sel_level))
855                                 gpio_direction_output(cw_bat->plat_data.chg_mode_sel_pin, (cw_bat->plat_data.chg_mode_sel_level==CW2015_GPIO_LOW) ? CW2015_GPIO_HIGH : CW2015_GPIO_LOW);
856                 }
857
858                 if (cw_bat->dc_online == 0)
859                         cw_bat->charger_mode = 0;
860
861                 cw_update_time_member_charge_start(cw_bat);
862                 cw_bat->usb_online = 0;
863                 ret = 1;
864         }
865
866         return ret;
867 }
868
869 static void cw_bat_work(struct work_struct *work)
870 {
871         struct delayed_work *delay_work;
872         struct cw_battery *cw_bat;
873         int ret;
874
875         delay_work = container_of(work, struct delayed_work, work);
876         cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work);
877
878         if (cw_bat->plat_data.is_dc_charge == 1) {
879               ret = rk_ac_update_online(cw_bat);
880               if (ret == 1) {
881                       power_supply_changed(&cw_bat->rk_ac);
882               }
883         }
884
885         if (cw_bat->plat_data.is_usb_charge == 1) {
886                 ret = rk_usb_update_online(cw_bat);
887                 if (ret == 1) {
888                         power_supply_changed(&cw_bat->rk_usb);     
889                         power_supply_changed(&cw_bat->rk_ac);
890                 }
891         }
892
893
894         rk_bat_update_status(cw_bat);
895         rk_bat_update_capacity(cw_bat);
896         rk_bat_update_vol(cw_bat);
897         rk_bat_update_time_to_empty(cw_bat);
898
899         if (cw_bat->bat_change) {
900                 power_supply_changed(&cw_bat->rk_bat);
901                 cw_bat->bat_change = 0;
902         }
903
904         queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(1000));
905
906         dev_dbg(&cw_bat->client->dev, "cw_bat->bat_change = %d, cw_bat->time_to_empty = %d, cw_bat->capacity = %d\n",\
907                         cw_bat->bat_change, cw_bat->time_to_empty, cw_bat->capacity);
908
909         dev_dbg(&cw_bat->client->dev, "cw_bat->voltage = %d, cw_bat->dc_online = %d, cw_bat->usb_online = %d\n",\
910                         cw_bat->voltage, cw_bat->dc_online, cw_bat->usb_online);
911 }
912
913 static int rk_usb_get_property (struct power_supply *psy,
914                 enum power_supply_property psp,
915                 union power_supply_propval *val)
916 {
917         int ret = 0;
918         struct cw_battery *cw_bat;
919
920         cw_bat = container_of(psy, struct cw_battery, rk_usb);
921         switch (psp) {
922         case POWER_SUPPLY_PROP_ONLINE:
923                 // val->intval = cw_bat->usb_online;
924                 val->intval = (cw_bat->charger_mode == USB_CHARGER_MODE);   
925                 break;
926         default:
927                 break;
928         }
929         return ret;
930 }
931
932 static enum power_supply_property rk_usb_properties[] = {
933         POWER_SUPPLY_PROP_ONLINE,
934 };
935
936
937 static int rk_ac_get_property (struct power_supply *psy,
938                 enum power_supply_property psp,
939                 union power_supply_propval *val)
940 {
941         int ret = 0;
942         struct cw_battery *cw_bat;
943
944         cw_bat = container_of(psy, struct cw_battery, rk_ac);
945         switch (psp) {
946         case POWER_SUPPLY_PROP_ONLINE:
947                 // val->intval = cw_bat->dc_online;
948                 val->intval = (cw_bat->charger_mode == AC_CHARGER_MODE);
949                 break;
950         default:
951                 break;
952         }
953         return ret;
954 }
955
956 static enum power_supply_property rk_ac_properties[] = {
957         POWER_SUPPLY_PROP_ONLINE,
958 };
959
960 static int rk_battery_get_property(struct power_supply *psy,
961                 enum power_supply_property psp,
962                 union power_supply_propval *val)
963 {
964         int ret = 0;
965         struct cw_battery *cw_bat;
966
967         cw_bat = container_of(psy, struct cw_battery, rk_bat); 
968         switch (psp) {
969         case POWER_SUPPLY_PROP_CAPACITY:
970                 val->intval = cw_bat->capacity;
971                 break;
972         case POWER_SUPPLY_PROP_STATUS:
973                 val->intval = cw_bat->status;
974                 break;
975                 
976         case POWER_SUPPLY_PROP_HEALTH:
977                 val->intval= POWER_SUPPLY_HEALTH_GOOD;
978                 break;
979         case POWER_SUPPLY_PROP_PRESENT:
980                 val->intval = cw_bat->voltage <= 0 ? 0 : 1;
981                 break;
982                 
983         case POWER_SUPPLY_PROP_VOLTAGE_NOW:
984                 val->intval = cw_bat->voltage;
985                 break;
986                 
987         case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
988                 val->intval = cw_bat->time_to_empty;                    
989                 break;
990             
991         case POWER_SUPPLY_PROP_TECHNOLOGY:
992                 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;     
993                 break;
994
995         default:
996                 break;
997         }
998         return ret;
999 }
1000
1001 static enum power_supply_property rk_battery_properties[] = {
1002         POWER_SUPPLY_PROP_CAPACITY,
1003         POWER_SUPPLY_PROP_STATUS,
1004         POWER_SUPPLY_PROP_HEALTH,
1005         POWER_SUPPLY_PROP_PRESENT,
1006         POWER_SUPPLY_PROP_VOLTAGE_NOW,
1007         POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
1008         POWER_SUPPLY_PROP_TECHNOLOGY,
1009 };
1010
1011 static int cw_bat_gpio_init(struct cw_battery *cw_bat)
1012 {
1013
1014         int ret;
1015
1016         if (gpio_is_valid(cw_bat->plat_data.dc_det_pin)) {
1017                 ret = gpio_request(cw_bat->plat_data.dc_det_pin, NULL);
1018                 if (ret) {
1019                         dev_err(&cw_bat->client->dev, "failed to request dc_det_pin gpio\n");
1020                         goto request_dc_det_pin_fail;
1021                 }
1022                 ret = gpio_direction_input(cw_bat->plat_data.dc_det_pin);
1023                 if (ret) {
1024                         dev_err(&cw_bat->client->dev, "failed to set dc_det_pin input\n");
1025                         goto request_bat_low_pin_fail;
1026                 }
1027         }
1028         if (gpio_is_valid(cw_bat->plat_data.bat_low_pin)) {
1029                 ret = gpio_request(cw_bat->plat_data.bat_low_pin, NULL);
1030                 if (ret) {
1031                         dev_err(&cw_bat->client->dev, "failed to request bat_low_pin gpio\n");
1032                         goto request_bat_low_pin_fail;
1033                 }
1034
1035                 ret = gpio_direction_input(cw_bat->plat_data.bat_low_pin);
1036                 if (ret) {
1037                         dev_err(&cw_bat->client->dev, "failed to set bat_low_pin input\n");
1038                         goto request_bat_low_pin_fail;
1039                 }
1040         }
1041         if (gpio_is_valid(cw_bat->plat_data.chg_ok_pin)) {
1042                 ret = gpio_request(cw_bat->plat_data.chg_ok_pin, NULL);
1043                 if (ret) {
1044                         dev_err(&cw_bat->client->dev, "failed to request chg_ok_pin gpio\n");
1045                         goto request_chg_ok_pin_fail;
1046                 }
1047
1048                 ret = gpio_direction_input(cw_bat->plat_data.chg_ok_pin);
1049                 if (ret) {
1050                         dev_err(&cw_bat->client->dev, "failed to set chg_ok_pin input\n");
1051                         gpio_free(cw_bat->plat_data.chg_ok_pin); 
1052                         goto request_chg_ok_pin_fail;
1053                 }
1054         }
1055
1056         if ((gpio_is_valid(cw_bat->plat_data.chg_mode_sel_pin))) {
1057                 ret = gpio_request(cw_bat->plat_data.chg_mode_sel_pin, NULL);
1058                 if (ret) {
1059                         dev_err(&cw_bat->client->dev, "failed to request chg_mode_sel_pin gpio\n");
1060                         goto request_chg_mode_sel_pin_fail;
1061                 }
1062                 ret = gpio_direction_output(cw_bat->plat_data.chg_mode_sel_pin, (cw_bat->plat_data.chg_mode_sel_level==CW2015_GPIO_LOW) ? CW2015_GPIO_HIGH : CW2015_GPIO_LOW);
1063                 if (ret) {
1064                         dev_err(&cw_bat->client->dev, "failed to set chg_mode_sel_pin output\n");
1065                         gpio_free(cw_bat->plat_data.chg_mode_sel_pin); 
1066                         goto request_chg_mode_sel_pin_fail;
1067                 }
1068         }
1069  
1070         return 0;
1071
1072 request_chg_mode_sel_pin_fail:
1073                   gpio_free(cw_bat->plat_data.chg_mode_sel_pin);
1074         
1075 request_chg_ok_pin_fail:
1076         if (gpio_is_valid(cw_bat->plat_data.bat_low_pin))
1077                 gpio_free(cw_bat->plat_data.bat_low_pin);
1078
1079 request_bat_low_pin_fail:
1080         if (gpio_is_valid(cw_bat->plat_data.dc_det_pin)) 
1081                 gpio_free(cw_bat->plat_data.dc_det_pin);
1082
1083 request_dc_det_pin_fail:
1084         return ret;
1085
1086 }
1087
1088
1089 static void dc_detect_do_wakeup(struct work_struct *work)
1090 {
1091         int ret;
1092         int irq;
1093         unsigned int type;
1094
1095         struct delayed_work *delay_work;
1096         struct cw_battery *cw_bat;
1097
1098         delay_work = container_of(work, struct delayed_work, work);
1099         cw_bat = container_of(delay_work, struct cw_battery, dc_wakeup_work);
1100
1101         rk_send_wakeup_key();
1102
1103         /* this assume if usb insert or extract dc_det pin is change */
1104 #if 0
1105         if(cw_bat->charger_init_mode)
1106                 cw_bat->charger_init_mode=0;
1107 #endif
1108
1109         irq = gpio_to_irq(cw_bat->plat_data.dc_det_pin);
1110         type = gpio_get_value(cw_bat->plat_data.dc_det_pin) ? IRQ_TYPE_EDGE_FALLING : IRQ_TYPE_EDGE_RISING;
1111         ret = irq_set_irq_type(irq, type);
1112         if (ret < 0) {
1113                 pr_err("%s: irq_set_irq_type(%d, %d) failed\n", __func__, irq, type);
1114         }
1115         enable_irq(irq);
1116 }
1117
1118 static irqreturn_t dc_detect_irq_handler(int irq, void *dev_id)
1119 {
1120         struct cw_battery *cw_bat = dev_id;
1121         disable_irq_nosync(irq); // for irq debounce
1122         queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->dc_wakeup_work, msecs_to_jiffies(20));
1123         return IRQ_HANDLED;
1124 }
1125
1126 #ifdef BAT_LOW_INTERRUPT
1127
1128 #define WAKE_LOCK_TIMEOUT       (10 * HZ)
1129
1130 static void bat_low_detect_do_wakeup(struct work_struct *work)
1131 {
1132         struct delayed_work *delay_work;
1133         struct cw_battery *cw_bat;
1134
1135         delay_work = container_of(work, struct delayed_work, work);
1136         cw_bat = container_of(delay_work, struct cw_battery, bat_low_wakeup_work);
1137         dev_info(&cw_bat->client->dev, "func: %s-------\n", __func__);
1138         cw_get_alt(cw_bat);
1139         //enable_irq(irq);
1140 }
1141
1142 static irqreturn_t bat_low_detect_irq_handler(int irq, void *dev_id)
1143 {
1144         struct cw_battery *cw_bat = dev_id;
1145         // disable_irq_nosync(irq); // for irq debounce
1146         queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->bat_low_wakeup_work, msecs_to_jiffies(20));
1147         return IRQ_HANDLED;
1148 }
1149 #endif
1150
1151 #ifdef CONFIG_OF
1152 static int cw2015_parse_dt(struct device *dev,
1153                                   struct cw_bat_platform_data *data)
1154 {
1155         struct device_node *node = dev->of_node;
1156         enum of_gpio_flags flags;
1157         struct property *prop;
1158         int length;
1159         u32 value;
1160         int ret;
1161
1162         if (!node)
1163                 return -ENODEV;
1164
1165         memset(data, 0, sizeof(*data));
1166
1167         /* determine the number of config info */
1168         prop = of_find_property(node, "bat_config_info", &length);
1169         if (!prop)
1170                 return -EINVAL;
1171
1172         length /= sizeof(u32);
1173
1174         if (length > 0) {
1175                 size_t size = sizeof(*data->cw_bat_config_info) * length;
1176                 data->cw_bat_config_info = devm_kzalloc(dev, size, GFP_KERNEL);
1177                 if (!data->cw_bat_config_info)
1178                         return -ENOMEM;
1179
1180                 ret = of_property_read_u32_array(node, "bat_config_info",
1181                                          data->cw_bat_config_info,
1182                                          length);
1183                 if (ret < 0)
1184                         return ret;
1185         }
1186
1187         data->dc_det_pin = of_get_named_gpio_flags(node, "dc_det_gpio", 0,
1188                                                     &flags);
1189         if (data->dc_det_pin == -EPROBE_DEFER)
1190                 printk("%s  dc_det_gpio error\n",__func__);
1191
1192         if (gpio_is_valid(data->dc_det_pin))
1193                 data->dc_det_level = (flags & OF_GPIO_ACTIVE_LOW)? CW2015_GPIO_LOW:CW2015_GPIO_HIGH;
1194
1195
1196         data->bat_low_pin = of_get_named_gpio_flags(node, "bat_low_gpio", 0,
1197                                                     &flags);
1198         if (data->bat_low_pin == -EPROBE_DEFER)
1199                 printk("%s  bat_low_gpio error\n",__func__);
1200
1201         if (gpio_is_valid(data->bat_low_pin))
1202                 data->bat_low_level = (flags & OF_GPIO_ACTIVE_LOW)? CW2015_GPIO_LOW:CW2015_GPIO_HIGH;
1203
1204
1205         data->chg_ok_pin = of_get_named_gpio_flags(node, "chg_ok_gpio", 0,
1206                                                     &flags);
1207         if (data->chg_ok_pin == -EPROBE_DEFER)
1208                 printk("%s  chg_ok_gpio error\n",__func__);
1209
1210         if (gpio_is_valid(data->chg_ok_pin))
1211                 data->chg_ok_level = (flags & OF_GPIO_ACTIVE_LOW)? CW2015_GPIO_LOW:CW2015_GPIO_HIGH;
1212
1213         data->chg_mode_sel_pin = of_get_named_gpio_flags(node, "chg_mode_sel_gpio", 0,
1214                                                     &flags);
1215         if (data->chg_mode_sel_pin == -EPROBE_DEFER)
1216                 printk("%s  chg_mod_sel_gpio error\n",__func__);
1217
1218         if (gpio_is_valid(data->chg_mode_sel_pin))
1219                 data->chg_mode_sel_level = (flags & OF_GPIO_ACTIVE_LOW)? CW2015_GPIO_LOW:CW2015_GPIO_HIGH;
1220
1221
1222         ret = of_property_read_u32(node, "is_dc_charge",
1223                                           &value);
1224         if (ret < 0)
1225         {
1226                 printk("%s:hardware unsupport dc charge\n",__func__);
1227                 value = 0;
1228         }
1229         data->is_dc_charge = value;
1230
1231         ret = of_property_read_u32(node, "is_usb_charge",
1232                                           &value);
1233         if (ret < 0)
1234         {
1235                 printk("%s:hardware unsupport usb charge\n",__func__);
1236                 value = 0;
1237         }
1238         data->is_usb_charge = value;
1239
1240         printk("cw201x:support %s %s charger\n",
1241                 data->is_dc_charge ? "DC" : "", data->is_usb_charge ? "USB" : "");
1242
1243         return 0;
1244 }
1245 #else
1246 static int cw2015_parse_dt(struct device *dev,
1247                                   struct cw_bat_platform_data *data)
1248 {
1249         return -ENODEV;
1250 }
1251 #endif
1252
1253 static int cw_bat_probe(struct i2c_client *client, const struct i2c_device_id *id)
1254 {
1255         struct cw_battery *cw_bat;
1256         struct cw_bat_platform_data *plat_data = client->dev.platform_data;
1257         int ret;
1258         int irq;
1259         int irq_flags;
1260         int level = 0;
1261         int loop = 0;
1262
1263         cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL);
1264         if (!cw_bat) {
1265                 dev_err(&cw_bat->client->dev, "fail to allocate memory for cw2015\n");
1266                 return -ENOMEM;
1267         }
1268         i2c_set_clientdata(client, cw_bat);
1269
1270         if (!plat_data) {
1271                 ret = cw2015_parse_dt(&client->dev, &(cw_bat->plat_data));
1272                 if (ret < 0) {
1273                         dev_err(&client->dev, "failed to find cw2015 platform data\n");
1274                         goto pdate_fail;
1275                 }
1276         }
1277
1278         cw_bat->client = client;
1279         ret = cw_bat_gpio_init(cw_bat);
1280         if (ret) {
1281                 dev_err(&cw_bat->client->dev, "cw_bat_gpio_init error\n");
1282                 return ret;
1283         }
1284        
1285         ret = cw_init(cw_bat);
1286 #if 0
1287         while ((loop++ < 200) && (ret != 0)) {
1288                 ret = cw_init(cw_bat);
1289         }
1290 #endif
1291         if (ret) 
1292         {
1293                 printk("%s cw_init error\n",__func__);
1294                 return ret;
1295         }
1296         
1297         cw_bat->rk_bat.name = "rk-bat";
1298         cw_bat->rk_bat.type = POWER_SUPPLY_TYPE_BATTERY;
1299         cw_bat->rk_bat.properties = rk_battery_properties;
1300         cw_bat->rk_bat.num_properties = ARRAY_SIZE(rk_battery_properties);
1301         cw_bat->rk_bat.get_property = rk_battery_get_property;
1302         ret = power_supply_register(&client->dev, &cw_bat->rk_bat);
1303         if(ret < 0) {
1304                 dev_err(&cw_bat->client->dev, "power supply register rk_bat error\n");
1305                 goto rk_bat_register_fail;
1306         }
1307
1308         cw_bat->rk_ac.name = "rk-ac";
1309         cw_bat->rk_ac.type = POWER_SUPPLY_TYPE_MAINS;
1310         cw_bat->rk_ac.properties = rk_ac_properties;
1311         cw_bat->rk_ac.num_properties = ARRAY_SIZE(rk_ac_properties);
1312         cw_bat->rk_ac.get_property = rk_ac_get_property;
1313         ret = power_supply_register(&client->dev, &cw_bat->rk_ac);
1314         if(ret < 0) {
1315                 dev_err(&cw_bat->client->dev, "power supply register rk_ac error\n");
1316                 goto rk_ac_register_fail;
1317            }    
1318
1319         if (cw_bat->plat_data.is_usb_charge == 1) {
1320                 cw_bat->rk_usb.name = "rk-usb";
1321                 cw_bat->rk_usb.type = POWER_SUPPLY_TYPE_USB;
1322                 cw_bat->rk_usb.properties = rk_usb_properties;
1323                 cw_bat->rk_usb.num_properties = ARRAY_SIZE(rk_usb_properties);
1324                 cw_bat->rk_usb.get_property = rk_usb_get_property;
1325                 ret = power_supply_register(&client->dev, &cw_bat->rk_usb);
1326                 if(ret < 0) {
1327                         dev_err(&cw_bat->client->dev, "power supply register rk_usb error\n");
1328                         goto rk_usb_register_fail;
1329                 }
1330                 cw_bat->charger_init_mode = dwc_otg_check_dpdm();
1331                 printk("%s cw2015 support charger by usb. usb_mode=%d\n",__func__,cw_bat->charger_init_mode);
1332         }
1333
1334         cw_bat->dc_online = 0;
1335         cw_bat->usb_online = 0;
1336         cw_bat->charger_mode = 0;
1337         cw_bat->capacity = 2;
1338         cw_bat->voltage = 0;
1339         cw_bat->status = 0;
1340         cw_bat->time_to_empty = 0;
1341         cw_bat->bat_change = 0;
1342
1343         cw_update_time_member_capacity_change(cw_bat);
1344         cw_update_time_member_charge_start(cw_bat);
1345
1346         cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery");
1347         INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work);
1348         INIT_DELAYED_WORK(&cw_bat->dc_wakeup_work, dc_detect_do_wakeup);
1349         queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10));
1350         
1351         if (gpio_is_valid(cw_bat->plat_data.dc_det_pin)) {
1352                 irq = gpio_to_irq(cw_bat->plat_data.dc_det_pin);
1353                 level = gpio_get_value(cw_bat->plat_data.dc_det_pin);
1354                 if (level == cw_bat->plat_data.dc_det_level)
1355                 {
1356                         printk("%s booting up with dc plug\n",__func__);
1357                         cw_bat->status = POWER_SUPPLY_STATUS_CHARGING;
1358                 }
1359                 irq_flags = level ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1360                 ret = request_irq(irq, dc_detect_irq_handler, irq_flags, "dc_detect", cw_bat);
1361                 if (ret < 0) {
1362                         pr_err("%s: request_irq(%d) failed\n", __func__, irq);
1363                 }
1364                 enable_irq_wake(irq);
1365         }
1366
1367
1368         if (gpio_is_valid(cw_bat->plat_data.bat_low_pin)) {
1369                 INIT_DELAYED_WORK(&cw_bat->bat_low_wakeup_work, bat_low_detect_do_wakeup);
1370                 level = gpio_get_value(cw_bat->plat_data.bat_low_pin);
1371                 if (level == cw_bat->plat_data.dc_det_level)
1372                 {
1373                         printk("%s booting up with lower power\n",__func__);
1374                         cw_bat->capacity = 1;
1375                 }
1376                 irq = gpio_to_irq(cw_bat->plat_data.bat_low_pin);
1377                 ret = request_irq(irq, bat_low_detect_irq_handler, IRQF_TRIGGER_RISING, "bat_low_detect", cw_bat);
1378                 if (ret < 0) {
1379                         gpio_free(cw_bat->plat_data.bat_low_pin);
1380                 }
1381                 enable_irq_wake(irq);
1382         }
1383
1384         dev_info(&cw_bat->client->dev, "cw2015/cw2013 driver v1.2 probe sucess\n");
1385         return 0;
1386
1387 rk_usb_register_fail:
1388         power_supply_unregister(&cw_bat->rk_usb);
1389 rk_ac_register_fail:
1390         power_supply_unregister(&cw_bat->rk_ac);
1391 rk_bat_register_fail:
1392         power_supply_unregister(&cw_bat->rk_bat);
1393 pdate_fail:
1394         dev_info(&cw_bat->client->dev, "cw2015/cw2013 driver v1.2 probe error!!!!\n");
1395         return ret;
1396 }
1397
1398 static int cw_bat_remove(struct i2c_client *client)
1399 {
1400         struct cw_battery *cw_bat = i2c_get_clientdata(client);
1401         dev_dbg(&cw_bat->client->dev, "%s\n", __func__);
1402         cancel_delayed_work(&cw_bat->battery_delay_work);
1403         return 0;
1404 }
1405
1406 #ifdef CONFIG_PM
1407 static int cw_bat_suspend(struct device *dev)
1408 {
1409         struct i2c_client *client = to_i2c_client(dev);
1410         struct cw_battery *cw_bat = i2c_get_clientdata(client);
1411         dev_dbg(&cw_bat->client->dev, "%s\n", __func__);
1412         cancel_delayed_work(&cw_bat->battery_delay_work);
1413         return 0;
1414 }
1415
1416 static int cw_bat_resume(struct device *dev)
1417 {
1418         struct i2c_client *client = to_i2c_client(dev);
1419         struct cw_battery *cw_bat = i2c_get_clientdata(client);
1420         dev_dbg(&cw_bat->client->dev, "%s\n", __func__);
1421         queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(100));
1422         return 0;
1423 }
1424
1425 static const struct i2c_device_id cw_id[] = {
1426         { "cw201x", 0 },
1427         {  }
1428 };
1429 MODULE_DEVICE_TABLE(i2c, cw_id);
1430
1431 static const struct dev_pm_ops cw_bat_pm_ops = {
1432         .suspend  = cw_bat_suspend,
1433         .resume   = cw_bat_resume,
1434 };
1435 #endif
1436
1437 static struct i2c_driver cw_bat_driver = {
1438         .driver         = {
1439                 .name   = "cw201x",
1440 #ifdef CONFIG_PM
1441                 .pm     = &cw_bat_pm_ops,
1442 #endif
1443         },
1444         
1445         .probe          = cw_bat_probe,
1446         .remove         = cw_bat_remove,
1447         .id_table       = cw_id,
1448 };
1449
1450 static int __init cw_bat_init(void)
1451 {
1452         return i2c_add_driver(&cw_bat_driver);
1453 }
1454
1455 static void __exit cw_bat_exit(void)
1456 {
1457         i2c_del_driver(&cw_bat_driver);
1458 }
1459
1460 fs_initcall(cw_bat_init);
1461 module_exit(cw_bat_exit);
1462
1463
1464 MODULE_AUTHOR("xhc<xhc@rock-chips.com>");
1465 MODULE_DESCRIPTION("cw2015/cw2013 battery driver");
1466 MODULE_LICENSE("GPL");
1467
1468