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);
48 /*******************ÒÔϲÎÊý¿ÉÒÔÐÞ¸Ä******************************/
49 #define TIMER_MS_COUNTS 1000 //¶¨Ê±Æ÷µÄ³¤¶Èms
50 //ÒÔϲÎÊýÐèÒª¸ù¾Ýʵ¼Ê²âÊÔµ÷Õû
51 #define SLOPE_SECOND_COUNTS 15 //ͳ¼ÆµçѹбÂʵÄʱ¼ä¼ä¸ôs
52 #define DISCHARGE_MIN_SECOND 45 //×î¿ì·Åµçµç1%ʱ¼ä
53 #define CHARGE_MIN_SECOND 45 //×î¿ì³äµçµç1%ʱ¼ä
54 #define CHARGE_MID_SECOND 90 //ÆÕͨ³äµçµç1%ʱ¼ä
55 #define CHARGE_MAX_SECOND 250 //×³äµçµç1%ʱ¼ä
56 #define CHARGE_FULL_DELAY_TIMES 10 //³äµçÂú¼ì²â·À¶¶Ê±¼ä
57 #define USBCHARGE_IDENTIFY_TIMES 5 //²åÈëUSB»ìÁ÷£¬pcʶ±ð¼ì²âʱ¼ä
59 #define NUM_VOLTAGE_SAMPLE ((SLOPE_SECOND_COUNTS * 1000) / TIMER_MS_COUNTS)
60 #define NUM_DISCHARGE_MIN_SAMPLE ((DISCHARGE_MIN_SECOND * 1000) / TIMER_MS_COUNTS)
61 #define NUM_CHARGE_MIN_SAMPLE ((CHARGE_MIN_SECOND * 1000) / TIMER_MS_COUNTS)
62 #define NUM_CHARGE_MID_SAMPLE ((CHARGE_MID_SECOND * 1000) / TIMER_MS_COUNTS)
63 #define NUM_CHARGE_MAX_SAMPLE ((CHARGE_MAX_SECOND * 1000) / TIMER_MS_COUNTS)
64 #define NUM_CHARGE_FULL_DELAY_TIMES ((CHARGE_FULL_DELAY_TIMES * 1000) / TIMER_MS_COUNTS) //³äµçÂú״̬³ÖÐøʱ¼ä³¤¶È
65 #define NUM_USBCHARGE_IDENTIFY_TIMES ((USBCHARGE_IDENTIFY_TIMES * 1000) / TIMER_MS_COUNTS) //³äµçÂú״̬³ÖÐøʱ¼ä³¤¶È
67 #define BAT_2V5_VALUE 2500
68 #define BATT_MAX_VOL_VALUE 8284 // 4180 //ÂúµçʱµÄµç³Øµçѹ
69 #define BATT_ZERO_VOL_VALUE 6800 // 3500 //¹Ø»úʱµÄµç³Øµçѹ
70 #define BATT_NOMAL_VOL_VALUE 7600 // 3800
72 //¶¨ÒåADC²ÉÑù·Öѹµç×裬ÒÔʵ¼ÊֵΪ׼£¬µ¥Î»K
73 #define BAT_PULL_UP_R 300 ////200
75 #define BAT_PULL_DOWN_R 100// 200
76 #define adc_to_voltage(adc_val) ((adc_val * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R))
78 #define BATT_FILENAME "/data/bat_last_capacity.dat"
80 static struct wake_lock batt_wake_lock;
89 #ifdef CONFIG_BATTERY_RK30_VOL3V8
91 static struct batt_vol_cal batt_table[BATT_NUM] = {
92 {0,3400,3520},{1,3420,3525},{2,3420,3575},{3,3475,3600},{5,3505,3620},{7,3525,3644},
93 {9,3540,3662},{11,3557,3670},{13,3570,3684},{15,3580,3700},{17,3610,3715},
94 {19,3630,3720},{21,3640,3748},{23,3652,3756},{25,3662,3775},{27,3672,3790},
95 {29,3680,3810},{31,3687,3814},{33,3693,3818},{35,3699,3822},{37,3705,3825},
96 {39,3710,3830},{41,3714,3832},{43,3718,3834},{45,3722,3836},{47,3726,3837},
97 {49,3730,3839},{51,3734,3841},{53,3738,3842},{55,3742,3844},{57,3746,3844},
98 {59,3750,3855},{61,3756,3860},{63,3764,3864},{65,3774,3871},{67,3786,3890},
99 {69,3800,3910},{71,3808,3930},{73,3817,3977},{75,3827,3977},{77,3845,3997},
100 {79,3950,4030},{81,3964,4047},{83,3982,4064},{85,4002,4080},{87,4026,4096},
101 {89,4030,4132},{91,4034,4144},{93,4055,4150},{95,4085,4195},{97,4085,4195},{100,4120,4200},
103 /*******************************************************************************/
106 static struct batt_vol_cal batt_table[BATT_NUM] = {
107 {0,6800,7400}, {1,6840,7440}, {2,6880,7480}, {3,6950,7450}, {5,7010,7510}, {7,7050,7550},
108 {9,7080,7580}, {11,7104,7604}, {13,7140,7640}, {15,7160,7660}, {17,7220,7720},
109 {19,7260,7760}, {21,7280,7780}, {23,7304,7802}, {25,7324,7824}, {27,7344,7844},
110 {29,7360,7860}, {31,7374,7874}, {33,7386,7886}, {35,7398,7898}, {37,7410,7910},//500
111 {39,7420,7920}, {41,7424,7928}, {43,7436,7947}, {45,7444,7944}, {47,7450,7958}, //508
112 {49,7460,7965}, {51,7468,7975}, {53, 7476,7990}, {55,7482,8000}, {57,7492,8005}, // 5 14
113 {59,7500,8011}, {61,7510,8033}, {63,7528,8044}, {65,7548,8055}, {67,7560,8066},//506
114 {69,7600,8070}, {71,7618,8075}, {73,7634,8080}, {75,7654,8085}, {77,7690,8100}, //400
115 {79,7900,8180}, {81,7920,8210}, {83,7964,8211}, {85,8000,8214}, {87,8002,8218},//290
116 {89,8012, 8220}, {91,8022,8235}, {93,8110,8260}, {95,8140,8290}, {97,8170,8300}, {100,8200 ,8310},//110
120 /********************************************************************************/
122 extern int dwc_vbus_status(void);
123 extern int get_msc_connect_flag(void);
125 struct rk30_adc_battery_data {
128 //struct timer_list timer;
129 struct workqueue_struct *wq;
130 struct delayed_work delay_work;
131 struct work_struct dcwakeup_work;
132 struct work_struct lowerpower_work;
135 struct rk30_adc_battery_platform_data *pdata;
139 struct adc_client *client;
141 int adc_samples[NUM_VOLTAGE_SAMPLE+2];
151 int old_charge_level;
153 int gBatCapacityDisChargeCnt;
154 int gBatCapacityChargeCnt;
157 int suspend_capacity;
160 static struct rk30_adc_battery_data *gBatteryData;
166 BATTERY_CAPACITY = 3,
167 BATTERY_AC_ONLINE = 4,
168 BATTERY_STATUS_CHANGED = 5,
169 AC_STATUS_CHANGED = 6,
170 BATTERY_INT_STATUS = 7,
171 BATTERY_INT_ENABLE = 8,
184 static int rk30_adc_battery_load_capacity(void)
187 int* p = (int *)value;
188 long fd = sys_open(BATT_FILENAME,O_RDONLY,0);
191 printk("rk30_adc_battery_load_capacity: open file /data/bat_last_capacity.dat failed\n");
195 sys_read(fd,(char __user *)value,4);
201 static void rk30_adc_battery_put_capacity(int loadcapacity)
204 int* p = (int *)value;
205 long fd = sys_open(BATT_FILENAME,O_CREAT | O_RDWR,0);
208 printk("rk30_adc_battery_put_capacity: open file /data/bat_last_capacity.dat failed\n");
213 sys_write(fd, (const char __user *)value, 4);
218 static void rk30_adc_battery_charge_enable(struct rk30_adc_battery_data *bat)
220 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
222 if (pdata->charge_set_pin != INVALID_GPIO){
223 gpio_direction_output(pdata->charge_set_pin, pdata->charge_set_level);
227 static void rk30_adc_battery_charge_disable(struct rk30_adc_battery_data *bat)
229 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
231 if (pdata->charge_set_pin != INVALID_GPIO){
232 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
236 //extern int suspend_flag;
237 static int rk30_adc_battery_get_charge_level(struct rk30_adc_battery_data *bat)
240 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
242 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
243 if (pdata->dc_det_pin != INVALID_GPIO){
244 if (gpio_get_value (pdata->dc_det_pin) == pdata->dc_det_level){
250 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
254 if (1 == dwc_vbus_status()) { //¼ì²âµ½USB²åÈ룬µ«ÊÇÎÞ·¨Ê¶±ðÊÇ·ñÊdzäµçÆ÷
255 //ͨ¹ýÑÓʱ¼ì²âPCʶ±ð±êÖ¾£¬Èç¹û³¬Ê±¼ì²â²»µ½£¬ËµÃ÷Êdzäµç
256 if (0 == get_msc_connect_flag()){ //²åÈë³äµçÆ÷ʱ¼ä´óÓÚÒ»¶¨Ê±¼äÖ®ºó£¬¿ªÊ¼½øÈë³äµç״̬
257 if (++gBatUsbChargeCnt >= NUM_USBCHARGE_IDENTIFY_TIMES){
258 gBatUsbChargeCnt = NUM_USBCHARGE_IDENTIFY_TIMES + 1;
261 } //·ñÔò£¬²»½øÈë³äµçģʽ
264 gBatUsbChargeCnt = 0;
265 if (2 == dwc_vbus_status()) {
274 //int old_charge_level;
275 static int rk30_adc_battery_status_samples(struct rk30_adc_battery_data *bat)
279 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
281 charge_level = rk30_adc_battery_get_charge_level(bat);
283 //¼ì²â³äµç״̬±ä»¯Çé¿ö
284 if (charge_level != bat->old_charge_level){
285 bat->old_charge_level = charge_level;
289 rk30_adc_battery_charge_enable(bat);
292 rk30_adc_battery_charge_disable(bat);
294 bat->bat_status_cnt = 0; //״̬±ä»¯¿ªÊ¼¼ÆÊý
297 if(charge_level == 0){
300 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
304 if (pdata->charge_ok_pin == INVALID_GPIO){ //no charge_ok_pin
306 if (bat->bat_capacity == 100){
307 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
308 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
313 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
316 else{ // pin of charge_ok_pin
317 if (gpio_get_value(pdata->charge_ok_pin) != pdata->charge_ok_level){
320 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
323 //¼ì²âµ½³äµçÂúµçƽ±êÖ¾
326 if (bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) {
327 bat->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
330 if ((bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) && (bat->bat_capacity >= 99)){
331 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
332 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
333 bat->bat_capacity = 100;
338 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
347 static int *pSamples;
348 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
351 int i,*pStart = bat->adc_samples, num = 0;
352 int level = rk30_adc_battery_get_charge_level(bat);
355 value = bat->adc_val;
356 adc_async_read(bat->client);
358 *pSamples++ = adc_to_voltage(value);
360 bat->bat_status_cnt++;
361 if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE) bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
363 num = pSamples - pStart;
365 if (num >= NUM_VOLTAGE_SAMPLE){
367 num = NUM_VOLTAGE_SAMPLE;
372 for (i = 0; i < num; i++){
373 value += bat->adc_samples[i];
375 bat->bat_voltage = value / num;
379 if(bat->bat_voltage >= batt_table[BATT_NUM-1].charge_vol+ 10)
380 bat->bat_voltage = batt_table[BATT_NUM-1].charge_vol + 10;
381 else if(bat->bat_voltage <= batt_table[0].charge_vol - 10)
382 bat->bat_voltage = batt_table[0].charge_vol - 10;
385 if(bat->bat_voltage >= batt_table[BATT_NUM-1].dis_charge_vol+ 10)
386 bat->bat_voltage = batt_table[BATT_NUM-1].dis_charge_vol + 10;
387 else if(bat->bat_voltage <= batt_table[0].dis_charge_vol - 10)
388 bat->bat_voltage = batt_table[0].dis_charge_vol - 10;
392 static int rk30_adc_battery_voltage_to_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
397 struct batt_vol_cal *p;
400 if (rk30_adc_battery_get_charge_level(bat)){ //charge
401 if(BatVoltage >= (p[BATT_NUM - 1].charge_vol)){
405 if(BatVoltage <= (p[0].charge_vol)){
409 for(i = 0; i < BATT_NUM - 1; i++){
411 if(((p[i].charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].charge_vol))){
412 capacity = p[i].disp_cal ;
421 if(BatVoltage >= (p[BATT_NUM - 1].dis_charge_vol)){
425 if(BatVoltage <= (p[0].dis_charge_vol)){
429 for(i = 0; i < BATT_NUM - 1; i++){
430 if(((p[i].dis_charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].dis_charge_vol))){
431 capacity = p[i].disp_cal ;
444 static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat)
447 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
449 //³ä·Åµç״̬±ä»¯ºó£¬BufferÌîÂú֮ǰ£¬²»¸üÐÂ
450 if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE) {
451 bat->gBatCapacityDisChargeCnt = 0;
452 bat->gBatCapacityChargeCnt = 0;
456 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
458 if (rk30_adc_battery_get_charge_level(bat)){
459 if (capacity > bat->bat_capacity){
460 //ʵ¼Ê²ÉÑùµ½µÄÈÝÁ¿±ÈÏÔʾµÄÈÝÁ¿´ó£¬Öð¼¶ÉÏÉý
461 if (++(bat->gBatCapacityDisChargeCnt) >= NUM_CHARGE_MIN_SAMPLE){
462 bat->gBatCapacityDisChargeCnt = 0;
463 if (bat->bat_capacity < 99){
468 bat->gBatCapacityChargeCnt = 0;
470 else{ // ʵ¼ÊµÄÈÝÁ¿±È²ÉÑù±È ÏÔʾµÄÈÝÁ¿Ð¡
471 bat->gBatCapacityDisChargeCnt = 0;
472 (bat->gBatCapacityChargeCnt)++;
474 if (pdata->charge_ok_pin != INVALID_GPIO){
475 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
476 //¼ì²âµ½µç³Ø³äÂú±êÖ¾£¬Í¬Ê±³¤Ê±¼äÄÚ³äµçµçѹÎޱ仯£¬¿ªÊ¼Æô¶¯¼Æʱ³äµç£¬¿ìËÙÉÏÉýÈÝÁ¿
477 if (bat->gBatCapacityChargeCnt >= NUM_CHARGE_MIN_SAMPLE){
478 bat->gBatCapacityChargeCnt = 0;
479 if (bat->bat_capacity < 99){
487 if (capacity > capacitytmp){
488 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
489 gBatCapacityChargeCnt = 0;
491 else if (/*bat->bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
492 gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
494 if (bat->bat_capacity < 99){
500 #else // ·ÀÖ¹µç³ØÀÏ»¯ºó³öÏֳ岻ÂúµÄÇé¿ö£¬
501 if (capacity > bat->capacitytmp){
502 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
503 bat->gBatCapacityChargeCnt = 0;
507 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
508 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
510 if (bat->bat_capacity < 99){
521 //ûÓгäµçÂú¼ì²â½Å£¬³¤Ê±¼äÄÚµçѹÎޱ仯£¬¶¨Ê±Æ÷Ä£Äâ³äµç
522 if (capacity > bat->capacitytmp){
523 //¹ý³ÌÖÐÈç¹ûµçѹÓÐÔö³¤£¬¶¨Ê±Æ÷¸´Î»£¬·ÀÖ¹¶¨Ê±Æ÷Ä£Äâ³äµç±Èʵ¼Ê³äµç¿ì
524 bat->gBatCapacityChargeCnt = 0;
528 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
529 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
531 if (bat->bat_capacity < 99){
543 //·Åµçʱ,Ö»ÔÊÐíµçѹϽµ
544 if (capacity < bat->bat_capacity){
545 if (++(bat->gBatCapacityDisChargeCnt) >= NUM_DISCHARGE_MIN_SAMPLE){
546 bat->gBatCapacityDisChargeCnt = 0;
547 if (bat->bat_capacity > 0){
548 bat->bat_capacity-- ;
554 bat->gBatCapacityDisChargeCnt = 0;
556 bat->gBatCapacityChargeCnt = 0;
558 bat->capacitytmp = capacity;
561 //static int poweron_check = 0;
562 static void rk30_adc_battery_poweron_capacity_check(void)
565 int new_capacity, old_capacity;
567 new_capacity = gBatteryData->bat_capacity;
568 old_capacity = rk30_adc_battery_load_capacity();
569 if ((old_capacity <= 0) || (old_capacity >= 100)){
570 old_capacity = new_capacity;
573 if (gBatteryData->bat_status == POWER_SUPPLY_STATUS_FULL){
574 if (new_capacity > 80){
575 gBatteryData->bat_capacity = 100;
578 else if (gBatteryData->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
581 // //1£©³¤Ê±¼ä¹Ø»ú·ÅÖú󣬿ª»úºó¶ÁÈ¡µÄÈÝÁ¿Ô¶Ô¶´óÓÚʵ¼ÊÈÝÁ¿Ôõô°ì£¿
582 // //2£©Èç¹û²»ÕâÑù×ö£¬¶Ìʱ¼ä¹Ø»úÔÙ¿ª»ú£¬Ç°ºóÈÝÁ¿²»Ò»ÖÂÓÖ¸ÃÔõô°ì£¿
583 // //3£©Ò»ÏÂÄÇÖÖ·½Ê½ºÏÊÊ£¿
584 //gBatteryData->bat_capacity = new_capacity;
585 gBatteryData->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
588 if(new_capacity > old_capacity + 50 )
589 gBatteryData->bat_capacity = new_capacity;
591 gBatteryData->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; //avoid the value of capacity increase
595 //printk("capacity = %d, new_capacity = %d, old_capacity = %d\n",gBatteryData->bat_capacity, new_capacity, old_capacity);
597 gBatteryData->bat_change = 1;
600 static void rk30_adc_battery_scan_timer(unsigned long data)
602 gBatteryData->timer.expires = jiffies + msecs_to_jiffies(TIMER_MS_COUNTS);
603 add_timer(&gBatteryData->timer);
605 schedule_work(&gBatteryData->timer_work);
609 #if defined(CONFIG_BATTERY_RK30_USB_CHARGE)
610 static int rk30_adc_battery_get_usb_property(struct power_supply *psy,
611 enum power_supply_property psp,
612 union power_supply_propval *val)
614 charger_type_t charger;
615 charger = CHARGER_USB;
618 case POWER_SUPPLY_PROP_ONLINE:
619 if (psy->type == POWER_SUPPLY_TYPE_USB)
620 val->intval = get_msc_connect_flag();
621 printk("%s:%d\n",__FUNCTION__,val->intval);
632 static enum power_supply_property rk30_adc_battery_usb_props[] = {
634 POWER_SUPPLY_PROP_ONLINE,
637 static struct power_supply rk30_usb_supply =
640 .type = POWER_SUPPLY_TYPE_USB,
642 .get_property = rk30_adc_battery_get_usb_property,
644 .properties = rk30_adc_battery_usb_props,
645 .num_properties = ARRAY_SIZE(rk30_adc_battery_usb_props),
649 #if defined(CONFIG_BATTERY_RK30_AC_CHARGE)
650 static irqreturn_t rk30_adc_battery_dc_wakeup(int irq, void *dev_id)
652 queue_work(gBatteryData->wq, &gBatteryData->dcwakeup_work);
657 static int rk30_adc_battery_get_ac_property(struct power_supply *psy,
658 enum power_supply_property psp,
659 union power_supply_propval *val)
662 charger_type_t charger;
663 charger = CHARGER_USB;
665 case POWER_SUPPLY_PROP_ONLINE:
666 if (psy->type == POWER_SUPPLY_TYPE_MAINS)
668 // printk("POWER_SUPPLY_TYPE_MAINS\n");
669 if (rk30_adc_battery_get_charge_level(gBatteryData))
678 DBG("%s:%d\n",__FUNCTION__,val->intval);
689 static enum power_supply_property rk30_adc_battery_ac_props[] =
691 POWER_SUPPLY_PROP_ONLINE,
694 static struct power_supply rk30_ac_supply =
697 .type = POWER_SUPPLY_TYPE_MAINS,
699 .get_property = rk30_adc_battery_get_ac_property,
701 .properties = rk30_adc_battery_ac_props,
702 .num_properties = ARRAY_SIZE(rk30_adc_battery_ac_props),
705 static void rk30_adc_battery_dcdet_delaywork(struct work_struct *work)
708 struct rk30_adc_battery_platform_data *pdata;
711 //printk("DC_WAKEUP\n");
712 pdata = gBatteryData->pdata;
713 irq = gpio_to_irq(pdata->dc_det_pin);
714 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
716 rk28_send_wakeup_key(); // wake up the system
719 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);// reinitialize the DC irq
724 power_supply_changed(&rk30_ac_supply);
726 gBatteryData->bat_status_cnt = 0; //the state of battery is change
728 wake_lock_timeout(&batt_wake_lock, 30 * HZ);
735 static int rk30_adc_battery_get_status(struct rk30_adc_battery_data *bat)
737 return (bat->bat_status);
740 static int rk30_adc_battery_get_health(struct rk30_adc_battery_data *bat)
742 return POWER_SUPPLY_HEALTH_GOOD;
745 static int rk30_adc_battery_get_present(struct rk30_adc_battery_data *bat)
747 return (bat->bat_voltage < BATT_MAX_VOL_VALUE) ? 0 : 1;
750 static int rk30_adc_battery_get_voltage(struct rk30_adc_battery_data *bat)
752 return (bat->bat_voltage );
755 static int rk30_adc_battery_get_capacity(struct rk30_adc_battery_data *bat)
757 return (bat->bat_capacity);
760 static int rk30_adc_battery_get_property(struct power_supply *psy,
761 enum power_supply_property psp,
762 union power_supply_propval *val)
767 case POWER_SUPPLY_PROP_STATUS:
768 val->intval = rk30_adc_battery_get_status(gBatteryData);
769 DBG("gBatStatus=%d\n",val->intval);
771 case POWER_SUPPLY_PROP_HEALTH:
772 val->intval = rk30_adc_battery_get_health(gBatteryData);
773 DBG("gBatHealth=%d\n",val->intval);
775 case POWER_SUPPLY_PROP_PRESENT:
776 val->intval = rk30_adc_battery_get_present(gBatteryData);
777 DBG("gBatPresent=%d\n",val->intval);
779 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
780 val ->intval = rk30_adc_battery_get_voltage(gBatteryData);
781 DBG("gBatVoltage=%d\n",val->intval);
783 // case POWER_SUPPLY_PROP_CURRENT_NOW:
784 // val->intval = 1100;
786 case POWER_SUPPLY_PROP_CAPACITY:
787 val->intval = rk30_adc_battery_get_capacity(gBatteryData);
788 DBG("gBatCapacity=%d%%\n",val->intval);
790 case POWER_SUPPLY_PROP_TECHNOLOGY:
791 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
793 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
794 val->intval = BATT_MAX_VOL_VALUE;
796 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
797 val->intval = BATT_ZERO_VOL_VALUE;
807 static enum power_supply_property rk30_adc_battery_props[] = {
809 POWER_SUPPLY_PROP_STATUS,
810 POWER_SUPPLY_PROP_HEALTH,
811 POWER_SUPPLY_PROP_PRESENT,
812 POWER_SUPPLY_PROP_VOLTAGE_NOW,
813 // POWER_SUPPLY_PROP_CURRENT_NOW,
814 POWER_SUPPLY_PROP_TECHNOLOGY,
815 POWER_SUPPLY_PROP_CAPACITY,
816 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
817 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
820 static struct power_supply rk30_battery_supply =
823 .type = POWER_SUPPLY_TYPE_BATTERY,
825 .get_property = rk30_adc_battery_get_property,
827 .properties = rk30_adc_battery_props,
828 .num_properties = ARRAY_SIZE(rk30_adc_battery_props),
832 //int suspend_capacity = 0;
833 static void rk30_adc_battery_resume_check(void)
837 int new_capacity, old_capacity;
838 struct rk30_adc_battery_data *bat = gBatteryData;
840 bat->old_charge_level = -1;
841 pSamples = bat->adc_samples;
843 adc_sync_read(bat->client); //start adc sample
844 level = oldlevel = rk30_adc_battery_status_samples(bat);//init charge status
846 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) { //0.3 s
849 rk30_adc_battery_voltage_samples(bat); //get voltage
850 level = rk30_adc_battery_status_samples(bat); //check charge status
851 if (oldlevel != level){
852 oldlevel = level; //if charge status changed, reset sample
856 new_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
857 old_capacity =gBatteryData-> suspend_capacity;
859 if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
861 bat->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
864 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; // aviod the value of capacity increase dicharge
867 //printk("rk30_adc_battery_resume: status = %d, voltage = %d, capacity = %d, new_capacity = %d, old_capacity = %d\n",
868 // bat->bat_status, bat->bat_voltage, bat->bat_capacity, new_capacity, old_capacity);
870 // wake_lock_timeout(&batt_wake_lock, 5 * HZ); //5s
873 static int rk30_adc_battery_suspend(struct platform_device *dev, pm_message_t state)
875 gBatteryData->suspend_capacity = gBatteryData->bat_capacity;
879 static int rk30_adc_battery_resume(struct platform_device *dev)
881 gBatteryData->resume = true;
885 #define rk30_adc_battery_suspend NULL
886 #define rk30_adc_battery_resume NULL
890 unsigned long AdcTestCnt = 0;
891 static void rk30_adc_battery_timer_work(struct work_struct *work)
894 if (gBatteryData->resume) {
895 rk30_adc_battery_resume_check();
896 gBatteryData->resume = false;
900 rk30_adc_battery_status_samples(gBatteryData);
902 if (gBatteryData->poweron_check){
903 gBatteryData->poweron_check = 0;
904 rk30_adc_battery_poweron_capacity_check();
907 rk30_adc_battery_voltage_samples(gBatteryData);
909 rk30_adc_battery_capacity_samples(gBatteryData);
912 /*update battery parameter after adc and capacity has been changed*/
913 if(gBatteryData->bat_change){
914 gBatteryData->bat_change = 0;
915 rk30_adc_battery_put_capacity(gBatteryData->bat_capacity);
916 power_supply_changed(&rk30_battery_supply);
919 if (rk30_battery_dbg_level){
920 if (++AdcTestCnt >= 2)
924 printk("Status = %d, RealAdcVal = %d, RealVol = %d,gBatVol = %d, gBatCap = %d, RealCapacity = %d, dischargecnt = %d, chargecnt = %d\n",
925 gBatteryData->bat_status, gBatteryData->adc_val, adc_to_voltage(gBatteryData->adc_val),
926 gBatteryData->bat_voltage, gBatteryData->bat_capacity, gBatteryData->capacitytmp, gBatteryData->gBatCapacityDisChargeCnt,gBatteryData-> gBatCapacityChargeCnt);
930 queue_delayed_work(gBatteryData->wq, &gBatteryData->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
935 static int rk30_adc_battery_io_init(struct rk30_adc_battery_platform_data *pdata)
939 if (pdata->io_init) {
944 if (pdata->charge_set_pin != INVALID_GPIO){
945 ret = gpio_request(pdata->charge_set_pin, NULL);
947 printk("failed to request dc_det gpio\n");
950 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
953 //dc charge detect pin
954 if (pdata->dc_det_pin != INVALID_GPIO){
955 ret = gpio_request(pdata->dc_det_pin, NULL);
957 printk("failed to request dc_det gpio\n");
961 gpio_pull_updown(pdata->dc_det_pin, GPIOPullUp);//important
962 ret = gpio_direction_input(pdata->dc_det_pin);
964 printk("failed to set gpio dc_det input\n");
970 if (pdata->charge_ok_pin != INVALID_GPIO){
971 ret = gpio_request(pdata->charge_ok_pin, NULL);
973 printk("failed to request charge_ok gpio\n");
977 gpio_pull_updown(pdata->charge_ok_pin, GPIOPullUp);//important
978 ret = gpio_direction_input(pdata->charge_ok_pin);
980 printk("failed to set gpio charge_ok input\n");
985 if( pdata->batt_low_pin != INVALID_GPIO){
986 ret = gpio_request(pdata->batt_low_pin, NULL);
988 printk("failed to request batt_low_pin gpio\n");
992 gpio_pull_updown(pdata->batt_low_pin, GPIOPullUp);
993 ret = gpio_direction_input(pdata->batt_low_pin);
995 printk("failed to set gpio batt_low_pin input\n");
1005 //extern void kernel_power_off(void);
1006 static void rk30_adc_battery_check(struct rk30_adc_battery_data *bat)
1010 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1011 //printk("%s--%d:\n",__FUNCTION__,__LINE__);
1013 bat->old_charge_level = -1;
1014 bat->capacitytmp = 0;
1015 bat->suspend_capacity = 0;
1017 pSamples = bat->adc_samples;
1019 adc_sync_read(bat->client); //start adc sample
1020 level = oldlevel = rk30_adc_battery_status_samples(bat);//init charge status
1022 bat->full_times = 0;
1023 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){ //0.3 s
1025 rk30_adc_battery_voltage_samples(bat); //get voltage
1026 //level = rk30_adc_battery_status_samples(bat); //check charge status
1027 level = rk30_adc_battery_get_charge_level(bat);
1029 if (oldlevel != level){
1030 oldlevel = level; //if charge status changed, reset sample
1035 bat->bat_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage); //init bat_capacity
1037 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1038 if (rk30_adc_battery_get_charge_level(bat)){
1039 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1041 if (pdata->charge_ok_pin != INVALID_GPIO){
1042 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
1043 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1044 bat->bat_capacity = 100;
1050 rk30_adc_battery_poweron_capacity_check();
1052 gBatteryData->poweron_check = 1;
1054 gBatteryData->poweron_check = 0;
1056 /*******************************************
1057 //¿ª»ú²ÉÑùµ½µÄµçѹºÍÉϴιػú±£´æµçѹÏà²î½Ï´ó£¬Ôõô´¦Àí£¿
1058 if (bat->bat_capacity > old_capacity)
1060 if ((bat->bat_capacity - old_capacity) > 20)
1065 else if (bat->bat_capacity < old_capacity)
1067 if ((old_capacity > bat->bat_capacity) > 20)
1072 *********************************************/
1073 if (bat->bat_capacity == 0) bat->bat_capacity = 1;
1076 //printk("bat->bat_voltage =%d=bat->bat_status = %d \n",bat->bat_voltage,bat->bat_status );
1078 if ((bat->bat_voltage <= batt_table[0].dis_charge_vol+ 50)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING)){
1084 static void rk30_adc_battery_callback(struct adc_client *client, void *param, int result)
1087 struct rk30_adc_battery_data *info = container_of(client, struct rk30_adc_battery_data,
1089 info->adc_val = result;
1091 gBatteryData->adc_val = result;
1096 static void rk30_adc_battery_lowerpower_delaywork(struct work_struct *work)
1098 struct rk30_adc_battery_platform_data *pdata;
1100 printk("lowerpower\n");
1101 pdata = gBatteryData->pdata;
1102 irq = gpio_to_irq(pdata->dc_det_pin);
1103 rk28_send_wakeup_key(); // wake up the system
1104 free_irq(irq, NULL);
1109 static irqreturn_t rk30_adc_battery_low_wakeup(int irq,void *dev_id)
1112 schedule_work(&gBatteryData->lowerpower_work);
1118 static int rk30_adc_battery_probe(struct platform_device *pdev)
1123 struct adc_client *client;
1124 struct rk30_adc_battery_data *data;
1125 struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1127 //printk("%s--%d:\n",__FUNCTION__,__LINE__);
1129 data = kzalloc(sizeof(*data), GFP_KERNEL);
1132 goto err_data_alloc_failed;
1134 gBatteryData = data;
1136 platform_set_drvdata(pdev, data);
1138 data->pdata = pdata;
1140 ret = rk30_adc_battery_io_init(pdata);
1145 memset(data->adc_samples, 0, sizeof(int)*(NUM_VOLTAGE_SAMPLE + 2));
1147 //register adc for battery sample
1148 client = adc_register(0, rk30_adc_battery_callback, NULL); //pdata->adc_channel = ani0
1150 goto err_adc_register_failed;
1153 data->client = client;
1154 data->adc_val = adc_sync_read(client);
1156 ret = power_supply_register(&pdev->dev, &rk30_battery_supply);
1158 printk(KERN_INFO "fail to battery power_supply_register\n");
1159 goto err_battery_failed;
1163 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1164 ret = power_supply_register(&pdev->dev, &rk30_usb_supply);
1166 printk(KERN_INFO "fail to usb power_supply_register\n");
1167 goto err_usb_failed;
1170 wake_lock_init(&batt_wake_lock, WAKE_LOCK_SUSPEND, "batt_lock");
1172 data->wq = create_singlethread_workqueue("adc_battd");
1173 INIT_DELAYED_WORK(&data->delay_work, rk30_adc_battery_timer_work);
1174 //Power on Battery detect
1175 rk30_adc_battery_check(data);
1176 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1178 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1179 ret = power_supply_register(&pdev->dev, &rk30_ac_supply);
1181 printk(KERN_INFO "fail to ac power_supply_register\n");
1184 //init dc dectet irq & delay work
1185 if (pdata->dc_det_pin != INVALID_GPIO){
1186 INIT_WORK(&data->dcwakeup_work, rk30_adc_battery_dcdet_delaywork);
1188 irq = gpio_to_irq(pdata->dc_det_pin);
1189 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1190 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);
1192 printk("failed to request dc det irq\n");
1193 goto err_dcirq_failed;
1195 enable_irq_wake(irq);
1200 // batt low irq lowerpower_work
1201 if( pdata->batt_low_pin != INVALID_GPIO){
1202 INIT_WORK(&data->lowerpower_work, rk30_adc_battery_lowerpower_delaywork);
1204 irq = gpio_to_irq(pdata->batt_low_pin);
1205 ret = request_irq(irq, rk30_adc_battery_low_wakeup, IRQF_TRIGGER_LOW, "batt_low_irq", NULL);
1208 printk("failed to request batt_low_irq irq\n");
1209 goto err_lowpowerirq_failed;
1211 enable_irq_wake(irq);
1215 printk(KERN_INFO "rk30_adc_battery: driver initialized\n");
1219 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1221 power_supply_unregister(&rk30_usb_supply);
1225 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
1226 power_supply_unregister(&rk30_ac_supply);
1230 power_supply_unregister(&rk30_battery_supply);
1233 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1235 err_lowpowerirq_failed:
1236 free_irq(gpio_to_irq(pdata->batt_low_pin), data);
1238 err_adc_register_failed:
1240 err_data_alloc_failed:
1243 printk("rk30_adc_battery: error!\n");
1248 static int rk30_adc_battery_remove(struct platform_device *pdev)
1250 struct rk30_adc_battery_data *data = platform_get_drvdata(pdev);
1251 struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
1253 cancel_delayed_work(&gBatteryData->delay_work);
1254 #if defined(CONFIG_BATTERY_RK30_USB_CHARGE)
1255 power_supply_unregister(&rk30_usb_supply);
1257 #if defined(CONFIG_BATTERY_RK30_AC_CHARGE)
1258 power_supply_unregister(&rk30_ac_supply);
1260 power_supply_unregister(&rk30_battery_supply);
1262 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
1269 static struct platform_driver rk30_adc_battery_driver = {
1270 .probe = rk30_adc_battery_probe,
1271 .remove = rk30_adc_battery_remove,
1272 .suspend = rk30_adc_battery_suspend,
1273 .resume = rk30_adc_battery_resume,
1275 .name = "rk30-battery",
1276 .owner = THIS_MODULE,
1280 static int __init rk30_adc_battery_init(void)
1282 return platform_driver_register(&rk30_adc_battery_driver);
1285 static void __exit rk30_adc_battery_exit(void)
1287 platform_driver_unregister(&rk30_adc_battery_driver);
1290 subsys_initcall(rk30_adc_battery_init);//subsys_initcall(rk30_adc_battery_init);
1291 module_exit(rk30_adc_battery_exit);
1293 MODULE_DESCRIPTION("Battery detect driver for the rk30");
1294 MODULE_AUTHOR("luowei lw@rock-chips.com");
1295 MODULE_LICENSE("GPL");