1 /* drivers/power/rk30_adc_battery.c
3 * battery detect driver for the rk30
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.
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.
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>
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>
37 #include <linux/wakelock.h>
40 #define DBG(x...) printk(x)
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...) \
49 if (rk30_battery_dbg_level) { \
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ʶ±ð¼ì²âʱ¼ä
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) //³äµçÂú״̬³ÖÐøʱ¼ä³¤¶È
74 #if defined(CONFIG_ARCH_RK3066B)
75 #define BAT_DEFINE_VALUE 1800
76 #elif defined(CONFIG_ARCH_RK2928)
77 #define BAT_DEFINE_VALUE 3300
79 #define BAT_DEFINE_VALUE 2500
83 #define BATT_FILENAME "/data/bat_last_capacity.dat"
85 static struct wake_lock batt_wake_lock;
95 #ifdef CONFIG_BATTERY_RK30_VOL3V8
97 #define BATT_MAX_VOL_VALUE 4120 //ÂúµçʱµÄµç³Øµçѹ
98 #define BATT_ZERO_VOL_VALUE 3400 //¹Ø»úʱµÄµç³Øµçѹ
99 #define BATT_NOMAL_VOL_VALUE 3800
101 #define BAT_PULL_UP_R 200
102 #define BAT_PULL_DOWN_R 200
104 static struct batt_vol_cal batt_table[] = {
105 {0,3400,3520},{1,3420,3525},{2,3420,3575},{3,3475,3600},{5,3505,3620},{7,3525,3644},
106 {9,3540,3662},{11,3557,3670},{13,3570,3684},{15,3580,3700},{17,3610,3715},
107 {19,3630,3720},{21,3640,3748},{23,3652,3756},{25,3662,3775},{27,3672,3790},
108 {29,3680,3810},{31,3687,3814},{33,3693,3818},{35,3699,3822},{37,3705,3825},
109 {39,3710,3830},{41,3714,3832},{43,3718,3834},{45,3722,3836},{47,3726,3837},
110 {49,3730,3839},{51,3734,3841},{53,3738,3842},{55,3742,3844},{57,3746,3844},
111 {59,3750,3855},{61,3756,3860},{63,3764,3864},{65,3774,3871},{67,3786,3890},
112 {69,3800,3910},{71,3808,3930},{73,3817,3977},{75,3827,3977},{77,3845,3997},
113 {79,3950,4030},{81,3964,4047},{83,3982,4064},{85,4002,4080},{87,4026,4096},
114 {89,4030,4132},{91,4034,4144},{93,4055,4150},{95,4085,4195},{97,4085,4195},{100,4120,4200},
117 #define BATT_MAX_VOL_VALUE 8284 //Full charge voltage
118 #define BATT_ZERO_VOL_VALUE 6800 // power down voltage
119 #define BATT_NOMAL_VOL_VALUE 7600
121 //¶¨ÒåADC²ÉÑù·Öѹµç×裬ÒÔʵ¼ÊֵΪ׼£¬µ¥Î»K
123 #define BAT_PULL_UP_R 300
124 #define BAT_PULL_DOWN_R 100
126 static struct batt_vol_cal batt_table[] = {
127 {0,6800,7400}, {1,6840,7440}, {2,6880,7480}, {3,6950,7450}, {5,7010,7510}, {7,7050,7550},
128 {9,7080,7580}, {11,7104,7604}, {13,7140,7640}, {15,7160,7660}, {17,7220,7720},
129 {19,7260,7760}, {21,7280,7780}, {23,7304,7802}, {25,7324,7824}, {27,7344,7844},
130 {29,7360,7860}, {31,7374,7874}, {33,7386,7886}, {35,7398,7898}, {37,7410,7910},//500
131 {39,7420,7920}, {41,7424,7928}, {43,7436,7947}, {45,7444,7944}, {47,7450,7958}, //508
132 {49,7460,7965}, {51,7468,7975}, {53, 7476,7990}, {55,7482,8000}, {57,7492,8005}, // 5 14
133 {59,7500,8011}, {61,7510,8033}, {63,7528,8044}, {65,7548,8055}, {67,7560,8066},//506
134 {69,7600,8070}, {71,7618,8075}, {73,7634,8080}, {75,7654,8085}, {77,7690,8100}, //400
135 {79,7900,8180}, {81,7920,8210}, {83,7964,8211}, {85,8000,8214}, {87,8002,8218},//290
136 {89,8012, 8220}, {91,8022,8235}, {93,8110,8260}, {95,8140,8290}, {97,8170,8300}, {100,8200 ,8310},//110
143 #define BATT_NUM ARRAY_SIZE(batt_table)
151 #include <linux/fs.h>
152 int battery_dbg_level = 0;
153 int battery_test_flag = 0;
154 int gVoltageCnt = 3400;
155 int gDoubleVoltageCnt = 6800;
156 #ifdef CONFIG_BATTERY_RK30_VOL3V8
157 #define BATT_MAX_VOL_VALUE 4120 //ÂúµçʱµÄµç³Øµçѹ
158 #define BATT_ZERO_VOL_VALUE 3400 //¹Ø»úʱµÄµç³Øµçѹ
159 #define BATT_NOMAL_VOL_VALUE 3800
161 //int pull_up_res =100;
162 //int pull_down_res = 100;
165 static int batt_table[2*BATT_NUM+6] =
167 0x4B434F52,0x7461625F,0x79726574,0,100,100,
168 3496, 3548, 3599, 3626, 3655, 3697, 3751, 3812, 3877, 3949, 4030, //discharge
169 3540, 3785, 3842, 3861, 3915, 3980, 4041, 4135, 4169, 4175, 4185 //charge
171 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
173 #define BATT_MAX_VOL_VALUE 8284 //Full charge voltage
174 #define BATT_ZERO_VOL_VALUE 6800 // power down voltage
175 #define BATT_NOMAL_VOL_VALUE 7600
176 //int pull_up_res =300;
177 //int pull_down_res = 100;
178 //¶¨ÒåADC²ÉÑù·Öѹµç×裬ÒÔʵ¼ÊֵΪ׼£¬µ¥Î»K
180 static int batt_table[2*BATT_NUM+6] =
182 0x4B434F52,0x7461625F,0x79726574,1,300,100,
183 6800,7242,7332,7404,7470,7520,7610,7744,7848,8016,8284,
184 7630, 7754, 7852, 7908, 7956, 8024, 8112, 8220, 8306, 8318, 8328
186 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
191 //#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 unsigned long gSecondsCnt = 0;
196 char gDischargeFlag[3] = {"on "};
199 /********************************************************************************/
201 extern int dwc_vbus_status(void);
202 extern int get_msc_connect_flag(void);
204 struct rk30_adc_battery_data {
207 //struct timer_list timer;
208 struct workqueue_struct *wq;
209 struct delayed_work delay_work;
210 struct work_struct dcwakeup_work;
211 struct work_struct lowerpower_work;
214 struct rk30_adc_battery_platform_data *pdata;
218 struct adc_client *client;
220 int adc_samples[NUM_VOLTAGE_SAMPLE+2];
230 int old_charge_level;
232 int gBatCapacityDisChargeCnt;
233 int gBatCapacityChargeCnt;
236 int suspend_capacity;
241 static struct rk30_adc_battery_data *gBatteryData;
245 #define BAT_ADC_TABLE_LEN 11
246 static ssize_t bat_param_read(struct device *dev,struct device_attribute *attr, char *buf)
250 for(i=0;i<BATT_NUM;i++)
251 printk("i=%d batt_table=%d\n",i+6,batt_table[i+6]);
253 for(i=0;i<BATT_NUM;i++)
254 printk("i=%d batt_table=%d\n",i+17,batt_table[i+17]);
258 DEVICE_ATTR(batparam, 0664, bat_param_read,NULL);
261 static ssize_t rkbatt_show_debug_attrs(struct device *dev,
262 struct device_attribute *attr, char *buf)
264 return sprintf(buf, "%d\n", battery_dbg_level);
267 static ssize_t rkbatt_restore_debug_attrs(struct device *dev,
268 struct device_attribute *attr,
269 const char *buf, size_t size)
273 sscanf(buf, "%d", &liTmp);
275 if(liTmp != 0 && liTmp != 1)
277 dev_err(dev, "rk29adc_restore_debug_attrs err\n");
281 battery_dbg_level = liTmp;
286 static ssize_t rkbatt_show_state_attrs(struct device *dev,
287 struct device_attribute *attr,
290 struct rk30_adc_battery_platform_data *pdata = gBatteryData->pdata;
293 "gBatVol=%d,gBatCap=%d,charge_ok=%d,%s\n",
294 gBatteryData->bat_voltage,gBatteryData->bat_capacity,
295 gpio_get_value(pdata->charge_ok_pin),gDischargeFlag);
298 static ssize_t rkbatt_restore_state_attrs(struct device *dev,
299 struct device_attribute *attr,
300 const char *buf, size_t size)
305 static ssize_t rkbatt_show_value_attrs(struct device *dev,
306 struct device_attribute *attr, char *buf)
308 return sprintf(buf, "pull_up_res =%d,\npull_down_res=%d\n", batt_table[4],batt_table[5]);
311 static ssize_t rkbatt_restore_value_attrs(struct device *dev,
312 struct device_attribute *attr,
313 const char *buf, size_t size)
318 sscanf(buf, "%d,%d", &liUp,&liDown);
320 if(liUp != 0 && liDown != 0)
322 batt_table[4] = liUp;
323 batt_table[5] = liDown;
332 static ssize_t rkbatt_show_flag_attrs(struct device *dev,
333 struct device_attribute *attr, char *buf)
335 return sprintf(buf, "rk29_battery_test_flag=%d\n", battery_test_flag);
337 static ssize_t rkbatt_restore_flag_attrs(struct device *dev,
338 struct device_attribute *attr,
339 const char *buf, size_t size)
343 sscanf(buf, "%d", &liFlag);
347 battery_test_flag = liFlag;
351 static struct device_attribute rkbatt_attrs[] = {
352 __ATTR(state, 0664, rkbatt_show_state_attrs, rkbatt_restore_state_attrs),
353 __ATTR(debug, 0664, rkbatt_show_debug_attrs, rkbatt_restore_debug_attrs),
354 __ATTR(value, 0666, rkbatt_show_value_attrs, rkbatt_restore_value_attrs),
355 __ATTR(flag, 0666, rkbatt_show_flag_attrs, rkbatt_restore_flag_attrs),
358 static int create_sysfs_interfaces(struct device *dev)
361 for (liTmep = 0; liTmep < ARRAY_SIZE(rkbatt_attrs); liTmep++)
363 if (device_create_file(dev, rkbatt_attrs + liTmep))
372 for ( ; liTmep >= 0; liTmep--)
374 device_remove_file(dev, rkbatt_attrs + liTmep);
377 dev_err(dev, "%s:Unable to create sysfs interface\n", __func__);
389 BATTERY_CAPACITY = 3,
390 BATTERY_AC_ONLINE = 4,
391 BATTERY_STATUS_CHANGED = 5,
392 AC_STATUS_CHANGED = 6,
393 BATTERY_INT_STATUS = 7,
394 BATTERY_INT_ENABLE = 8,
407 static int rk30_adc_battery_load_capacity(void)
410 int* p = (int *)value;
411 long fd = sys_open(BATT_FILENAME,O_RDONLY,0);
414 pr_bat("rk30_adc_battery_load_capacity: open file /data/bat_last_capacity.dat failed\n");
418 sys_read(fd,(char __user *)value,4);
424 static void rk30_adc_battery_put_capacity(int loadcapacity)
427 int* p = (int *)value;
428 long fd = sys_open(BATT_FILENAME,O_CREAT | O_RDWR,0);
431 pr_bat("rk30_adc_battery_put_capacity: open file /data/bat_last_capacity.dat failed\n");
436 sys_write(fd, (const char __user *)value, 4);
441 static void rk30_adc_battery_charge_enable(struct rk30_adc_battery_data *bat)
443 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
445 if (pdata->charge_set_pin != INVALID_GPIO){
446 gpio_direction_output(pdata->charge_set_pin, pdata->charge_set_level);
450 static void rk30_adc_battery_charge_disable(struct rk30_adc_battery_data *bat)
452 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
454 if (pdata->charge_set_pin != INVALID_GPIO){
455 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
459 //extern int suspend_flag;
460 #if defined (CONFIG_REGULATOR_ACT8931)
461 extern int act8931_charge_det ;
463 extern int __sramdata g_pmic_type ;
464 #define PMIC_TYPE_TPS65910 2
465 #define PMIC_TYPE_ACT8931 3
466 static int rk30_adc_battery_get_charge_level(struct rk30_adc_battery_data *bat)
469 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
471 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
472 if (pdata->dc_det_pin != INVALID_GPIO){
473 if (gpio_get_value (pdata->dc_det_pin) == pdata->dc_det_level){
478 #if defined (CONFIG_REGULATOR_ACT8931)
479 if(g_pmic_type == PMIC_TYPE_ACT8931)
481 charge_on = act8931_charge_det;//act8931_dc_det(11000);
487 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
491 if (1 == dwc_vbus_status()) { //¼ì²âµ½USB²åÈ룬µ«ÊÇÎÞ·¨Ê¶±ðÊÇ·ñÊdzäµçÆ÷
492 //ͨ¹ýÑÓʱ¼ì²âPCʶ±ð±êÖ¾£¬Èç¹û³¬Ê±¼ì²â²»µ½£¬ËµÃ÷Êdzäµç
493 if (0 == get_msc_connect_flag()){ //²åÈë³äµçÆ÷ʱ¼ä´óÓÚÒ»¶¨Ê±¼äÖ®ºó£¬¿ªÊ¼½øÈë³äµç״̬
494 if (++gBatUsbChargeCnt >= NUM_USBCHARGE_IDENTIFY_TIMES){
495 gBatUsbChargeCnt = NUM_USBCHARGE_IDENTIFY_TIMES + 1;
498 } //·ñÔò£¬²»½øÈë³äµçģʽ
501 gBatUsbChargeCnt = 0;
502 if (2 == dwc_vbus_status()) {
511 //int old_charge_level;
512 static int rk30_adc_battery_status_samples(struct rk30_adc_battery_data *bat)
516 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
518 charge_level = rk30_adc_battery_get_charge_level(bat);
520 //¼ì²â³äµç״̬±ä»¯Çé¿ö
521 if (charge_level != bat->old_charge_level){
522 bat->old_charge_level = charge_level;
526 rk30_adc_battery_charge_enable(bat);
529 rk30_adc_battery_charge_disable(bat);
531 bat->bat_status_cnt = 0; //״̬±ä»¯¿ªÊ¼¼ÆÊý
534 if(charge_level == 0){
537 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
541 if (pdata->charge_ok_pin == INVALID_GPIO){ //no charge_ok_pin
543 if (bat->bat_capacity == 100){
544 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
545 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
550 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
553 else{ // pin of charge_ok_pin
554 if (gpio_get_value(pdata->charge_ok_pin) != pdata->charge_ok_level){
557 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
560 //¼ì²âµ½³äµçÂúµçƽ±êÖ¾
563 if (bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) {
564 bat->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
567 if ((bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) && (bat->bat_capacity >= 99)){
568 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
569 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
570 bat->bat_capacity = 100;
575 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
584 static int *pSamples;
585 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
588 int i,*pStart = bat->adc_samples, num = 0;
589 int level = rk30_adc_battery_get_charge_level(bat);
592 value = bat->adc_val;
593 adc_async_read(bat->client);
595 *pSamples++ = adc_to_voltage(value);
597 bat->bat_status_cnt++;
598 if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE) bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
600 num = pSamples - pStart;
602 if (num >= NUM_VOLTAGE_SAMPLE){
604 num = NUM_VOLTAGE_SAMPLE;
609 for (i = 0; i < num; i++){
610 value += bat->adc_samples[i];
612 bat->bat_voltage = value / num;
615 if(battery_test_flag == 0)
618 if(bat->bat_voltage >= batt_table[2*BATT_NUM +5]+ 10)
619 bat->bat_voltage = batt_table[2*BATT_NUM +5] + 10;
620 else if(bat->bat_voltage <= batt_table[BATT_NUM +6] - 10)
621 bat->bat_voltage = batt_table[BATT_NUM +6] - 10;
624 if(bat->bat_voltage >= batt_table[BATT_NUM +5]+ 10)
625 bat->bat_voltage = batt_table[BATT_NUM +5] + 10;
626 else if(bat->bat_voltage <= batt_table[6] - 10)
627 bat->bat_voltage = batt_table[6] - 10;
630 }else if(battery_test_flag == 2)
631 /**************************************************/
633 if(batt_table[3] == 0)
635 if(bat->bat_voltage < 3400)
637 //printk("gSecondsCnt=%ld,get_seconds()=%ld,(get_seconds() - gSecondsCnt)=%ld-------------------1\n",gSecondsCnt,get_seconds(),(get_seconds() - gSecondsCnt));
638 if((get_seconds() - gSecondsCnt) > 30)
640 gSecondsCnt = get_seconds();
641 //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);
642 if((gVoltageCnt - bat->bat_voltage) > 15)
644 //gVoltageCnt = bat->bat_voltage;
645 //printk("gVoltageCnt=%d-------------------3\n",gVoltageCnt);
646 strncpy(gDischargeFlag, "off" ,3);
648 gVoltageCnt = bat->bat_voltage;
653 if(bat->bat_voltage < 3400)
655 bat->bat_voltage = 3400;
660 if(bat->bat_voltage < 6800)
662 //printk("gSecondsCnt=%ld,get_seconds()=%ld,(get_seconds() - gSecondsCnt)=%ld-------------------1\n",gSecondsCnt,get_seconds(),(get_seconds() - gSecondsCnt));
663 if((get_seconds() - gSecondsCnt) > 30)
665 gSecondsCnt = get_seconds();
666 //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);
667 if((gDoubleVoltageCnt - bat->bat_voltage) > 30)
669 //gVoltageCnt = bat->bat_voltage;
670 //printk("gVoltageCnt=%d-------------------3\n",gVoltageCnt);
671 strncpy(gDischargeFlag, "off" ,3);
673 gDoubleVoltageCnt =bat->bat_voltage;
676 if(bat->bat_voltage < 6800)
678 bat->bat_voltage = 6800;
682 /****************************************************/
684 static int rk30_adc_battery_voltage_to_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
692 if (rk30_adc_battery_get_charge_level(bat)){ //charge
693 if(BatVoltage >= (p[2*BATT_NUM +5])){
697 if(BatVoltage <= (p[BATT_NUM +6])){
701 for(i = BATT_NUM +6; i <2*BATT_NUM +6; i++){
703 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
704 capacity = (i-(BATT_NUM +6))*10 + ((BatVoltage - p[i]) * 10)/ (p[i+1]- p[i]);
713 if(BatVoltage >= (p[BATT_NUM +5])){
717 if(BatVoltage <= (p[6])){
721 for(i = 6; i < BATT_NUM +6; i++){
722 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
723 capacity = (i-6)*10+ ((BatVoltage - p[i]) *10 )/ (p[i+1]- p[i]) ;
736 static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat)
739 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
741 //³ä·Åµç״̬±ä»¯ºó£¬BufferÌîÂú֮ǰ£¬²»¸üÐÂ
742 if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE) {
743 bat->gBatCapacityDisChargeCnt = 0;
744 bat->gBatCapacityChargeCnt = 0;
748 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
750 if (rk30_adc_battery_get_charge_level(bat)){
751 if (capacity > bat->bat_capacity){
752 //ʵ¼Ê²ÉÑùµ½µÄÈÝÁ¿±ÈÏÔʾµÄÈÝÁ¿´ó£¬Öð¼¶ÉÏÉý
753 if (++(bat->gBatCapacityDisChargeCnt) >= NUM_CHARGE_MIN_SAMPLE){
754 bat->gBatCapacityDisChargeCnt = 0;
755 if (bat->bat_capacity < 99){
760 bat->gBatCapacityChargeCnt = 0;
762 else{ // ʵ¼ÊµÄÈÝÁ¿±È²ÉÑù±È ÏÔʾµÄÈÝÁ¿Ð¡
763 bat->gBatCapacityDisChargeCnt = 0;
764 (bat->gBatCapacityChargeCnt)++;
766 if (pdata->charge_ok_pin != INVALID_GPIO){
767 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
768 //¼ì²âµ½µç³Ø³äÂú±êÖ¾£¬Í¬Ê±³¤Ê±¼äÄÚ³äµçµçѹÎޱ仯£¬¿ªÊ¼Æô¶¯¼Æʱ³äµç£¬¿ìËÙÉÏÉýÈÝÁ¿
769 if (bat->gBatCapacityChargeCnt >= NUM_CHARGE_MIN_SAMPLE){
770 bat->gBatCapacityChargeCnt = 0;
771 if (bat->bat_capacity < 99){
779 if (capacity > capacitytmp){
780 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
781 gBatCapacityChargeCnt = 0;
783 else if (/*bat->bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
784 gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
786 if (bat->bat_capacity < 99){
792 #else // ·ÀÖ¹µç³ØÀÏ»¯ºó³öÏֳ岻ÂúµÄÇé¿ö£¬
793 if (capacity > bat->capacitytmp){
794 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
795 bat->gBatCapacityChargeCnt = 0;
799 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
800 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
802 if (bat->bat_capacity < 99){
813 //ûÓгäµçÂú¼ì²â½Å£¬³¤Ê±¼äÄÚµçѹÎޱ仯£¬¶¨Ê±Æ÷Ä£Äâ³äµç
814 if (capacity > bat->capacitytmp){
815 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
816 bat->gBatCapacityChargeCnt = 0;
820 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
821 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
823 if (bat->bat_capacity < 99){
835 //·Åµçʱ,Ö»ÔÊÐíµçѹϽµ
836 if (capacity < bat->bat_capacity){
837 if (++(bat->gBatCapacityDisChargeCnt) >= NUM_DISCHARGE_MIN_SAMPLE){
838 bat->gBatCapacityDisChargeCnt = 0;
839 if (bat->bat_capacity > 0){
840 bat->bat_capacity-- ;
846 bat->gBatCapacityDisChargeCnt = 0;
848 bat->gBatCapacityChargeCnt = 0;
850 bat->capacitytmp = capacity;
853 //static int poweron_check = 0;
854 static void rk30_adc_battery_poweron_capacity_check(void)
857 int new_capacity, old_capacity;
859 new_capacity = gBatteryData->bat_capacity;
863 old_capacity = rk30_adc_battery_load_capacity();
864 // printk("------------------->> : %d \n",old_capacity);
865 if( old_capacity >= 0 ){
870 // printk("---------------------------------------------------------->> : %d \n",old_capacity);
871 if ((old_capacity <= 0) || (old_capacity >= 100)){
872 old_capacity = new_capacity;
875 if (gBatteryData->bat_status == POWER_SUPPLY_STATUS_FULL){
876 if (new_capacity > 80){
877 gBatteryData->bat_capacity = 100;
880 else if (gBatteryData->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
883 // //1£©³¤Ê±¼ä¹Ø»ú·ÅÖú󣬿ª»úºó¶ÁÈ¡µÄÈÝÁ¿Ô¶Ô¶´óÓÚʵ¼ÊÈÝÁ¿Ôõô°ì£¿
884 // //2£©Èç¹û²»ÕâÑù×ö£¬¶Ìʱ¼ä¹Ø»úÔÙ¿ª»ú£¬Ç°ºóÈÝÁ¿²»Ò»ÖÂÓÖ¸ÃÔõô°ì£¿
885 // //3£©Ò»ÏÂÄÇÖÖ·½Ê½ºÏÊÊ£¿
886 //gBatteryData->bat_capacity = new_capacity;
887 gBatteryData->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
890 if(new_capacity > old_capacity + 50 )
891 gBatteryData->bat_capacity = new_capacity;
893 gBatteryData->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; //avoid the value of capacity increase
897 printk("capacity = %d, new_capacity = %d, old_capacity = %d\n",gBatteryData->bat_capacity, new_capacity, old_capacity);
899 gBatteryData->bat_change = 1;
902 #if defined(CONFIG_BATTERY_RK30_USB_CHARGE)
903 static int rk30_adc_battery_get_usb_property(struct power_supply *psy,
904 enum power_supply_property psp,
905 union power_supply_propval *val)
907 charger_type_t charger;
908 charger = CHARGER_USB;
911 case POWER_SUPPLY_PROP_ONLINE:
912 if (psy->type == POWER_SUPPLY_TYPE_USB)
913 val->intval = get_msc_connect_flag();
914 printk("%s:%d\n",__FUNCTION__,val->intval);
925 static enum power_supply_property rk30_adc_battery_usb_props[] = {
927 POWER_SUPPLY_PROP_ONLINE,
930 static struct power_supply rk30_usb_supply =
933 .type = POWER_SUPPLY_TYPE_USB,
935 .get_property = rk30_adc_battery_get_usb_property,
937 .properties = rk30_adc_battery_usb_props,
938 .num_properties = ARRAY_SIZE(rk30_adc_battery_usb_props),
942 #if defined(CONFIG_BATTERY_RK30_AC_CHARGE)
943 static irqreturn_t rk30_adc_battery_dc_wakeup(int irq, void *dev_id)
945 queue_work(gBatteryData->wq, &gBatteryData->dcwakeup_work);
950 static int rk30_adc_battery_get_ac_property(struct power_supply *psy,
951 enum power_supply_property psp,
952 union power_supply_propval *val)
955 charger_type_t charger;
956 charger = CHARGER_USB;
958 case POWER_SUPPLY_PROP_ONLINE:
959 if (psy->type == POWER_SUPPLY_TYPE_MAINS)
961 if (rk30_adc_battery_get_charge_level(gBatteryData))
970 DBG("%s:%d\n",__FUNCTION__,val->intval);
981 static enum power_supply_property rk30_adc_battery_ac_props[] =
983 POWER_SUPPLY_PROP_ONLINE,
986 static struct power_supply rk30_ac_supply =
989 .type = POWER_SUPPLY_TYPE_MAINS,
991 .get_property = rk30_adc_battery_get_ac_property,
993 .properties = rk30_adc_battery_ac_props,
994 .num_properties = ARRAY_SIZE(rk30_adc_battery_ac_props),
997 static void rk30_adc_battery_dcdet_delaywork(struct work_struct *work)
1000 struct rk30_adc_battery_platform_data *pdata;
1004 pdata = gBatteryData->pdata;
1005 irq = gpio_to_irq(pdata->dc_det_pin);
1006 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1008 rk28_send_wakeup_key(); // wake up the system
1010 free_irq(irq, NULL);
1011 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);// reinitialize the DC irq
1013 free_irq(irq, NULL);
1016 power_supply_changed(&rk30_ac_supply);
1018 gBatteryData->bat_status_cnt = 0; //the state of battery is change
1025 static int rk30_adc_battery_get_status(struct rk30_adc_battery_data *bat)
1027 return (bat->bat_status);
1030 static int rk30_adc_battery_get_health(struct rk30_adc_battery_data *bat)
1032 return POWER_SUPPLY_HEALTH_GOOD;
1035 static int rk30_adc_battery_get_present(struct rk30_adc_battery_data *bat)
1037 return (bat->bat_voltage < BATT_MAX_VOL_VALUE) ? 0 : 1;
1040 static int rk30_adc_battery_get_voltage(struct rk30_adc_battery_data *bat)
1042 return (bat->bat_voltage );
1045 static int rk30_adc_battery_get_capacity(struct rk30_adc_battery_data *bat)
1047 return (bat->bat_capacity);
1050 static int rk30_adc_battery_get_property(struct power_supply *psy,
1051 enum power_supply_property psp,
1052 union power_supply_propval *val)
1057 case POWER_SUPPLY_PROP_STATUS:
1058 val->intval = rk30_adc_battery_get_status(gBatteryData);
1059 DBG("gBatStatus=%d\n",val->intval);
1061 case POWER_SUPPLY_PROP_HEALTH:
1062 val->intval = rk30_adc_battery_get_health(gBatteryData);
1063 DBG("gBatHealth=%d\n",val->intval);
1065 case POWER_SUPPLY_PROP_PRESENT:
1066 val->intval = rk30_adc_battery_get_present(gBatteryData);
1067 DBG("gBatPresent=%d\n",val->intval);
1069 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1070 val ->intval = rk30_adc_battery_get_voltage(gBatteryData);
1071 DBG("gBatVoltage=%d\n",val->intval);
1073 // case POWER_SUPPLY_PROP_CURRENT_NOW:
1074 // val->intval = 1100;
1076 case POWER_SUPPLY_PROP_CAPACITY:
1077 if(battery_test_flag == 2)
1080 val->intval = rk30_adc_battery_get_capacity(gBatteryData);
1081 DBG("gBatCapacity=%d%%\n",val->intval);
1083 case POWER_SUPPLY_PROP_TECHNOLOGY:
1084 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
1086 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1087 val->intval = BATT_MAX_VOL_VALUE;
1089 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1090 val->intval = BATT_ZERO_VOL_VALUE;
1100 static enum power_supply_property rk30_adc_battery_props[] = {
1102 POWER_SUPPLY_PROP_STATUS,
1103 POWER_SUPPLY_PROP_HEALTH,
1104 POWER_SUPPLY_PROP_PRESENT,
1105 POWER_SUPPLY_PROP_VOLTAGE_NOW,
1106 // POWER_SUPPLY_PROP_CURRENT_NOW,
1107 POWER_SUPPLY_PROP_TECHNOLOGY,
1108 POWER_SUPPLY_PROP_CAPACITY,
1109 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1110 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1113 static struct power_supply rk30_battery_supply =
1116 .type = POWER_SUPPLY_TYPE_BATTERY,
1118 .get_property = rk30_adc_battery_get_property,
1120 .properties = rk30_adc_battery_props,
1121 .num_properties = ARRAY_SIZE(rk30_adc_battery_props),
1125 static void rk30_adc_battery_resume_check(void)
1129 int new_capacity, old_capacity;
1130 struct rk30_adc_battery_data *bat = gBatteryData;
1132 bat->old_charge_level = -1;
1133 pSamples = bat->adc_samples;
1135 adc_sync_read(bat->client); //start adc sample
1136 level = oldlevel = rk30_adc_battery_status_samples(bat);//init charge status
1138 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) { //0.3 s
1141 rk30_adc_battery_voltage_samples(bat); //get voltage
1142 level = rk30_adc_battery_status_samples(bat); //check charge status
1143 if (oldlevel != level){
1144 oldlevel = level; //if charge status changed, reset sample
1148 new_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1149 old_capacity =gBatteryData-> suspend_capacity;
1151 if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1153 bat->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1156 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; // aviod the value of capacity increase dicharge
1161 static int rk30_adc_battery_suspend(struct platform_device *dev, pm_message_t state)
1164 gBatteryData->suspend_capacity = gBatteryData->bat_capacity;
1165 cancel_delayed_work(&gBatteryData->delay_work);
1167 if( gBatteryData->pdata->batt_low_pin != INVALID_GPIO){
1169 irq = gpio_to_irq(gBatteryData->pdata->batt_low_pin);
1171 enable_irq_wake(irq);
1177 static int rk30_adc_battery_resume(struct platform_device *dev)
1180 gBatteryData->resume = true;
1181 queue_delayed_work(gBatteryData->wq, &gBatteryData->delay_work, msecs_to_jiffies(100));
1182 if( gBatteryData->pdata->batt_low_pin != INVALID_GPIO){
1184 irq = gpio_to_irq(gBatteryData->pdata->batt_low_pin);
1185 disable_irq_wake(irq);
1191 #define rk30_adc_battery_suspend NULL
1192 #define rk30_adc_battery_resume NULL
1196 unsigned long AdcTestCnt = 0;
1197 static void rk30_adc_battery_timer_work(struct work_struct *work)
1200 if (gBatteryData->resume) {
1201 rk30_adc_battery_resume_check();
1202 gBatteryData->resume = false;
1207 rk30_adc_battery_status_samples(gBatteryData);
1209 if (gBatteryData->poweron_check){
1210 gBatteryData->poweron_check = 0;
1211 rk30_adc_battery_poweron_capacity_check();
1214 rk30_adc_battery_voltage_samples(gBatteryData);
1215 rk30_adc_battery_capacity_samples(gBatteryData);
1217 if( 1 == rk30_adc_battery_get_charge_level(gBatteryData)){ // charge
1218 if(0 == gBatteryData->status_lock ){
1219 wake_lock(&batt_wake_lock); //lock
1220 gBatteryData->status_lock = 1;
1224 if(1 == gBatteryData->status_lock ){
1225 wake_unlock(&batt_wake_lock); //unlock
1226 gBatteryData->status_lock = 0;
1232 /*update battery parameter after adc and capacity has been changed*/
1233 if(gBatteryData->bat_change){
1234 gBatteryData->bat_change = 0;
1235 rk30_adc_battery_put_capacity(gBatteryData->bat_capacity);
1236 power_supply_changed(&rk30_battery_supply);
1239 if (rk30_battery_dbg_level){
1240 if (++AdcTestCnt >= 2)
1244 printk("Status = %d, RealAdcVal = %d, RealVol = %d,gBatVol = %d, gBatCap = %d, RealCapacity = %d, dischargecnt = %d, chargecnt = %d\n",
1245 gBatteryData->bat_status, gBatteryData->adc_val, adc_to_voltage(gBatteryData->adc_val),
1246 gBatteryData->bat_voltage, gBatteryData->bat_capacity, gBatteryData->capacitytmp, gBatteryData->gBatCapacityDisChargeCnt,gBatteryData-> gBatCapacityChargeCnt);
1250 queue_delayed_work(gBatteryData->wq, &gBatteryData->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1255 static int rk30_adc_battery_io_init(struct rk30_adc_battery_platform_data *pdata)
1259 if (pdata->io_init) {
1263 //charge control pin
1264 if (pdata->charge_set_pin != INVALID_GPIO){
1265 ret = gpio_request(pdata->charge_set_pin, NULL);
1267 printk("failed to request dc_det gpio\n");
1270 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
1273 //dc charge detect pin
1274 if (pdata->dc_det_pin != INVALID_GPIO){
1275 ret = gpio_request(pdata->dc_det_pin, NULL);
1277 printk("failed to request dc_det gpio\n");
1281 gpio_pull_updown(pdata->dc_det_pin, 0);//GPIOPullUp);//important
1282 ret = gpio_direction_input(pdata->dc_det_pin);
1284 printk("failed to set gpio dc_det input\n");
1290 if (pdata->charge_ok_pin != INVALID_GPIO){
1291 ret = gpio_request(pdata->charge_ok_pin, NULL);
1293 printk("failed to request charge_ok gpio\n");
1297 gpio_pull_updown(pdata->charge_ok_pin, GPIOPullUp);//important
1298 ret = gpio_direction_input(pdata->charge_ok_pin);
1300 printk("failed to set gpio charge_ok input\n");
1305 if( pdata->batt_low_pin != INVALID_GPIO){
1306 ret = gpio_request(pdata->batt_low_pin, NULL);
1308 printk("failed to request batt_low_pin gpio\n");
1312 gpio_pull_updown(pdata->batt_low_pin, GPIOPullUp);
1313 ret = gpio_direction_input(pdata->batt_low_pin);
1315 printk("failed to set gpio batt_low_pin input\n");
1325 //extern void kernel_power_off(void);
1326 static void rk30_adc_battery_check(struct rk30_adc_battery_data *bat)
1330 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1331 //printk("%s--%d:\n",__FUNCTION__,__LINE__);
1333 bat->old_charge_level = -1;
1334 bat->capacitytmp = 0;
1335 bat->suspend_capacity = 0;
1337 pSamples = bat->adc_samples;
1339 adc_sync_read(bat->client); //start adc sample
1340 level = oldlevel = rk30_adc_battery_status_samples(bat);//init charge status
1342 bat->full_times = 0;
1343 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){ //0.3 s
1345 rk30_adc_battery_voltage_samples(bat); //get voltage
1346 //level = rk30_adc_battery_status_samples(bat); //check charge status
1347 level = rk30_adc_battery_get_charge_level(bat);
1349 if (oldlevel != level){
1350 oldlevel = level; //if charge status changed, reset sample
1355 bat->bat_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage); //init bat_capacity
1358 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1359 if (rk30_adc_battery_get_charge_level(bat)){
1360 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1362 if (pdata->charge_ok_pin != INVALID_GPIO){
1363 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
1364 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1365 bat->bat_capacity = 100;
1373 rk30_adc_battery_poweron_capacity_check();
1375 gBatteryData->poweron_check = 1;
1377 // gBatteryData->poweron_check = 0;
1379 /*******************************************
1380 //¿ª»ú²ÉÑùµ½µÄµçѹºÍÉϴιػú±£´æµçѹÏà²î½Ï´ó£¬Ôõô´¦Àí£¿
1381 if (bat->bat_capacity > old_capacity)
1383 if ((bat->bat_capacity - old_capacity) > 20)
1388 else if (bat->bat_capacity < old_capacity)
1390 if ((old_capacity > bat->bat_capacity) > 20)
1395 *********************************************/
1396 if (bat->bat_capacity == 0) bat->bat_capacity = 1;
1400 if ((bat->bat_voltage <= batt_table[0].dis_charge_vol+ 50)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING)){
1406 static void rk30_adc_battery_callback(struct adc_client *client, void *param, int result)
1409 struct rk30_adc_battery_data *info = container_of(client, struct rk30_adc_battery_data,
1411 info->adc_val = result;
1414 pr_bat("adc_battery_callback resule < 0 , the value ");
1418 gBatteryData->adc_val = result;
1419 pr_bat("result = %d, gBatteryData->adc_val = %d\n", result, gBatteryData->adc_val );
1425 static void rk30_adc_battery_lowerpower_delaywork(struct work_struct *work)
1428 if( gBatteryData->pdata->batt_low_pin != INVALID_GPIO){
1429 irq = gpio_to_irq(gBatteryData->pdata->batt_low_pin);
1433 printk("lowerpower\n");
1434 rk28_send_wakeup_key(); // wake up the system
1439 static irqreturn_t rk30_adc_battery_low_wakeup(int irq,void *dev_id)
1441 queue_work(gBatteryData->wq, &gBatteryData->lowerpower_work);
1447 static int rk30_adc_battery_probe(struct platform_device *pdev)
1452 struct adc_client *client;
1453 struct rk30_adc_battery_data *data;
1454 struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1455 gSecondsCnt = get_seconds();
1456 data = kzalloc(sizeof(*data), GFP_KERNEL);
1459 goto err_data_alloc_failed;
1461 gBatteryData = data;
1463 platform_set_drvdata(pdev, data);
1465 data->pdata = pdata;
1466 data->status_lock = 0;
1467 ret = rk30_adc_battery_io_init(pdata);
1472 memset(data->adc_samples, 0, sizeof(int)*(NUM_VOLTAGE_SAMPLE + 2));
1474 //register adc for battery sample
1475 client = adc_register(0, rk30_adc_battery_callback, NULL); //pdata->adc_channel = ani0
1477 goto err_adc_register_failed;
1480 data->client = client;
1481 data->adc_val = adc_sync_read(client);
1483 ret = power_supply_register(&pdev->dev, &rk30_battery_supply);
1485 printk(KERN_INFO "fail to battery power_supply_register\n");
1486 goto err_battery_failed;
1489 ret = device_create_file(&pdev->dev,&dev_attr_batparam);
1492 printk(KERN_ERR "failed to create bat param file\n");
1493 goto err_battery_failed;
1497 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1498 ret = power_supply_register(&pdev->dev, &rk30_usb_supply);
1500 printk(KERN_INFO "fail to usb power_supply_register\n");
1501 goto err_usb_failed;
1504 wake_lock_init(&batt_wake_lock, WAKE_LOCK_SUSPEND, "batt_lock");
1506 data->wq = create_singlethread_workqueue("adc_battd");
1507 INIT_DELAYED_WORK(&data->delay_work, rk30_adc_battery_timer_work);
1508 //Power on Battery detect
1509 rk30_adc_battery_check(data);
1510 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS*10));
1512 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1513 ret = power_supply_register(&pdev->dev, &rk30_ac_supply);
1515 printk(KERN_INFO "fail to ac power_supply_register\n");
1518 //init dc dectet irq & delay work
1519 if (pdata->dc_det_pin != INVALID_GPIO){
1520 INIT_WORK(&data->dcwakeup_work, rk30_adc_battery_dcdet_delaywork);
1522 irq = gpio_to_irq(pdata->dc_det_pin);
1523 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1524 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);
1526 printk("failed to request dc det irq\n");
1527 goto err_dcirq_failed;
1529 enable_irq_wake(irq);
1535 // batt low irq lowerpower_work
1536 if( pdata->batt_low_pin != INVALID_GPIO){
1537 INIT_WORK(&data->lowerpower_work, rk30_adc_battery_lowerpower_delaywork);
1539 irq = gpio_to_irq(pdata->batt_low_pin);
1540 ret = request_irq(irq, rk30_adc_battery_low_wakeup, IRQF_TRIGGER_LOW, "batt_low_irq", NULL);
1543 printk("failed to request batt_low_irq irq\n");
1544 goto err_lowpowerirq_failed;
1552 ret = create_sysfs_interfaces(&pdev->dev);
1556 "device rk30_adc_batterry sysfs register failed\n");
1561 printk(KERN_INFO "rk30_adc_battery: driver initialized\n");
1565 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1567 power_supply_unregister(&rk30_usb_supply);
1571 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1572 power_supply_unregister(&rk30_ac_supply);
1576 power_supply_unregister(&rk30_battery_supply);
1579 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1581 err_lowpowerirq_failed:
1582 free_irq(gpio_to_irq(pdata->batt_low_pin), data);
1584 err_adc_register_failed:
1586 err_data_alloc_failed:
1589 printk("rk30_adc_battery: error!\n");
1594 static int rk30_adc_battery_remove(struct platform_device *pdev)
1596 struct rk30_adc_battery_data *data = platform_get_drvdata(pdev);
1597 struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1599 cancel_delayed_work(&gBatteryData->delay_work);
1600 #if defined(CONFIG_BATTERY_RK30_USB_CHARGE)
1601 power_supply_unregister(&rk30_usb_supply);
1603 #if defined(CONFIG_BATTERY_RK30_AC_CHARGE)
1604 power_supply_unregister(&rk30_ac_supply);
1606 power_supply_unregister(&rk30_battery_supply);
1608 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1615 static struct platform_driver rk30_adc_battery_driver = {
1616 .probe = rk30_adc_battery_probe,
1617 .remove = rk30_adc_battery_remove,
1618 .suspend = rk30_adc_battery_suspend,
1619 .resume = rk30_adc_battery_resume,
1621 .name = "rk30-battery",
1622 .owner = THIS_MODULE,
1626 static int __init rk30_adc_battery_init(void)
1628 return platform_driver_register(&rk30_adc_battery_driver);
1631 static void __exit rk30_adc_battery_exit(void)
1633 platform_driver_unregister(&rk30_adc_battery_driver);
1636 fs_initcall(rk30_adc_battery_init);//module_init(rk30_adc_battery_init);//subsys_initcall(rk30_adc_battery_init);
1637 module_exit(rk30_adc_battery_exit);
1639 MODULE_DESCRIPTION("Battery detect driver for the rk30");
1640 MODULE_AUTHOR("luowei lw@rock-chips.com");
1641 MODULE_LICENSE("GPL");