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>
39 #include <linux/string.h>
40 #include <linux/init.h>
41 #include <linux/earlysuspend.h>
42 #include <linux/suspend.h>
43 #ifdef CONFIG_EARLYSUSPEND
44 /* kernel/power/earlysuspend.c */
45 extern suspend_state_t get_suspend_state(void);
48 static int rk30_battery_dbg_level = 0;
49 module_param_named(dbg_level, rk30_battery_dbg_level, int, 0644);
50 #define DBG( args...) \
52 if (rk30_battery_dbg_level) { \
57 #define TIMER_MS_COUNTS 1000
58 #define SLOPE_SECOND_COUNTS 15
59 #define DISCHARGE_MIN_SECOND 60
60 #define CHARGE_MIN_SECOND 45
61 #define CHARGE_MID_SECOND 90
62 #define CHARGE_MAX_SECOND 250
63 #define CHARGE_FULL_DELAY_TIMES 10
64 #define USBCHARGE_IDENTIFY_TIMES 2
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 #define CHARGE_IS_OK 1
75 #define INVALID_CHARGE_CHECK -1
77 #if defined(CONFIG_ARCH_RK3066B)
78 #define BAT_DEFINE_VALUE 1800
79 #elif defined(CONFIG_ARCH_RK2928)
80 #define BAT_DEFINE_VALUE 3300
82 #define BAT_DEFINE_VALUE 2500
86 #define BATT_FILENAME "/data/bat_last_capacity.dat"
92 int battery_dbg_level = 0;
93 int battery_test_flag = 0;
94 int gVoltageCnt = 3400;
95 int gDoubleVoltageCnt = 6800;
96 unsigned long gSecondsCnt = 0;
97 char gDischargeFlag[4] = {"on "};
100 #ifdef CONFIG_BATTERY_RK30_VOL3V8
101 #define BATT_MAX_VOL_VALUE 4120 //Full charge volate
102 #define BATT_ZERO_VOL_VALUE 3600//3500 //power down voltage
103 #define BATT_NOMAL_VOL_VALUE 3800
105 static int batt_table[2*BATT_NUM+6] =
107 0x4B434F52,0x7461625F,0x79726574,0,100,100,
108 3496, 3548, 3599, 3626, 3655, 3697, 3751, 3812, 3877, 3949, 4030, //discharge
109 3540, 3785, 3842, 3861, 3915, 3980, 4041, 4135, 4169, 4175, 4185 //charge
111 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
113 #define BATT_MAX_VOL_VALUE 8284 //Full charge voltage
114 #define BATT_ZERO_VOL_VALUE 6900 // power down voltage
115 #define BATT_NOMAL_VOL_VALUE 7600
118 static int batt_table[2*BATT_NUM+6] =
120 0x4B434F52,0x7461625F,0x79726574,1,300,100,
121 6800, 7242, 7332, 7404, 7470, 7520, 7610, 7744, 7848, 8016, 8284,//discharge
122 7630, 7754, 7852, 7908, 7956, 8024, 8112, 8220, 8306, 8318, 8328//charge
124 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
131 /********************************************************************************/
138 BATTERY_CAPACITY = 3,
139 BATTERY_AC_ONLINE = 4,
140 BATTERY_STATUS_CHANGED = 5,
141 AC_STATUS_CHANGED = 6,
142 BATTERY_INT_STATUS = 7,
143 BATTERY_INT_ENABLE = 8,
154 struct rk30_adc_battery_data {
157 //struct timer_list timer;
158 struct workqueue_struct *wq;
159 struct delayed_work delay_work;
160 struct delayed_work check_work;
161 struct work_struct dcwakeup_work;
162 struct work_struct lowerpower_work;
165 struct rk30_adc_battery_platform_data *pdata;
167 struct adc_client *client;
169 int adc_samples[NUM_VOLTAGE_SAMPLE+2];
179 int old_charge_level;
181 int gBatCapacityDisChargeCnt;
182 int gBatCapacityChargeCnt;
183 int gBatCapacityacChargeCnt;
184 int gBatCapacityusbChargeCnt ;
185 int gBatCapacityusbdisChargeCnt;
187 int suspend_capacity;
188 int gBatUsbChargeCnt;
191 struct power_supply bat;
192 struct power_supply usb;
193 struct power_supply ac;
194 struct power_supply bk_bat;
202 int charge_source_now;
203 int charge_soure_old;
204 int charge_start_capacity;
205 int charge_start_voltage;
206 int start_voltage_status;
207 int charge_up_proprotion;
208 int charge_down_proportion;
209 int voltage_to_local;
210 unsigned long suspend_time;
211 unsigned long resume_time;
215 int charge_full_flag;
217 struct notifier_block battery_nb;
219 int lower_power_flag;
223 static struct rk30_adc_battery_data *gBatteryData;
224 static struct wake_lock batt_wake_lock;
225 static struct wake_lock batt_wake_lock_detect_lowpower;
226 static struct wake_lock charge_display_lock;
227 int system_lowerpower = 0;
228 extern void kernel_power_off(void);
229 extern int dwc_vbus_status(void);
230 extern int get_gadget_connect_flag(void);
231 extern int dwc_otg_check_dpdm(void);
232 static int is_charge_ok(struct rk30_adc_battery_data *bat);
233 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat);
237 //#define BAT_ADC_TABLE_LEN 11
238 static ssize_t bat_param_read(struct device *dev,struct device_attribute *attr, char *buf)
241 for(i=0;i<BATT_NUM;i++)
242 printk("i=%d batt_table=%d\n",i+6,batt_table[i+6]);
244 for(i=0;i<BATT_NUM;i++)
245 printk("i=%d batt_table=%d\n",i+17,batt_table[i+17]);
248 DEVICE_ATTR(batparam, 0664, bat_param_read,NULL);
251 static ssize_t rkbatt_show_debug_attrs(struct device *dev,
252 struct device_attribute *attr, char *buf)
254 return sprintf(buf, "%d\n", battery_dbg_level);
257 static ssize_t rkbatt_restore_debug_attrs(struct device *dev,
258 struct device_attribute *attr, const char *buf, size_t size)
262 sscanf(buf, "%d", &liTmp);
264 if(liTmp != 0 && liTmp != 1)
266 dev_err(dev, "rk29adc_restore_debug_attrs err\n");
270 battery_dbg_level = liTmp;
275 static ssize_t rkbatt_show_state_attrs(struct device *dev,
276 struct device_attribute *attr, char *buf)
278 // struct rk30_adc_battery_platform_data *pdata = gBatteryData->pdata;
279 int charge_ok_value =0 ;
280 charge_ok_value = is_charge_ok(gBatteryData) ;
283 "gBatVol=%d,gBatCap=%d,charge_ok=%d,%s\n",
284 gBatteryData->bat_voltage,gBatteryData->bat_capacity,
285 charge_ok_value,gDischargeFlag);
288 static ssize_t rkbatt_restore_state_attrs(struct device *dev,
289 struct device_attribute *attr, const char *buf, size_t size)
294 static ssize_t rkbatt_show_value_attrs(struct device *dev,
295 struct device_attribute *attr, char *buf)
297 return sprintf(buf, "pull_up_res =%d,\npull_down_res=%d\n", batt_table[4],batt_table[5]);
300 static ssize_t rkbatt_restore_value_attrs(struct device *dev,
301 struct device_attribute *attr, const char *buf, size_t size)
306 sscanf(buf, "%d,%d", &liUp,&liDown);
308 if(liUp != 0 && liDown != 0)
310 batt_table[4] = liUp;
311 batt_table[5] = liDown;
316 static ssize_t rkbatt_show_flag_attrs(struct device *dev,
317 struct device_attribute *attr, char *buf)
319 return sprintf(buf, "rk29_battery_test_flag=%d\n", battery_test_flag);
321 static ssize_t rkbatt_restore_flag_attrs(struct device *dev,
322 struct device_attribute *attr, const char *buf, size_t size)
326 sscanf(buf, "%d", &liFlag);
330 battery_test_flag = liFlag;
334 static struct device_attribute rkbatt_attrs[] = {
335 __ATTR(state, 0664, rkbatt_show_state_attrs, rkbatt_restore_state_attrs),
336 __ATTR(debug, 0664, rkbatt_show_debug_attrs, rkbatt_restore_debug_attrs),
337 __ATTR(value, 0555, rkbatt_show_value_attrs, rkbatt_restore_value_attrs),
338 __ATTR(flag, 0555, rkbatt_show_flag_attrs, rkbatt_restore_flag_attrs),
341 static int create_sysfs_interfaces(struct device *dev)
344 for (liTmep = 0; liTmep < ARRAY_SIZE(rkbatt_attrs); liTmep++) {
346 if (device_create_file(dev, rkbatt_attrs + liTmep)){
354 for ( ; liTmep >= 0; liTmep--){
355 device_remove_file(dev, rkbatt_attrs + liTmep);
358 dev_err(dev, "%s:Unable to create sysfs interface\n", __func__);
365 static int rk30_adc_battery_load_capacity(void)
368 int* p = (int *)value;
369 long fd = sys_open(BATT_FILENAME,O_RDONLY,0);
372 DBG("rk30_adc_battery_load_capacity: open file /data/bat_last_capacity.dat failed\n");
376 sys_read(fd,(char __user *)value,4);
382 static void rk30_adc_battery_put_capacity(int loadcapacity)
385 int* p = (int *)value;
386 long fd = sys_open(BATT_FILENAME,O_CREAT | O_RDWR,0);
389 DBG("rk30_adc_battery_put_capacity: open file /data/bat_last_capacity.dat failed\n");
394 sys_write(fd, (const char __user *)value, 4);
397 static BLOCKING_NOTIFIER_HEAD(adc_battery_chain_head);
399 int register_adc_battery_notifier(struct notifier_block *nb)
401 return blocking_notifier_chain_register(&adc_battery_chain_head, nb);
403 EXPORT_SYMBOL_GPL(register_adc_battery_notifier);
405 int unregister_adc_battery_notifier(struct notifier_block *nb)
407 return blocking_notifier_chain_unregister(&adc_battery_chain_head, nb);
409 EXPORT_SYMBOL_GPL(unregister_adc_battery_notifier);
411 int adc_battery_notifier_call_chain(unsigned long val)
413 return (blocking_notifier_call_chain(&adc_battery_chain_head, val, NULL)
414 == NOTIFY_BAD) ? -EINVAL : 0;
416 EXPORT_SYMBOL_GPL(adc_battery_notifier_call_chain);
418 static void rk_start_charge(struct rk30_adc_battery_data *bat)
420 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
422 if (pdata->charge_set_pin != INVALID_GPIO){
423 gpio_direction_output(pdata->charge_set_pin, pdata->charge_set_level);
427 static void rk_stop_charge(struct rk30_adc_battery_data *bat)
429 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
431 if (pdata->charge_set_pin != INVALID_GPIO){
432 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
436 static int get_ac_status(struct rk30_adc_battery_data *bat){
438 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
440 if (pdata->dc_det_pin != INVALID_GPIO){
441 if (gpio_get_value (pdata->dc_det_pin) == pdata->dc_det_level){
447 if(pdata->is_dc_charging){
448 status = pdata->is_dc_charging();
454 // state of charge --- charge-display
455 static int get_usb_status1(struct rk30_adc_battery_data *bat){
456 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
458 if(pdata->is_usb_charging){
459 status = pdata->is_usb_charging();
466 //state of charge ----running
467 static int get_usb_status2(struct rk30_adc_battery_data *bat){
469 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
470 int usb_status = 0; // 0--dischage ,1 ---usb charge, 2 ---ac charge
471 int vbus_status = dwc_vbus_status();
473 if (1 == vbus_status) {
474 if (0 == get_gadget_connect_flag()){
475 if (++bat->gBatUsbChargeCnt >= NUM_USBCHARGE_IDENTIFY_TIMES){
476 bat->gBatUsbChargeCnt = NUM_USBCHARGE_IDENTIFY_TIMES + 1;
477 usb_status = 2; // non-standard AC charger
478 if(bat ->pdata ->control_usb_charging)
479 bat ->pdata ->control_usb_charging(1);
481 usb_status = 1; // connect to pc
482 if(bat ->pdata ->control_usb_charging)
483 bat ->pdata ->control_usb_charging(0);
487 usb_status = 1; // connect to pc
488 if(bat ->pdata ->control_usb_charging)
489 bat ->pdata ->control_usb_charging(0);
494 bat->gBatUsbChargeCnt = 0;
495 if (2 == vbus_status) {
496 usb_status = 2; //standard AC charger
498 if(bat ->pdata ->control_usb_charging)
499 bat ->pdata ->control_usb_charging(1);
510 static int rk_battery_get_status(struct rk30_adc_battery_data *bat)
513 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
514 int ac_ac_charging = 0, usb_ac_charging = 0;
517 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
518 ac_ac_charging = get_ac_status(bat);
519 if(1 == ac_ac_charging)
523 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
524 if (strstr(saved_command_line,"charger")){
525 wake_lock(&charge_display_lock); //lock
526 if( bat->pdata->usb_det_pin != INVALID_GPIO ){
527 if( gpio_get_value(bat->pdata->usb_det_pin)== bat->pdata->usb_det_level){
528 if(( 1 == usb_ac_charging )||( 1 == ac_ac_charging ))
529 bat -> ac_charging = 1;
530 if(( 1 == bat->usb_charging)||(1 == bat ->ac_charging))
534 if(( 0 == usb_ac_charging )&&( 0 == ac_ac_charging ))
535 bat -> ac_charging = 0;
537 bat->ac_charging = 1;
539 bat->usb_charging = 0;
540 if(1 == bat->ac_charging)
548 if(dwc_otg_check_dpdm() == 0){
549 bat->usb_charging = 0;
551 }else if(dwc_otg_check_dpdm() == 1){
552 bat->usb_charging = 1;
553 if(bat -> pdata ->control_usb_charging)
554 bat -> pdata ->control_usb_charging(0);
555 }else if(dwc_otg_check_dpdm() == 2){
556 bat->usb_charging = 0;
558 if(bat -> pdata ->control_usb_charging)
559 bat -> pdata ->control_usb_charging(1);
561 if((1 == usb_ac_charging)||(1 == ac_ac_charging))
562 bat ->ac_charging = 1;
564 bat ->ac_charging = 0;
566 if(( 0 == bat ->ac_charging )&&(0 == bat->usb_charging )){
577 usb_ac_charging = get_usb_status2(bat); //0 --discharge, 1---usb charging,2----AC charging;
578 if(1 == usb_ac_charging)
579 bat->usb_charging = 1;
581 bat->usb_charging = 0;
584 if((usb_ac_charging == 2)||(ac_ac_charging == 1))
585 bat -> ac_charging = 1;
587 bat -> ac_charging = 0;
589 if((bat->usb_charging == 1)||(bat ->ac_charging ==1))
592 if(1 == bat->ac_charging )
593 bat->charge_source_now = 1; //ac charge
594 else if( 1 == bat->usb_charging){
595 bat->charge_source_now = 2; //ac charge
597 bat->charge_soure_old =0;
598 bat->charge_source_now=0;
600 if(bat->charge_source_now != bat->charge_soure_old){
602 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){ //0.3 s
603 msleep(1); //mdelay --- > msleep
604 rk30_adc_battery_voltage_samples(bat); //get new voltage
607 bat->charge_soure_old = bat->charge_source_now;
610 DBG("ac_status=%d,usb_status=%d bat->bat_change = %d\n",bat -> ac_charging, bat->usb_charging ,bat->bat_change );
615 static int is_charge_ok(struct rk30_adc_battery_data *bat)
617 int charge_is_ok = 0;
618 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
620 if( 1 != bat->charge_level)
623 if((pdata->charge_ok_pin == INVALID_GPIO)&& ( pdata->charging_ok == NULL))
626 if (pdata->charge_ok_pin != INVALID_GPIO){
627 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
630 }else if( pdata->charging_ok){
632 charge_is_ok = pdata->charging_ok();
641 static int rk30_adc_battery_status_samples(struct rk30_adc_battery_data *bat)
645 charge_level = bat ->charge_level;//rk_battery_get_status(bat);
647 if (charge_level != bat->old_charge_level){
648 bat->old_charge_level = charge_level;
652 rk_start_charge(bat);
658 bat->bat_status_cnt = 0;
660 if(( 1 == charge_level )&&(1 == bat->charge_full_flag) && (bat->bat_capacity < 90)){
661 rk_start_charge(bat); //recharge
662 if(bat->pdata->ctrl_charge_led != NULL)
663 bat->pdata->ctrl_charge_led(0);
665 }else if (charge_level) {
666 rk_start_charge(bat);
673 if(charge_level == 0){
675 bat->charge_full_flag = 0;
677 bat->time_to_full = 0;
678 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
681 if( is_charge_ok(bat) == INVALID_CHARGE_CHECK){
682 if (bat->bat_capacity == 100){
683 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
684 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
686 bat->charge_full_flag = 1;
687 if(bat->pdata->ctrl_charge_led != NULL)
688 bat->pdata->ctrl_charge_led(1);
693 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
694 if((bat->bat_capacity == 99)&&(bat->time_to_full == 0)){
695 bat->time_to_full = get_seconds();
696 }else if(bat->bat_capacity == 99)
698 if(get_seconds() - bat->time_to_full > 1800){
699 bat->bat_capacity = 100;
700 bat->time_to_full = 0;
705 if(bat->pdata->ctrl_charge_led != NULL)
706 bat->pdata->ctrl_charge_led(0);
708 }else{ // pin of charge_ok_pin
709 if (is_charge_ok(bat) != CHARGE_IS_OK ){
712 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
714 if((bat->bat_capacity == 99)&&(bat->time_to_full == 0)){
715 bat->time_to_full = get_seconds();
716 }else if(bat->bat_capacity == 99)
718 if(get_seconds() - bat->time_to_full > 1800){
719 bat->bat_capacity = 100;
720 bat->time_to_full = 0;
729 if (bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) {
730 bat->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
733 if ((bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) && (bat->bat_capacity >= 99)){
734 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
735 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
737 bat->bat_capacity = 100;
742 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
750 static int rk_adc_voltage(struct rk30_adc_battery_data *bat, int value)
754 int ref_voltage; //reference_voltage
758 ref_voltage = bat ->pdata->reference_voltage;
759 pullup_res = bat ->pdata->pull_up_res;
760 pulldown_res = bat ->pdata->pull_down_res;
762 if(ref_voltage && pullup_res && pulldown_res){
763 #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026)
764 ref_voltage = adc_get_curr_ref_volt();
766 voltage = ((value * ref_voltage * (pullup_res + pulldown_res)) / (1024 * pulldown_res));
767 DBG("ref_voltage =%d, voltage=%d \n", ref_voltage,voltage);
771 if(bat ->capacitytmp < 5)
772 ref_voltage = adc_get_curr_ref_volt();
774 ref_voltage = adc_get_def_ref_volt();
776 #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026)
777 ref_voltage = adc_get_curr_ref_volt();
778 voltage = (value * ref_voltage * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]);
780 voltage =voltage = adc_to_voltage(value);
784 DBG("ref_voltage =%d, voltage=%d \n", ref_voltage,voltage);
788 static void rk_handle_ripple(struct rk30_adc_battery_data *bat, int status)
793 if (bat->pdata->use_board_table){
794 p_table = bat->pdata->board_batt_table;
797 if(bat->bat_voltage >= p_table[2*BATT_NUM +5]+ 10)
798 bat->bat_voltage = p_table[2*BATT_NUM +5] + 10;
799 else if(bat->bat_voltage <= p_table[BATT_NUM +6] - 10)
800 bat->bat_voltage = p_table[BATT_NUM +6] - 10;
803 if(bat->bat_voltage >= p_table[BATT_NUM +5]+ 10)
804 bat->bat_voltage = p_table[BATT_NUM +5] + 10;
805 else if(bat->bat_voltage <= p_table[6] - 10)
806 bat->bat_voltage = p_table[6] - 10;
812 //static int *pSamples;
813 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
816 int i,*pStart = bat->adc_samples, num = 0;
817 int level = bat->charge_level;
820 value = bat->adc_val;
821 adc_async_read(bat->client);
823 *(bat->pSamples++) = rk_adc_voltage(bat,value);
825 bat->bat_status_cnt++;
826 if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE) bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
828 num = bat->pSamples - pStart;
830 if (num >= NUM_VOLTAGE_SAMPLE){
831 bat ->pSamples = pStart;
832 num = NUM_VOLTAGE_SAMPLE;
837 for (i = 0; i < num; i++){
838 value += bat->adc_samples[i];
840 bat->bat_voltage = value / num;
843 if(battery_test_flag == 0)
845 if(0 == bat->pdata->use_board_table){
847 if(bat->bat_voltage >= batt_table[2*BATT_NUM +5]+ 10)
848 bat->bat_voltage = batt_table[2*BATT_NUM +5] + 10;
849 else if(bat->bat_voltage <= batt_table[BATT_NUM +6] - 10)
850 bat->bat_voltage = batt_table[BATT_NUM +6] - 10;
853 if(bat->bat_voltage >= batt_table[BATT_NUM +5]+ 10)
854 bat->bat_voltage = batt_table[BATT_NUM +5] + 10;
855 else if(bat->bat_voltage <= batt_table[6] - 10)
856 bat->bat_voltage = batt_table[6] - 10;
859 rk_handle_ripple(bat, level);
862 }else if(battery_test_flag == 2){
864 if(batt_table[3] == 0){
865 if(bat->bat_voltage < 3400){
866 if((get_seconds() - gSecondsCnt) > 30){
867 gSecondsCnt = get_seconds();
868 if((gVoltageCnt - bat->bat_voltage) > 15){
869 strncpy(gDischargeFlag, "off" ,4);
871 gVoltageCnt = bat->bat_voltage;
876 if(bat->bat_voltage < 3400){
877 bat->bat_voltage = 3400;
881 if(bat->bat_voltage < 6800){
882 if((get_seconds() - gSecondsCnt) > 30){
883 gSecondsCnt = get_seconds();
884 if((gDoubleVoltageCnt - bat->bat_voltage) > 30){
885 strncpy(gDischargeFlag, "off" ,4);
887 gDoubleVoltageCnt =bat->bat_voltage;
890 if(bat->bat_voltage < 6800){
891 bat->bat_voltage = 6800;
897 static int rk30_adc_battery_voltage_to_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
903 if (bat->pdata->use_board_table)
904 p = bat->pdata->board_batt_table;
908 if (1 == bat->charge_level){ //charge
909 if(0 == bat->start_voltage_status ){
910 if(BatVoltage >= (p[2*BATT_NUM +5])){
914 if(BatVoltage <= (p[BATT_NUM +6])){
918 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++){
920 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
922 capacity = (i-(BATT_NUM +6))*10 + ((BatVoltage - p[i]) * 10)/ (p[i+1]- p[i]);
931 DBG("start_voltage=%d,start_capacity =%d\n", bat->charge_start_voltage, bat->charge_start_capacity);
932 DBG("charge_down_proportion =%d,charge_up_proprotion=%d\n",bat ->charge_down_proportion,bat ->charge_up_proprotion);
933 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
934 if(((p[i]) <= bat->charge_start_voltage) && (bat->charge_start_voltage < (p[i+1])))
935 bat->voltage_to_local = i;
936 if(BatVoltage >= (p[2*BATT_NUM +5])){
940 if(BatVoltage <= (p[BATT_NUM +6])){
944 if(BatVoltage <bat->charge_start_voltage){
945 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
946 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
947 if( p[i+1] < bat->charge_start_voltage ){
948 capacity =bat->charge_start_capacity - ((p[i+1] -BatVoltage) * bat->charge_start_capacity/(bat->voltage_to_local -17+1))/ (p[i+1]- p[i]) - (bat->voltage_to_local- (i ))*bat->charge_start_capacity/(bat->voltage_to_local -17+1);
949 DBG("1<<<<<<< %d bat->voltage_to_local =%d capacity = %d BatVoltage =%d p[i] = %d,p[i+1] = %d \n", i, bat->voltage_to_local,capacity,BatVoltage,p[i], p[i+1]);
953 capacity =bat->charge_start_capacity - ((bat->charge_start_voltage -BatVoltage) * bat->charge_start_capacity/(bat->voltage_to_local -17+1) )/ (bat->charge_start_voltage - p[i]);
954 DBG("2<<<<<< %d capacity = %d BatVoltage =%d p[i] = %d,p[i+1] = %d \n", i,capacity,BatVoltage,p[i], p[i+1]);
962 if(BatVoltage > bat->charge_start_voltage){
963 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
964 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
965 if( p[i] > bat->charge_start_voltage ){
966 capacity = bat->charge_start_capacity + (i +1- (bat->voltage_to_local))*(100- bat->charge_start_capacity )/( 10 - (bat->voltage_to_local - 17)) + (BatVoltage - p[i]) * (100- bat->charge_start_capacity )/( 10 - (bat->voltage_to_local -17))/ (p[i+1]- p[i]);
967 DBG("3<<<<<<<< %d bat->voltage_to_local =%d capacity = %d BatVoltage =%d p[i] = %d,p[i+1] = %d \n", i, bat->voltage_to_local,capacity,BatVoltage,p[i], p[i+1]);
970 capacity = bat->charge_start_capacity + (BatVoltage - bat->charge_start_voltage) * (100- bat->charge_start_capacity )/( 10 - (bat->voltage_to_local-17 )) /(p[i+1] - bat->charge_start_voltage );
971 DBG(" 4<<<<<<<<<%d bat->voltage_to_local =%d capacity = %d BatVoltage =%d p[i] = %d,p[i+1] = %d \n", i,bat->voltage_to_local,capacity,BatVoltage,p[i], p[i+1]);
978 if(BatVoltage == bat->charge_start_voltage)
979 capacity = bat ->charge_start_capacity;
989 if(BatVoltage >= (p[BATT_NUM +5])){
993 if(BatVoltage <= (p[6])){
997 for(i = 6; i < BATT_NUM +5; i++){
998 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
999 capacity = (i-6)*10+ ((BatVoltage - p[i]) *10 )/ (p[i+1]- p[i]) ;
1010 DBG("real_voltage_to_capacity =%d\n" ,capacity);
1015 static void rk_usb_charger(struct rk30_adc_battery_data *bat)
1019 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1020 int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1021 int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
1023 if((1 == bat ->charge_level)&&( 0 == bat ->start_voltage_status)){
1024 bat ->charge_start_voltage = bat ->bat_voltage;
1025 bat ->start_voltage_status = 1;
1026 bat ->charge_start_capacity = bat ->bat_capacity;
1027 if(bat ->charge_start_capacity%10 != 0){
1028 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1029 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1031 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10;
1032 bat ->charge_down_proportion = bat ->charge_start_capacity/10;
1038 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1040 if (capacity > bat->bat_capacity){
1041 if(capacity > bat->bat_capacity + 10 )
1042 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10; //5s
1043 else if(capacity > bat->bat_capacity + 7 )
1044 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
1045 else if(capacity > bat->bat_capacity + 3 )
1046 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
1047 if (++(bat->gBatCapacityusbChargeCnt) >= timer_of_charge_sample){
1048 bat->gBatCapacityusbChargeCnt = 0;
1049 if (bat->bat_capacity < 99){
1050 bat->bat_capacity++;
1051 bat->bat_change = 1;
1054 bat->gBatCapacityChargeCnt = 0;
1055 bat ->gBatCapacityusbdisChargeCnt = 0;//get_suspend_state(void)
1056 }else //if(( get_suspend_state() != PM_SUSPEND_MEM)&&(capacity < bat->bat_capacity)){
1057 // if((gpio_get_value (bat->pdata->back_light_pin) == 1)&&(capacity < bat->bat_capacity)){
1058 if((capacity < bat->bat_capacity)){
1059 DBG("USB CHARGE DOWN\n");
1061 // if (capacity < bat->bat_capacity){
1063 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 40; // 13
1064 }else if(capacity < 20){
1065 if(capacity + 3 > bat->bat_capacity )
1066 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5; //5s
1067 else if(capacity + 7 > bat->bat_capacity )
1068 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10; //10s
1069 else if(capacity + 10> bat->bat_capacity )
1070 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -25; // 13
1072 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 35; // 13
1074 if(capacity + 3 > bat->bat_capacity )
1075 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5; //5s
1076 else if(capacity + 7 > bat->bat_capacity )
1077 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10; //10s
1078 else if(capacity + 10> bat->bat_capacity )
1079 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 15; // 13
1081 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 20; // 13
1084 if (++(bat->gBatCapacityusbdisChargeCnt) >= timer_of_discharge_sample){
1085 bat->gBatCapacityusbdisChargeCnt = 0;
1086 if (bat->bat_capacity > 0){
1087 bat->bat_capacity-- ;
1088 bat->bat_change = 1;
1093 bat->gBatCapacityusbChargeCnt = 0;
1096 else //if(get_suspend_state() == PM_SUSPEND_MEM){
1097 //if(gpio_get_value (bat->pdata->back_light_pin) == 0){
1101 bat->gBatCapacityusbdisChargeCnt = 0;
1102 // (bat->gBatCapacityusbChargeCnt)++;
1103 if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
1104 if( is_charge_ok(bat) == CHARGE_IS_OK){
1106 if (++bat->gBatCapacityusbChargeCnt >= timer_of_charge_sample-30){
1107 bat->gBatCapacityusbChargeCnt = 0;
1108 if (bat->bat_capacity <= 99){
1109 bat->bat_capacity++;
1110 bat->bat_change = 1;
1114 if (capacity > bat->capacitytmp){
1115 bat->gBatCapacityChargeCnt = 0;
1118 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
1119 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1121 if (bat->bat_capacity < 99){
1122 bat->bat_capacity++;
1123 bat->bat_change = 1;
1131 if (capacity > bat->capacitytmp){
1132 bat->gBatCapacityChargeCnt = 0;
1134 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityusbChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
1135 bat->gBatCapacityusbChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1136 if (bat->bat_capacity <= 99){
1137 bat->bat_capacity++;
1138 bat->bat_change = 1;
1145 bat->capacitytmp = capacity;
1148 static void rk_ac_charger(struct rk30_adc_battery_data *bat)
1151 int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1153 if((1 == bat->charge_level)&&( 0 == bat->start_voltage_status)){
1154 bat->charge_start_voltage = bat->bat_voltage;
1155 bat->start_voltage_status = 1;
1156 bat->charge_start_capacity = bat->bat_capacity;
1157 if(bat ->charge_start_capacity%10 != 0){
1158 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1159 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1161 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10;
1162 bat ->charge_down_proportion = bat ->charge_start_capacity/10;
1167 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1168 if (capacity > bat->bat_capacity){
1169 if(capacity > bat->bat_capacity + 10 )
1170 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10; //5s
1171 else if(capacity > bat->bat_capacity + 7 )
1172 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
1173 else if(capacity > bat->bat_capacity + 3 )
1174 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
1175 if (++(bat->gBatCapacityacChargeCnt) >= timer_of_charge_sample){
1176 bat->gBatCapacityacChargeCnt = 0;
1177 if (bat->bat_capacity < 99){
1178 bat->bat_capacity++;
1179 bat->bat_change = 1;
1182 bat->gBatCapacityChargeCnt = 0;
1185 bat->gBatCapacityacChargeCnt = 0;
1186 (bat->gBatCapacityChargeCnt)++;
1187 if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
1188 if( is_charge_ok(bat) == CHARGE_IS_OK){
1189 if (bat->gBatCapacityChargeCnt >= timer_of_charge_sample){
1190 bat->gBatCapacityChargeCnt = 0;
1191 if (bat->bat_capacity < 99){
1192 bat->bat_capacity++;
1193 bat->bat_change = 1;
1197 if (capacity > bat->capacitytmp){
1198 bat->gBatCapacityChargeCnt = 0;
1202 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
1203 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1205 if (bat->bat_capacity < 99){
1206 bat->bat_capacity++;
1207 bat->bat_change = 1;
1214 if (capacity > bat->capacitytmp){
1215 bat->gBatCapacityChargeCnt = 0;
1219 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
1220 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1222 if (bat->bat_capacity <= 99){
1223 bat->bat_capacity++;
1224 bat->bat_change = 1;
1232 bat->capacitytmp = capacity;
1234 static void rk_battery_charger(struct rk30_adc_battery_data *bat)
1238 int timer_of_discharge_sample = DISCHARGE_MIN_SECOND;
1240 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1242 if (capacity < bat->bat_capacity){
1245 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 40; // 13
1249 if(capacity + 3 > bat->bat_capacity )
1250 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -5; //5s
1251 else if(capacity + 7 > bat->bat_capacity )
1252 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -10; //10s
1253 else if(capacity + 10> bat->bat_capacity )
1254 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -25; // 13
1256 timer_of_discharge_sample = DISCHARGE_MIN_SECOND - 35; // 13
1258 if(capacity + 3 > bat->bat_capacity )
1259 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -5; //5s
1260 else if(capacity + 7 > bat->bat_capacity )
1261 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -10; //10s
1262 else if(capacity + 10> bat->bat_capacity )
1263 timer_of_discharge_sample = DISCHARGE_MIN_SECOND - 15; // 13
1265 timer_of_discharge_sample = DISCHARGE_MIN_SECOND - 20; // 13
1268 if (++(bat->gBatCapacityDisChargeCnt) >= timer_of_discharge_sample){
1269 bat->gBatCapacityDisChargeCnt = 0;
1270 if (bat->bat_capacity > 0){
1271 bat->bat_capacity-- ;
1272 bat->bat_change = 1;
1277 bat->gBatCapacityDisChargeCnt = 0;
1279 bat->gBatCapacityChargeCnt = 0;
1280 bat->gBatCapacityusbdisChargeCnt=0 ;
1281 bat->gBatCapacityusbChargeCnt =0;
1282 bat->gBatCapacityacChargeCnt = 0;
1283 bat->start_voltage_status = 0;
1285 bat->capacitytmp = capacity;
1291 static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat)
1293 // int capacity = 0;
1294 // int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1295 // int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
1297 if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE) {
1298 bat->gBatCapacityDisChargeCnt = 0;
1299 bat->gBatCapacityChargeCnt = 0;
1300 bat->gBatCapacityacChargeCnt = 0;
1304 if(1 == bat->charge_level){
1305 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1306 if(1 == bat->usb_charging)
1307 rk_usb_charger(bat);
1314 rk_battery_charger(bat);
1320 //static int poweron_check = 0;
1321 static void rk30_adc_battery_poweron_capacity_check(struct rk30_adc_battery_data *bat)
1324 int new_capacity, old_capacity;
1327 new_capacity = bat ->bat_capacity;
1330 old_capacity = rk30_adc_battery_load_capacity();
1331 if( old_capacity >= 0 ){
1337 if ((old_capacity < 0) || (old_capacity > 100)){
1338 old_capacity = new_capacity;
1341 if (bat ->bat_status == POWER_SUPPLY_STATUS_FULL){
1342 if (new_capacity > 80){
1343 bat ->bat_capacity = 100;
1346 else if (bat ->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1349 if( bat ->pdata->is_reboot_charging == 1)
1350 bat ->bat_capacity = (old_capacity < 10) ?(old_capacity+2):old_capacity;
1352 bat ->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1354 if(new_capacity > old_capacity + 50 )
1355 bat ->bat_capacity = old_capacity + 5;
1357 bat ->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; //avoid the value of capacity increase
1358 if(bat->bat_capacity == 100)
1359 bat->bat_capacity = 99;
1360 if(bat->bat_capacity == 0)
1361 bat->bat_capacity =1;
1363 printk("old_capacity = %d , new_capacity =%d, capacity = %d\n ",old_capacity,new_capacity ,bat ->bat_capacity);
1365 bat ->bat_change = 1;
1367 #define to_battery_usb_device_info(x) container_of((x), \
1368 struct rk30_adc_battery_data, usb);
1370 static int rk30_adc_battery_get_usb_property(struct power_supply *psy,
1371 enum power_supply_property psp,
1372 union power_supply_propval *val)
1374 struct rk30_adc_battery_data *bat= to_battery_usb_device_info(psy);
1377 case POWER_SUPPLY_PROP_ONLINE:
1378 if (psy->type == POWER_SUPPLY_TYPE_USB){
1379 val->intval = bat ->usb_charging;
1380 if (strstr(saved_command_line,"charger") == NULL){
1381 if( 1 == bat->charge_full_flag)
1395 static enum power_supply_property rk30_adc_battery_usb_props[] = {
1397 POWER_SUPPLY_PROP_ONLINE,
1400 static struct power_supply rk30_usb_supply =
1403 .type = POWER_SUPPLY_TYPE_USB,
1405 .get_property = rk30_adc_battery_get_usb_property,
1407 .properties = rk30_adc_battery_usb_props,
1408 .num_properties = ARRAY_SIZE(rk30_adc_battery_usb_props),
1411 static irqreturn_t rk30_adc_battery_dc_wakeup(int irq, void *dev_id)
1413 disable_irq_nosync(irq);
1414 queue_work(gBatteryData->wq, &gBatteryData->dcwakeup_work);
1418 #define to_battery_ac_device_info(x) container_of((x), \
1419 struct rk30_adc_battery_data, ac);
1421 static int rk30_adc_battery_get_ac_property(struct power_supply *psy,
1422 enum power_supply_property psp,
1423 union power_supply_propval *val)
1427 struct rk30_adc_battery_data *bat = to_battery_ac_device_info(psy);
1430 case POWER_SUPPLY_PROP_ONLINE:
1431 if (psy->type == POWER_SUPPLY_TYPE_MAINS){
1432 val->intval = bat ->ac_charging;
1433 if (strstr(saved_command_line,"charger") == NULL ){
1434 if( 1 == bat->charge_full_flag)
1448 static enum power_supply_property rk30_adc_battery_ac_props[] =
1450 POWER_SUPPLY_PROP_ONLINE,
1453 static struct power_supply rk30_ac_supply =
1456 .type = POWER_SUPPLY_TYPE_MAINS,
1458 .get_property = rk30_adc_battery_get_ac_property,
1460 .properties = rk30_adc_battery_ac_props,
1461 .num_properties = ARRAY_SIZE(rk30_adc_battery_ac_props),
1463 static void rk30_adc_battery_dcdet_delaywork(struct work_struct *work)
1467 struct rk30_adc_battery_platform_data *pdata;
1470 struct rk30_adc_battery_data *bat = container_of((work), \
1471 struct rk30_adc_battery_data, dcwakeup_work);
1473 rk28_send_wakeup_key(); // wake up the system
1477 irq = gpio_to_irq(pdata->dc_det_pin);
1478 free_irq(irq, NULL);
1480 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1481 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);// reinitialize the DC irq
1483 free_irq(irq, NULL);
1486 power_supply_changed(&bat ->ac);
1488 bat ->bat_status_cnt = 0; //the state of battery is change
1493 static int rk30_adc_battery_get_status(struct rk30_adc_battery_data *bat)
1495 return (bat->bat_status);
1498 static int rk30_adc_battery_get_health(struct rk30_adc_battery_data *bat)
1500 return POWER_SUPPLY_HEALTH_GOOD;
1503 static int rk30_adc_battery_get_present(struct rk30_adc_battery_data *bat)
1505 return (bat->bat_voltage < BATT_MAX_VOL_VALUE) ? 0 : 1;
1508 static int rk30_adc_battery_get_voltage(struct rk30_adc_battery_data *bat)
1510 return (bat->bat_voltage );
1513 static int rk30_adc_battery_get_capacity(struct rk30_adc_battery_data *bat)
1515 return (bat->bat_capacity);
1518 static int rk30_adc_battery_get_property(struct power_supply *psy,
1519 enum power_supply_property psp,
1520 union power_supply_propval *val)
1524 struct rk30_adc_battery_data *bat = container_of((psy), \
1525 struct rk30_adc_battery_data, bat);
1527 case POWER_SUPPLY_PROP_STATUS:
1528 val->intval = rk30_adc_battery_get_status(bat);
1529 DBG("gBatStatus=%d\n",val->intval);
1531 case POWER_SUPPLY_PROP_HEALTH:
1532 val->intval = rk30_adc_battery_get_health(bat);
1533 DBG("gBatHealth=%d\n",val->intval);
1535 case POWER_SUPPLY_PROP_PRESENT:
1536 val->intval = rk30_adc_battery_get_present(bat);
1537 DBG("gBatPresent=%d\n",val->intval);
1539 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1540 // val ->intval = rk30_adc_battery_get_voltage(bat);
1541 voltage = rk30_adc_battery_get_voltage(bat);
1542 val->intval = voltage*1000;
1543 DBG("gBatVoltage=%d\n",val->intval);
1545 case POWER_SUPPLY_PROP_CAPACITY:
1546 if(battery_test_flag == 2)
1549 val->intval = rk30_adc_battery_get_capacity(bat);
1550 DBG("gBatCapacity=%d%%\n",val->intval);
1552 case POWER_SUPPLY_PROP_TECHNOLOGY:
1553 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
1555 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1556 val->intval = BATT_MAX_VOL_VALUE;
1558 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1559 val->intval = BATT_ZERO_VOL_VALUE;
1569 static enum power_supply_property rk30_adc_battery_props[] = {
1571 POWER_SUPPLY_PROP_STATUS,
1572 POWER_SUPPLY_PROP_HEALTH,
1573 POWER_SUPPLY_PROP_PRESENT,
1574 POWER_SUPPLY_PROP_VOLTAGE_NOW,
1575 POWER_SUPPLY_PROP_TECHNOLOGY,
1576 POWER_SUPPLY_PROP_CAPACITY,
1577 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1578 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1581 static struct power_supply rk30_battery_supply =
1584 .type = POWER_SUPPLY_TYPE_BATTERY,
1586 .get_property = rk30_adc_battery_get_property,
1588 .properties = rk30_adc_battery_props,
1589 .num_properties = ARRAY_SIZE(rk30_adc_battery_props),
1593 static void rk30_adc_battery_resume_check(struct rk30_adc_battery_data *bat)
1597 int new_capacity, old_capacity;
1598 // struct rk30_adc_battery_data *bat = gBatteryData;
1600 bat ->old_charge_level = -1;
1601 bat ->pSamples = bat->adc_samples;
1603 adc_sync_read(bat->client); //start adc sample
1604 level = oldlevel = rk_battery_get_status(bat);//rk30_adc_battery_status_samples(bat);//init charge status
1606 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) { //0.3 s
1609 rk30_adc_battery_voltage_samples(bat); //get voltage
1610 level = rk_battery_get_status(bat);// rk30_adc_battery_status_samples(bat); //check charge status
1611 if (oldlevel != level){
1612 oldlevel = level; //if charge status changed, reset sample
1616 new_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1617 old_capacity =bat-> suspend_capacity;
1619 //if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1622 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;
1625 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; // aviod the value of capacity increase dicharge
1628 if( bat ->pdata->batt_low_pin != INVALID_GPIO){
1629 if (gpio_get_value(bat ->pdata->batt_low_pin) == bat ->pdata->batt_low_level)
1630 bat->bat_capacity = 0;
1636 static int rk30_adc_battery_suspend(struct platform_device *dev, pm_message_t state)
1639 struct rk30_adc_battery_data *data = platform_get_drvdata(dev);
1641 data ->suspend_capacity = data->bat_capacity;
1642 data ->suspend_time = get_seconds();
1643 cancel_delayed_work(&data ->delay_work);
1645 if( data ->pdata->batt_low_pin != INVALID_GPIO){
1647 irq = gpio_to_irq(data ->pdata->batt_low_pin);
1649 enable_irq_wake(irq);
1655 static int rk30_adc_battery_resume(struct platform_device *dev)
1658 struct rk30_adc_battery_data *data = platform_get_drvdata(dev);
1659 if( data->bat_capacity < 10 ){
1660 wake_lock_timeout(&batt_wake_lock_detect_lowpower,15*HZ);
1661 data->bat_change = 1;
1663 data ->resume_time = get_seconds();
1664 data ->resume = true;
1665 queue_delayed_work(data->wq, &data ->delay_work, msecs_to_jiffies(100));
1666 if( data ->pdata->batt_low_pin != INVALID_GPIO){
1668 irq = gpio_to_irq(data ->pdata ->batt_low_pin);
1669 disable_irq_wake(irq);
1675 #define rk30_adc_battery_suspend NULL
1676 #define rk30_adc_battery_resume NULL
1680 unsigned long AdcTestCnt = 0;
1681 static void rk30_adc_battery_timer_work(struct work_struct *work)
1683 struct rk30_adc_battery_data *bat = container_of((work), \
1684 struct rk30_adc_battery_data, delay_work);
1688 // if( (bat->resume_time - bat->suspend_time) >= 1800 )
1689 rk30_adc_battery_resume_check(bat);
1691 //bat->bat_capacity = bat->suspend_capacity;
1692 bat ->resume = false;
1693 bat ->bat_change =1;
1696 bat->stop_check = 1;
1697 if( 1 == bat ->lower_power_flag ){
1698 bat ->bat_capacity = 0;
1699 bat ->bat_change =1;
1701 if (bat ->poweron_check){
1702 bat ->poweron_check = 0;
1703 rk30_adc_battery_poweron_capacity_check(bat);
1706 bat ->charge_level = rk_battery_get_status(bat);
1707 DBG("bat ->charge_level =%d\n", bat ->charge_level);
1708 rk30_adc_battery_status_samples(bat);
1709 rk30_adc_battery_voltage_samples(bat);
1710 rk30_adc_battery_capacity_samples(bat);
1712 if( 0 == bat ->pdata ->charging_sleep){
1713 if( 1 == bat->charge_level){ // charge
1714 if(0 == bat->status_lock ){
1715 wake_lock(&batt_wake_lock); //lock
1716 bat ->status_lock = 1;
1720 if(1 == bat ->status_lock ){
1721 wake_unlock(&batt_wake_lock); //unlock
1722 bat ->status_lock = 0;
1728 /*update battery parameter after adc and capacity has been changed*/
1729 if(bat ->bat_change){
1730 bat ->bat_change= 0;
1731 if (strstr(saved_command_line,"charger") == NULL){ //when low charging-current,not in charging-displays
1732 if(0 == bat ->bat_capacity){
1733 bat ->ac_charging = 0;
1734 bat ->usb_charging = 0;
1738 rk30_adc_battery_put_capacity(bat ->bat_capacity);
1739 power_supply_changed(&bat ->bat);
1740 power_supply_changed(&bat ->ac);
1741 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1742 power_supply_changed(&bat ->usb);
1747 //if (rk30_battery_dbg_level){
1748 if (++AdcTestCnt >= 2)
1752 DBG("Status = %d, RealAdcVal = %d, RealVol = %d,gBatVol = %d, gBatCap = %d, RealCapacity = %d, batt_dischargecnt = %d\n, chargecnt = %d,ac_count = %d, usb_count =%d ,usb_dischargecount =%d\n",
1753 bat ->bat_status, bat ->adc_val, rk_adc_voltage(bat, bat ->adc_val),
1754 bat ->bat_voltage, bat ->bat_capacity, bat ->capacitytmp, bat ->gBatCapacityDisChargeCnt, bat ->gBatCapacityChargeCnt,
1755 bat ->gBatCapacityacChargeCnt, bat ->gBatCapacityusbChargeCnt, bat ->gBatCapacityusbdisChargeCnt);
1759 queue_delayed_work(bat ->wq, &bat ->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1764 static int rk30_adc_battery_io_init(struct rk30_adc_battery_platform_data *pdata)
1768 if (pdata->io_init) {
1773 //charge control pin
1774 if (pdata->charge_set_pin != INVALID_GPIO){
1775 ret = gpio_request(pdata->charge_set_pin, NULL);
1777 printk("failed to request dc_det gpio\n");
1780 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
1783 //dc charge detect pin
1784 if (pdata->dc_det_pin != INVALID_GPIO){
1785 ret = gpio_request(pdata->dc_det_pin, NULL);
1787 printk("failed to request dc_det gpio\n");
1791 gpio_pull_updown(pdata->dc_det_pin, GPIOPullUp);//important
1792 ret = gpio_direction_input(pdata->dc_det_pin);
1794 printk("failed to set gpio dc_det input\n");
1800 if (pdata->charge_ok_pin != INVALID_GPIO){
1801 ret = gpio_request(pdata->charge_ok_pin, NULL);
1803 printk("failed to request charge_ok gpio\n");
1807 gpio_pull_updown(pdata->charge_ok_pin, GPIOPullUp);//important
1808 ret = gpio_direction_input(pdata->charge_ok_pin);
1810 printk("failed to set gpio charge_ok input\n");
1815 if( pdata->batt_low_pin != INVALID_GPIO){
1816 ret = gpio_request(pdata->batt_low_pin, NULL);
1818 printk("failed to request batt_low_pin gpio\n");
1822 gpio_pull_updown(pdata->batt_low_pin, GPIOPullUp);
1823 ret = gpio_direction_input(pdata->batt_low_pin);
1825 printk("failed to set gpio batt_low_pin input\n");
1835 extern void kernel_power_off(void);
1836 int get_battery_status(void)
1838 return system_lowerpower;
1840 static int rk_adc_battery_poweron_status(struct rk30_adc_battery_data *bat)
1844 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1846 if (get_ac_status(bat) ){
1847 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1848 bat -> ac_charging = 1;
1849 if (is_charge_ok(bat) == 1){
1850 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1851 bat->bat_capacity = 100;
1853 power_supply_changed(&bat ->ac);
1856 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1857 otg_status = dwc_otg_check_dpdm();
1858 if( 0 != otg_status ){
1859 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1860 if (is_charge_ok(bat) == 1){
1861 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1862 bat->bat_capacity = 100;
1866 if(otg_status == 1){
1867 bat->usb_charging = 1;
1868 if(bat -> pdata ->control_usb_charging)
1869 bat -> pdata ->control_usb_charging(0);
1870 }else if(otg_status == 2){
1871 bat->usb_charging = 0;
1872 bat -> ac_charging = 1;
1873 if(bat -> pdata ->control_usb_charging)
1874 bat -> pdata ->control_usb_charging(1);
1876 bat->usb_charging = 0;
1878 printk("charge_status = %d\n",otg_status);
1880 power_supply_changed(&bat ->ac);
1881 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1882 power_supply_changed(&bat ->usb);
1884 if((bat -> ac_charging == 1)||(bat->usb_charging == 1)){
1885 bat ->old_charge_level =1;
1886 bat->charge_level = 1;
1889 bat ->old_charge_level =0;
1890 bat->charge_level = 0;
1897 static void rk30_adc_battery_check(struct rk30_adc_battery_data *bat)
1901 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1902 int check_data[NUM_VOLTAGE_SAMPLE];
1903 //bat ->old_charge_level
1904 // pSamples = bat->adc_samples;
1906 adc_sync_read(bat->client); //start adc sample
1908 DBG("first_adc_value is %d \n",bat->adc_val );
1909 level = oldlevel = rk_adc_battery_poweron_status(bat);// rk30_adc_battery_status_samples(bat);//init charge status
1911 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){ //0.3 s
1913 rk30_adc_battery_voltage_samples(bat); //get voltage
1914 //level = rk30_adc_battery_status_samples(bat); //check charge status
1916 level = rk_adc_battery_poweron_status(bat);
1918 if (oldlevel != level){
1919 oldlevel = level; //if charge status changed, reset sample
1924 for(i=0; i< NUM_VOLTAGE_SAMPLE; i++){
1926 check_data[i] = bat->adc_val;
1928 adc_async_read(bat->client);
1929 bat->adc_value += check_data[i];
1931 bat->adc_value /= NUM_VOLTAGE_SAMPLE;
1933 bat->bat_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage); //init bat_capacity
1934 bat->capacitytmp = bat->bat_capacity;
1935 level = rk_adc_battery_poweron_status(bat);
1936 if((1 == level)&&(0 == bat->start_voltage_status )){
1937 bat->charge_start_voltage = bat->bat_voltage;
1938 bat->start_voltage_status = 1;
1939 bat->charge_start_capacity = bat->bat_capacity;
1940 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1941 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1944 if (get_ac_status(bat) ){
1945 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1946 bat -> ac_charging = 1;
1947 if (is_charge_ok(bat) == 1){
1948 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1949 bat->bat_capacity = 100;
1952 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1953 if( 0 != dwc_otg_check_dpdm() ){
1954 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1955 if (is_charge_ok(bat) == 1){
1956 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1957 bat->bat_capacity = 100;
1961 if(dwc_otg_check_dpdm() == 1){
1962 bat->usb_charging = 1;
1963 if(bat -> pdata ->control_usb_charging)
1964 bat -> pdata ->control_usb_charging(0);
1965 }else if(dwc_otg_check_dpdm() == 2){
1966 bat->usb_charging = 0;
1967 bat -> ac_charging = 1;
1968 if(bat -> pdata ->control_usb_charging)
1969 bat -> pdata ->control_usb_charging(1);
1971 bat->usb_charging = 0;
1974 power_supply_changed(&bat ->ac);
1975 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1976 power_supply_changed(&bat ->usb);
1978 if((bat -> ac_charging == 1)||(bat->usb_charging == 1)){
1979 bat ->old_charge_level =1;
1980 bat->charge_level = 1;
1985 if (bat->bat_capacity == 0) {
1986 bat->bat_capacity = 1;
1987 system_lowerpower = 1;
1991 if(0 !=bat ->pdata->low_voltage_protection ){
1992 if((bat->bat_voltage <= bat ->pdata->low_voltage_protection))
1993 system_lowerpower = 1;
1994 printk("protection lower power .....\n");
1996 if((bat->bat_voltage <= BATT_ZERO_VOL_VALUE))
1997 system_lowerpower = 1;
1998 printk("lower power .....\n");
2002 if ((bat->bat_voltage <= BATT_ZERO_VOL_VALUE)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING)){
2009 static void rk30_adc_battery_callback(struct adc_client *client, void *param, int result)
2011 struct rk30_adc_battery_data *bat = container_of((client), \
2012 struct rk30_adc_battery_data, client);
2015 DBG("adc_battery_callback resule < 0 , the value ");
2018 gBatteryData->adc_val = result;
2019 DBG("result = %d, gBatteryData->adc_val = %d\n", result, gBatteryData->adc_val );
2024 static void rk30_adc_battery_lowerpower_delaywork(struct work_struct *work)
2028 struct rk30_adc_battery_data *bat = container_of((work), \
2029 struct rk30_adc_battery_data, lowerpower_work);
2031 if( bat->pdata->batt_low_pin != INVALID_GPIO){
2032 irq = gpio_to_irq(bat ->pdata ->batt_low_pin);
2036 printk("lowerpower\n");
2037 rk28_send_wakeup_key(); // wake up the system
2042 static irqreturn_t rk30_adc_battery_low_wakeup(int irq,void *dev_id)
2044 queue_work(gBatteryData->wq, &gBatteryData->lowerpower_work);
2047 static void rk_lowerpower_check(struct rk30_adc_battery_data *bat)
2051 int check_data[NUM_VOLTAGE_SAMPLE];
2053 for(i=0; i< NUM_VOLTAGE_SAMPLE; i++){
2055 adc_async_read(bat->client);
2056 check_data[i] = bat->adc_val;
2058 adc_val += check_data[i];
2060 adc_val /=NUM_VOLTAGE_SAMPLE;
2062 DBG(">>>>>>>>>>>one>>>%d, two<<<<<%d<<<<\n",bat->adc_value,adc_val);
2063 DBG(">>>>>>>>>>>firset-value>>>%d, second-value<<<<<%d<<<<\n",rk_adc_voltage(bat, bat->adc_value),rk_adc_voltage(bat, adc_val));
2065 if((adc_val >= bat->adc_value+5) &&(bat->bat_status == POWER_SUPPLY_STATUS_NOT_CHARGING ) )//
2067 printk("%d,%d\n",adc_val,bat->adc_value);
2068 printk("lower-power shutdown");
2073 static void rk_adc_battery_check_work(struct work_struct *work)
2075 struct rk30_adc_battery_data *bat = container_of((work), \
2076 struct rk30_adc_battery_data, check_work);
2078 if(1 == get_ac_status(bat)){
2079 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
2080 bat -> ac_charging = 1;
2083 power_supply_changed(&bat ->ac);
2084 if(bat->stop_check != 1)
2085 queue_delayed_work(bat ->wq, &bat ->check_work, msecs_to_jiffies(TIMER_MS_COUNTS));
2088 static void poweron_lowerpoer_handle(struct rk30_adc_battery_data *bat)
2090 #ifdef CONFIG_LOGO_LOWERPOWER_WARNING
2091 if((1 == get_battery_status())&&(bat->bat_status == POWER_SUPPLY_STATUS_NOT_CHARGING )){
2098 static int battery_notifier_call(struct notifier_block *nb,
2099 unsigned long event, void *data)
2101 struct rk30_adc_battery_data *bat=
2102 container_of(nb, struct rk30_adc_battery_data, battery_nb);
2107 rk_lowerpower_check(bat);//for lower power protect
2112 poweron_lowerpoer_handle(bat);
2119 static int rk30_adc_battery_probe(struct platform_device *pdev)
2125 struct adc_client *client;
2126 struct rk30_adc_battery_data *data;
2127 struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
2128 #ifdef CONFIG_MACH_RK_FAC
2130 for(i=0;i<BATT_NUM;i++)
2132 batt_table[6+i]=pdata->chargeArray[i];
2133 batt_table[BATT_NUM+6+i]=pdata->chargeArray[i];
2136 gSecondsCnt = get_seconds();
2137 data = kzalloc(sizeof(*data), GFP_KERNEL);
2140 goto err_data_alloc_failed;
2142 memset(data, 0, sizeof(struct rk30_adc_battery_data));
2143 gBatteryData = data;
2145 platform_set_drvdata(pdev, data);
2147 data->pdata = pdata;
2148 data->status_lock = 0;
2149 data->old_charge_level = -1;
2150 data->capacitytmp = 0;
2151 data->suspend_capacity = 0;
2152 data->ac_charging = 0;
2153 data->usb_charging = 0;
2154 data->full_times = 0;
2155 data->gBatCapacityDisChargeCnt =0;
2156 data->gBatCapacityChargeCnt=0;
2157 data->gBatCapacityusbdisChargeCnt=0 ;
2158 data->gBatCapacityusbChargeCnt =0;
2159 data->gBatCapacityacChargeCnt = 0;
2160 data->charge_source_now = 0;
2161 data->charge_soure_old = 0;
2162 data->start_voltage_status = 0;
2163 data->charge_full_flag =0;
2164 data->pSamples = data->adc_samples;
2165 data->lower_power_flag = 0;
2166 data->capacitytmp = 0;
2167 data->time_to_full = 0;
2168 data->stop_check = 0;
2169 data->voltage_to_local = 0;
2171 data->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
2172 wake_lock_init(&batt_wake_lock, WAKE_LOCK_SUSPEND, "batt_lock");
2173 wake_lock_init(&charge_display_lock, WAKE_LOCK_SUSPEND, "charge_display_lock"); //charge_display_lock
2174 wake_lock_init(&batt_wake_lock_detect_lowpower, WAKE_LOCK_SUSPEND, "lowpower_lock");
2176 ret = rk30_adc_battery_io_init(pdata);
2182 memset(data->adc_samples, 0, sizeof(int)*(NUM_VOLTAGE_SAMPLE + 2));
2184 //register adc for battery sample
2185 if(0 == pdata->adc_channel)
2186 client = adc_register(0, rk30_adc_battery_callback, NULL); //pdata->adc_channel = ani0
2188 client = adc_register(pdata->adc_channel, rk30_adc_battery_callback, NULL);
2191 goto err_adc_register_failed;
2193 data->wq = create_singlethread_workqueue("adc_battd");
2196 data->client = client;
2197 data->adc_val = adc_sync_read(client);
2199 data ->bat = rk30_battery_supply;
2200 ret = power_supply_register(&pdev->dev,&data ->bat);
2203 printk(KERN_INFO "fail to battery power_supply_register\n");
2204 goto err_battery_failed;
2206 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
2207 data ->usb = rk30_usb_supply;
2208 ret = power_supply_register(&pdev->dev, &data ->usb);
2211 printk(KERN_INFO "fail to usb power_supply_register\n");
2212 goto err_usb_failed;
2215 data ->ac = rk30_ac_supply;
2216 ret = power_supply_register(&pdev->dev, &data ->ac);
2219 printk(KERN_INFO "fail to ac power_supply_register\n");
2223 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
2224 //init dc dectet irq & delay work
2225 if (pdata->dc_det_pin != INVALID_GPIO){
2226 INIT_WORK(&data->dcwakeup_work, rk30_adc_battery_dcdet_delaywork);
2228 irq = gpio_to_irq(pdata->dc_det_pin);
2229 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
2230 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);
2233 printk("failed to request dc det irq\n");
2234 goto err_dcirq_failed;
2236 enable_irq_wake(irq);
2242 ret = device_create_file(&pdev->dev,&dev_attr_batparam);
2245 printk(KERN_ERR "failed to create bat param file\n");
2246 goto err_battery_failed;
2249 ret = create_sysfs_interfaces(&pdev->dev);
2254 "device rk30_adc_batterry sysfs register failed\n");
2258 //Power on Battery detect
2259 rk30_adc_battery_check(data);
2261 // data->wq = create_singlethread_workqueue("adc_battd");
2262 INIT_DELAYED_WORK(&data->delay_work, rk30_adc_battery_timer_work);
2264 if(1 == pdata->save_capacity ){
2265 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS*10));
2266 data ->poweron_check = 1;
2268 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
2269 data ->poweron_check = 0;
2271 INIT_DELAYED_WORK(&data->check_work, rk_adc_battery_check_work);
2272 queue_delayed_work(data ->wq, &data ->check_work, msecs_to_jiffies(TIMER_MS_COUNTS));
2273 if( pdata->batt_low_pin != INVALID_GPIO){
2275 if (gpio_get_value(pdata->batt_low_pin) ==0){
2277 if (gpio_get_value(pdata->batt_low_pin) ==0){
2278 printk("lower power\n");
2283 INIT_WORK(&data->lowerpower_work, rk30_adc_battery_lowerpower_delaywork);
2284 irq = gpio_to_irq(pdata->batt_low_pin);
2285 ret = request_irq(irq, rk30_adc_battery_low_wakeup, IRQF_TRIGGER_LOW, "batt_low_irq", NULL);
2288 printk("failed to request batt_low_irq irq\n");
2289 goto err_lowpowerirq_failed;
2294 data->battery_nb.notifier_call = battery_notifier_call;
2295 register_adc_battery_notifier(&data->battery_nb);
2297 printk(KERN_INFO "rk30_adc_battery: driver initialized\n");
2302 power_supply_unregister(&data ->usb);
2304 power_supply_unregister(&data ->ac);
2307 power_supply_unregister(&data ->bat);
2310 if (pdata->dc_det_pin != INVALID_GPIO){
2311 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
2314 err_lowpowerirq_failed:
2315 if( pdata->batt_low_pin != INVALID_GPIO){
2316 free_irq(gpio_to_irq(pdata->batt_low_pin), data);
2319 err_adc_register_failed:
2321 err_data_alloc_failed:
2324 printk("rk30_adc_battery: error!\n");
2329 static int rk30_adc_battery_remove(struct platform_device *pdev)
2331 struct rk30_adc_battery_data *data = platform_get_drvdata(pdev);
2332 struct rk30_adc_battery_platform_data *pdata = pdev->dev.platform_data;
2334 cancel_delayed_work_sync(&data->delay_work);
2335 #if defined (CONFIG_BATTERY_RK30_AC_CHARGE)
2336 if (pdata->dc_det_pin != INVALID_GPIO)
2337 cancel_delayed_work_sync(&data->dcwakeup_work);
2339 cancel_delayed_work_sync(&data->check_work);
2341 if( pdata->batt_low_pin != INVALID_GPIO)
2342 cancel_delayed_work_sync(&data->lowerpower_work);
2343 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
2344 power_supply_unregister(&data ->usb);
2346 power_supply_unregister(&data ->ac);
2347 power_supply_unregister(&data ->bat);
2348 if (pdata->dc_det_pin != INVALID_GPIO)
2349 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
2356 static struct platform_driver rk30_adc_battery_driver = {
2357 .probe = rk30_adc_battery_probe,
2358 .remove = rk30_adc_battery_remove,
2359 .suspend = rk30_adc_battery_suspend,
2360 .resume = rk30_adc_battery_resume,
2362 .name = "rk30-battery",
2363 .owner = THIS_MODULE,
2367 static int __init rk30_adc_battery_init(void)
2369 return platform_driver_register(&rk30_adc_battery_driver);
2372 static void __exit rk30_adc_battery_exit(void)
2374 platform_driver_unregister(&rk30_adc_battery_driver);
2376 //module_init(rk30_adc_battery_init);//module_init(rk30_adc_battery_init);//
2377 subsys_initcall(rk30_adc_battery_init);
2378 //fs_initcall(rk30_adc_battery_init);
2379 module_exit(rk30_adc_battery_exit);
2381 MODULE_DESCRIPTION("Battery detect driver for the rk30");
2382 MODULE_AUTHOR("luowei lw@rock-chips.com");
2383 MODULE_LICENSE("GPL");