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 <linux/adc.h>
29 #include <linux/delay.h>
30 #include <linux/ktime.h>
31 #include <linux/slab.h>
32 #include <linux/syscalls.h>
34 #include <linux/wakelock.h>
36 #include <linux/string.h>
37 #include <linux/init.h>
38 #include <linux/suspend.h>
39 #include <linux/gpio.h>
40 #include <linux/of_gpio.h>
41 #include <linux/power/rockchip-adc-battery.h>
42 #include <linux/iio/iio.h>
43 #include <linux/iio/machine.h>
44 #include <linux/iio/driver.h>
45 #include <linux/iio/consumer.h>
47 #include <asm/system_misc.h>
48 #ifdef CONFIG_EARLYSUSPEND
49 /* kernel/power/earlysuspend.c */
50 extern suspend_state_t get_suspend_state(void);
53 static int rk30_battery_dbg_level;
54 module_param_named(dbg_level, rk30_battery_dbg_level, int, 0644);
55 #define DBG( args...) \
57 if (rk30_battery_dbg_level) {\
62 #define TIMER_MS_COUNTS 1000
63 #define SLOPE_SECOND_COUNTS 15
64 #define DISCHARGE_MIN_SECOND 30
65 #define CHARGE_MIN_SECOND 30
66 #define CHARGE_MID_SECOND 90
67 #define CHARGE_MAX_SECOND 250
68 #define CHARGE_FULL_DELAY_TIMES 10
69 #define USBCHARGE_IDENTIFY_TIMES 2
71 #define NUM_VOLTAGE_SAMPLE ((SLOPE_SECOND_COUNTS * 1000) / TIMER_MS_COUNTS)
72 #define NUM_DISCHARGE_MIN_SAMPLE ((DISCHARGE_MIN_SECOND * 1000) / TIMER_MS_COUNTS)
73 #define NUM_CHARGE_MIN_SAMPLE ((CHARGE_MIN_SECOND * 1000) / TIMER_MS_COUNTS)
74 #define NUM_CHARGE_MID_SAMPLE ((CHARGE_MID_SECOND * 1000) / TIMER_MS_COUNTS)
75 #define NUM_CHARGE_MAX_SAMPLE ((CHARGE_MAX_SECOND * 1000) / TIMER_MS_COUNTS)
76 #define NUM_CHARGE_FULL_DELAY_TIMES ((CHARGE_FULL_DELAY_TIMES * 1000) / TIMER_MS_COUNTS)
77 #define NUM_USBCHARGE_IDENTIFY_TIMES ((USBCHARGE_IDENTIFY_TIMES * 1000) / TIMER_MS_COUNTS)
79 #define CHARGE_IS_OK 1
80 #define INVALID_CHARGE_CHECK -1
82 #if defined(CONFIG_ARCH_RK3066B)
83 #define BAT_DEFINE_VALUE 1800
84 #elif defined(CONFIG_ARCH_RK2928)
85 #define BAT_DEFINE_VALUE 3300
87 #define BAT_DEFINE_VALUE 3300 /*2500*/
90 #define RK30_GPIO_LOW 0
91 #define RK30_GPIO_HIGH 1
95 #define BATT_FILENAME "/data/bat_last_capacity.dat"
101 int battery_dbg_level = 0;
102 int battery_test_flag = 0;
103 int gVoltageCnt = 3400;
104 int gDoubleVoltageCnt = 6800;
105 unsigned long gSecondsCnt = 0;
106 char gDischargeFlag[4] = {"on "};
111 #define BATT_MAX_VOL_VALUE 4250/*Full charge volatge*/
112 #define BATT_ZERO_VOL_VALUE 3500/*power down voltage*/
113 #define BATT_NOMAL_VOL_VALUE 3800
115 static int batt_table[2*BATT_NUM+6] =
117 0x4B434F52,0x7461625F,0x79726574,0,100,100,
118 3496, 3548, 3599, 3626, 3655, 3697, 3751, 3812, 3877, 3949, 4030, //discharge
119 3540, 3785, 3842, 3861, 3915, 3980, 4041, 4135, 4169, 4175, 4185 //charge
121 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
123 #define BATT_MAX_VOL_VALUE 8284 //Full charge voltage
124 #define BATT_ZERO_VOL_VALUE 6900 // power down voltage
125 #define BATT_NOMAL_VOL_VALUE 7600
128 static int batt_table[2*BATT_NUM+6] =
130 0x4B434F52,0x7461625F,0x79726574,1,300,100,
131 6800, 7242, 7332, 7404, 7470, 7520, 7610, 7744, 7848, 8016, 8284,//discharge
132 7630, 7754, 7852, 7908, 7956, 8024, 8112, 8220, 8306, 8318, 8328//charge
134 #define adc_to_voltage(adc_val) ((adc_val * BAT_DEFINE_VALUE * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]))
141 /********************************************************************************/
148 BATTERY_CAPACITY = 3,
149 BATTERY_AC_ONLINE = 4,
150 BATTERY_STATUS_CHANGED = 5,
151 AC_STATUS_CHANGED = 6,
152 BATTERY_INT_STATUS = 7,
153 BATTERY_INT_ENABLE = 8,
164 struct rk30_adc_battery_data {
167 //struct timer_list timer;
168 struct workqueue_struct *wq;
169 struct delayed_work delay_work;
170 struct delayed_work check_work;
171 struct work_struct dcwakeup_work;
172 struct work_struct lowerpower_work;
175 struct rk30_adc_battery_platform_data *pdata;
177 struct adc_client *client;
179 int adc_samples[NUM_VOLTAGE_SAMPLE+2];
189 int old_charge_level;
191 int gBatCapacityDisChargeCnt;
192 int gBatCapacityChargeCnt;
193 int gBatCapacityacChargeCnt;
194 int gBatCapacityusbChargeCnt ;
195 int gBatCapacityusbdisChargeCnt;
197 int suspend_capacity;
198 int gBatUsbChargeCnt;
201 struct power_supply bat;
202 struct power_supply usb;
203 struct power_supply ac;
204 struct power_supply bk_bat;
212 int charge_source_now;
213 int charge_soure_old;
214 int charge_start_capacity;
215 int charge_start_voltage;
216 int start_voltage_status;
217 int charge_up_proprotion;
218 int charge_down_proportion;
219 int voltage_to_local;
220 unsigned long suspend_time;
221 unsigned long resume_time;
225 int charge_full_flag;
227 struct notifier_block battery_nb;
229 int lower_power_flag;
233 static struct rk30_adc_battery_data *gBatteryData;
234 static struct wake_lock batt_wake_lock;
235 static struct wake_lock batt_wake_lock_detect_lowpower;
236 static struct wake_lock charge_display_lock;
237 int system_lowerpower = 0;
238 extern void kernel_power_off(void);
239 extern int dwc_vbus_status(void);
240 extern int get_gadget_connect_flag(void);
241 extern int dwc_otg_check_dpdm(void);
242 static int is_charge_ok(struct rk30_adc_battery_data *bat);
243 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat);
244 extern void rk_send_wakeup_key(void);
245 static bool batt_gpio_is_valid(int number)
247 return number > 0 && number < 256;
250 static void v86_pm_power_off(void)
253 bool isCharging = false;
254 if (batt_gpio_is_valid(gBatteryData->pdata->dc_det_pin)){
255 if (gpio_get_value (gBatteryData->pdata->dc_det_pin) == gBatteryData->pdata->dc_det_level){
261 //gpio_direction_output(pwr_hold, GPIO_LOW);
262 printk("xhh ========= v86_pm_power_off \n");
263 gpio_request(pwr_hold, NULL);
267 printk("xhh ========= isCharging \n");
268 arm_pm_restart('h', "charge");
272 printk("xhh ========= power off \n");
273 gpio_direction_output(pwr_hold, RK30_GPIO_LOW);
274 gpio_set_value(pwr_hold,RK30_GPIO_LOW);
281 //#define BAT_ADC_TABLE_LEN 11
282 static ssize_t bat_param_read(struct device *dev,struct device_attribute *attr, char *buf)
285 for(i=0;i<BATT_NUM;i++)
286 printk("i=%d batt_table=%d\n",i+6,batt_table[i+6]);
288 for(i=0;i<BATT_NUM;i++)
289 printk("i=%d batt_table=%d\n",i+17,batt_table[i+17]);
292 DEVICE_ATTR(batparam, 0444, bat_param_read, NULL);
295 static ssize_t rkbatt_show_debug_attrs(struct device *dev,
296 struct device_attribute *attr, char *buf)
298 return sprintf(buf, "%d\n", battery_dbg_level);
301 static ssize_t rkbatt_restore_debug_attrs(struct device *dev,
302 struct device_attribute *attr, const char *buf, size_t size)
306 sscanf(buf, "%d", &liTmp);
308 if(liTmp != 0 && liTmp != 1)
310 dev_err(dev, "rk29adc_restore_debug_attrs err\n");
314 battery_dbg_level = liTmp;
319 static ssize_t rkbatt_show_state_attrs(struct device *dev,
320 struct device_attribute *attr, char *buf)
322 // struct rk30_adc_battery_platform_data *pdata = gBatteryData->pdata;
323 int charge_ok_value =0 ;
324 charge_ok_value = is_charge_ok(gBatteryData) ;
327 "gBatVol=%d,gBatCap=%d,charge_ok=%d,%s\n",
328 gBatteryData->bat_voltage,gBatteryData->bat_capacity,
329 charge_ok_value,gDischargeFlag);
332 static ssize_t rkbatt_restore_state_attrs(struct device *dev,
333 struct device_attribute *attr, const char *buf, size_t size)
338 static ssize_t rkbatt_show_value_attrs(struct device *dev,
339 struct device_attribute *attr, char *buf)
341 return sprintf(buf, "pull_up_res =%d,\npull_down_res=%d\n", batt_table[4],batt_table[5]);
344 static ssize_t rkbatt_restore_value_attrs(struct device *dev,
345 struct device_attribute *attr, const char *buf, size_t size)
350 sscanf(buf, "%d,%d", &liUp,&liDown);
352 if(liUp != 0 && liDown != 0)
354 batt_table[4] = liUp;
355 batt_table[5] = liDown;
360 static ssize_t rkbatt_show_flag_attrs(struct device *dev,
361 struct device_attribute *attr, char *buf)
363 return sprintf(buf, "rk29_battery_test_flag=%d\n", battery_test_flag);
365 static ssize_t rkbatt_restore_flag_attrs(struct device *dev,
366 struct device_attribute *attr, const char *buf, size_t size)
370 sscanf(buf, "%d", &liFlag);
374 battery_test_flag = liFlag;
378 static struct device_attribute rkbatt_attrs[] = {
379 __ATTR(state, 0664, rkbatt_show_state_attrs, rkbatt_restore_state_attrs),
380 __ATTR(debug, 0664, rkbatt_show_debug_attrs, rkbatt_restore_debug_attrs),
381 __ATTR(value, 0555, rkbatt_show_value_attrs, rkbatt_restore_value_attrs),
382 __ATTR(flag, 0555, rkbatt_show_flag_attrs, rkbatt_restore_flag_attrs),
385 static int rk_adc_battery_iio_read(struct rk30_adc_battery_platform_data *data)
387 struct iio_channel *channel = data->chan;
390 ret = iio_read_channel_raw(channel, &val);
392 pr_err("read channel() error: %d\n", ret);
399 static int create_sysfs_interfaces(struct device *dev)
402 for (liTmep = 0; liTmep < ARRAY_SIZE(rkbatt_attrs); liTmep++) {
404 if (device_create_file(dev, rkbatt_attrs + liTmep)){
412 for ( ; liTmep >= 0; liTmep--){
413 device_remove_file(dev, rkbatt_attrs + liTmep);
416 dev_err(dev, "%s:Unable to create sysfs interface\n", __func__);
422 static int rk30_adc_battery_load_capacity(void)
425 int* p = (int *)value;
426 long fd = sys_open(BATT_FILENAME,O_RDONLY,0);
429 DBG("rk30_adc_battery_load_capacity: open file /data/bat_last_capacity.dat failed\n");
433 sys_read(fd,(char __user *)value,4);
439 static void rk30_adc_battery_put_capacity(int loadcapacity)
442 int* p = (int *)value;
443 long fd = sys_open(BATT_FILENAME,O_CREAT | O_RDWR,0);
446 DBG("rk30_adc_battery_put_capacity: open file /data/bat_last_capacity.dat failed\n");
451 sys_write(fd, (const char __user *)value, 4);
454 static BLOCKING_NOTIFIER_HEAD(adc_battery_chain_head);
456 int register_adc_battery_notifier(struct notifier_block *nb)
458 return blocking_notifier_chain_register(&adc_battery_chain_head, nb);
460 EXPORT_SYMBOL_GPL(register_adc_battery_notifier);
462 int unregister_adc_battery_notifier(struct notifier_block *nb)
464 return blocking_notifier_chain_unregister(&adc_battery_chain_head, nb);
466 EXPORT_SYMBOL_GPL(unregister_adc_battery_notifier);
468 int adc_battery_notifier_call_chain(unsigned long val)
470 return (blocking_notifier_call_chain(&adc_battery_chain_head, val, NULL)
471 == NOTIFY_BAD) ? -EINVAL : 0;
473 EXPORT_SYMBOL_GPL(adc_battery_notifier_call_chain);
475 static void rk_start_charge(struct rk30_adc_battery_data *bat)
477 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
478 if (batt_gpio_is_valid(pdata->charge_set_pin))
479 gpio_direction_output(pdata->charge_set_pin, pdata->charge_set_level);
482 static void rk_stop_charge(struct rk30_adc_battery_data *bat)
484 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
487 if (batt_gpio_is_valid(pdata->charge_set_pin))
488 gpio_direction_output(pdata->charge_set_pin, 1 - pdata->charge_set_level);
491 static int get_ac_status(struct rk30_adc_battery_data *bat){
493 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
495 if (batt_gpio_is_valid(pdata->dc_det_pin)) {
496 if (gpio_get_value (pdata->dc_det_pin) == pdata->dc_det_level){
502 if(pdata->is_dc_charging){
503 status = pdata->is_dc_charging();
509 #if defined CONFIG_BATTERY_RK30_USB_CHARGE
511 //state of charge ----running
512 static int get_usb_status2(struct rk30_adc_battery_data *bat){
514 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
515 int usb_status = 0; // 0--dischage ,1 ---usb charge, 2 ---ac charge
516 int vbus_status = dwc_vbus_status();
518 if (1 == vbus_status) {
519 if (0 == get_gadget_connect_flag()){
520 if (++bat->gBatUsbChargeCnt >= NUM_USBCHARGE_IDENTIFY_TIMES){
521 bat->gBatUsbChargeCnt = NUM_USBCHARGE_IDENTIFY_TIMES + 1;
522 usb_status = 2; // non-standard AC charger
523 if(bat ->pdata ->control_usb_charging)
524 bat ->pdata ->control_usb_charging(1);
526 usb_status = 1; // connect to pc
527 if(bat ->pdata ->control_usb_charging)
528 bat ->pdata ->control_usb_charging(0);
532 usb_status = 1; // connect to pc
533 if(bat ->pdata ->control_usb_charging)
534 bat ->pdata ->control_usb_charging(0);
539 bat->gBatUsbChargeCnt = 0;
540 if (2 == vbus_status) {
541 usb_status = 2; //standard AC charger
543 if(bat ->pdata ->control_usb_charging)
544 bat ->pdata ->control_usb_charging(1);
555 static int rk_battery_get_status(struct rk30_adc_battery_data *bat)
558 /* struct rk30_adc_battery_platform_data *pdata = bat->pdata;*/
559 int ac_ac_charging = 0, usb_ac_charging = 0;
562 ac_ac_charging = get_ac_status(bat);
563 if(1 == ac_ac_charging)
566 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
567 if (strstr(saved_command_line,"charger")){
568 wake_lock(&charge_display_lock); //lock
569 if (batt_gpio_is_valid(bat->pdata->usb_det_pin)) {
570 if( gpio_get_value(bat->pdata->usb_det_pin)== bat->pdata->usb_det_level){
571 if(( 1 == usb_ac_charging )||( 1 == ac_ac_charging ))
572 bat -> ac_charging = 1;
573 if(( 1 == bat->usb_charging)||(1 == bat ->ac_charging))
577 if(( 0 == usb_ac_charging )&&( 0 == ac_ac_charging ))
578 bat -> ac_charging = 0;
580 bat->ac_charging = 1;
582 bat->usb_charging = 0;
583 if(1 == bat->ac_charging)
591 if(dwc_otg_check_dpdm() == 0){
592 bat->usb_charging = 0;
594 }else if(dwc_otg_check_dpdm() == 1){
595 bat->usb_charging = 1;
596 if(bat -> pdata ->control_usb_charging)
597 bat -> pdata ->control_usb_charging(0);
598 }else if(dwc_otg_check_dpdm() == 2){
599 bat->usb_charging = 0;
601 if(bat -> pdata ->control_usb_charging)
602 bat -> pdata ->control_usb_charging(1);
604 if((1 == usb_ac_charging)||(1 == ac_ac_charging))
605 bat ->ac_charging = 1;
607 bat ->ac_charging = 0;
609 if(( 0 == bat ->ac_charging )&&(0 == bat->usb_charging )){
620 usb_ac_charging = get_usb_status2(bat); //0 --discharge, 1---usb charging,2----AC charging;
621 if(1 == usb_ac_charging)
622 bat->usb_charging = 1;
624 bat->usb_charging = 0;
627 if((usb_ac_charging == 2)||(ac_ac_charging == 1))
628 bat -> ac_charging = 1;
630 bat -> ac_charging = 0;
632 if((bat->usb_charging == 1)||(bat ->ac_charging ==1))
635 if(1 == bat->ac_charging )
636 bat->charge_source_now = 1; //ac charge
637 else if( 1 == bat->usb_charging){
638 bat->charge_source_now = 2; //ac charge
640 bat->charge_soure_old =0;
641 bat->charge_source_now=0;
643 if(bat->charge_source_now != bat->charge_soure_old){
645 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){ //0.3 s
646 msleep(1); //mdelay --- > msleep
647 rk30_adc_battery_voltage_samples(bat); //get new voltage
650 bat->charge_soure_old = bat->charge_source_now;
653 DBG("ac_status=%d,usb_status=%d bat->bat_change = %d\n",bat -> ac_charging, bat->usb_charging ,bat->bat_change );
658 static int is_charge_ok(struct rk30_adc_battery_data *bat)
660 int charge_is_ok = 0;
661 struct rk30_adc_battery_platform_data *pdata = bat->pdata;
663 if( 1 != bat->charge_level)
666 if ((!(batt_gpio_is_valid(pdata->charge_ok_pin))) && (
667 pdata->charging_ok == NULL))
670 if (batt_gpio_is_valid(pdata->charge_ok_pin)) {
671 if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
674 }else if( pdata->charging_ok){
676 charge_is_ok = pdata->charging_ok();
684 static int rk30_adc_battery_status_samples(struct rk30_adc_battery_data *bat)
688 charge_level = bat ->charge_level;//rk_battery_get_status(bat);
690 if (charge_level != bat->old_charge_level){
691 bat->old_charge_level = charge_level;
695 rk_start_charge(bat);
701 bat->bat_status_cnt = 0;
703 if(( 1 == charge_level )&&(1 == bat->charge_full_flag) && (bat->bat_capacity < 90)){
704 rk_start_charge(bat); //recharge
705 if(bat->pdata->ctrl_charge_led != NULL)
706 bat->pdata->ctrl_charge_led(0);
708 }else if (charge_level) {
709 rk_start_charge(bat);
716 if(charge_level == 0){
718 bat->charge_full_flag = 0;
720 bat->time_to_full = 0;
721 bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
724 if( is_charge_ok(bat) == INVALID_CHARGE_CHECK){
725 if (bat->bat_capacity == 100){
726 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
727 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
729 bat->charge_full_flag = 1;
730 if(bat->pdata->ctrl_charge_led != NULL)
731 bat->pdata->ctrl_charge_led(1);
736 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
737 if((bat->bat_capacity == 99)&&(bat->time_to_full == 0)){
738 bat->time_to_full = get_seconds();
739 }else if(bat->bat_capacity == 99)
741 if(get_seconds() - bat->time_to_full > 1800){
742 bat->bat_capacity = 100;
743 bat->time_to_full = 0;
748 if(bat->pdata->ctrl_charge_led != NULL)
749 bat->pdata->ctrl_charge_led(0);
751 }else{ // pin of charge_ok_pin
752 if (is_charge_ok(bat) != CHARGE_IS_OK ){
755 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
757 if((bat->bat_capacity == 99)&&(bat->time_to_full == 0)){
758 bat->time_to_full = get_seconds();
759 }else if(bat->bat_capacity == 99)
761 if(get_seconds() - bat->time_to_full > 1800){
762 bat->bat_capacity = 100;
763 bat->time_to_full = 0;
772 if (bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) {
773 bat->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
776 if ((bat->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) && (bat->bat_capacity >= 99)){
777 if (bat->bat_status != POWER_SUPPLY_STATUS_FULL){
778 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
780 bat->bat_capacity = 100;
785 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
793 static int rk_adc_voltage(struct rk30_adc_battery_data *bat, int value)
797 int ref_voltage; //reference_voltage
801 ref_voltage = bat ->pdata->reference_voltage;
802 pullup_res = bat ->pdata->pull_up_res;
803 pulldown_res = bat ->pdata->pull_down_res;
805 if(ref_voltage && pullup_res && pulldown_res){
806 #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026)
807 ref_voltage = adc_get_curr_ref_volt();
809 voltage = ((value * ref_voltage * (pullup_res + pulldown_res)) / (1024 * pulldown_res));
810 DBG("ref_voltage =%d, voltage=%d \n", ref_voltage,voltage);
814 if(bat ->capacitytmp < 5)
815 ref_voltage = adc_get_curr_ref_volt();
817 ref_voltage = adc_get_def_ref_volt();
819 #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026)
820 ref_voltage = adc_get_curr_ref_volt();
821 voltage = (value * ref_voltage * (batt_table[4] +batt_table[5])) / (1024 *batt_table[5]);
823 voltage = adc_to_voltage(value);
827 DBG("ref_voltage =%d, voltage=%d \n", ref_voltage,voltage);
831 static void rk_handle_ripple(struct rk30_adc_battery_data *bat, int status)
836 if (bat->pdata->use_board_table){
837 p_table = bat->pdata->board_batt_table;
840 if(bat->bat_voltage >= p_table[2*BATT_NUM +5]+ 10)
841 bat->bat_voltage = p_table[2*BATT_NUM +5] + 10;
842 else if(bat->bat_voltage <= p_table[BATT_NUM +6] - 10)
843 bat->bat_voltage = p_table[BATT_NUM +6] - 10;
846 if(bat->bat_voltage >= p_table[BATT_NUM +5]+ 10)
847 bat->bat_voltage = p_table[BATT_NUM +5] + 10;
848 else if(bat->bat_voltage <= p_table[6] - 10)
849 bat->bat_voltage = p_table[6] - 10;
855 //static int *pSamples;
856 static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
859 int i,*pStart = bat->adc_samples, num = 0;
860 int level = bat->charge_level;
863 value = bat->adc_val;
864 bat->adc_val = rk_adc_battery_iio_read(bat->pdata);
866 *(bat->pSamples++) = rk_adc_voltage(bat,value);
868 bat->bat_status_cnt++;
869 if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE) bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
871 num = bat->pSamples - pStart;
873 if (num >= NUM_VOLTAGE_SAMPLE){
874 bat ->pSamples = pStart;
875 num = NUM_VOLTAGE_SAMPLE;
880 for (i = 0; i < num; i++){
881 value += bat->adc_samples[i];
883 bat->bat_voltage = value / num;
886 if(battery_test_flag == 0)
888 if(0 == bat->pdata->use_board_table){
890 if(bat->bat_voltage >= batt_table[2*BATT_NUM +5]+ 10)
891 bat->bat_voltage = batt_table[2*BATT_NUM +5] + 10;
892 else if(bat->bat_voltage <= batt_table[BATT_NUM +6] - 10)
893 bat->bat_voltage = batt_table[BATT_NUM +6] - 10;
896 if(bat->bat_voltage >= batt_table[BATT_NUM +5]+ 10)
897 bat->bat_voltage = batt_table[BATT_NUM +5] + 10;
898 else if(bat->bat_voltage <= batt_table[6] - 10)
899 bat->bat_voltage = batt_table[6] - 10;
902 rk_handle_ripple(bat, level);
905 }else if(battery_test_flag == 2){
907 if(batt_table[3] == 0){
908 if(bat->bat_voltage < 3400){
909 if((get_seconds() - gSecondsCnt) > 30){
910 gSecondsCnt = get_seconds();
911 if((gVoltageCnt - bat->bat_voltage) > 15){
912 strncpy(gDischargeFlag, "off" ,4);
914 gVoltageCnt = bat->bat_voltage;
919 if(bat->bat_voltage < 3400){
920 bat->bat_voltage = 3400;
924 if(bat->bat_voltage < 6800){
925 if((get_seconds() - gSecondsCnt) > 30){
926 gSecondsCnt = get_seconds();
927 if((gDoubleVoltageCnt - bat->bat_voltage) > 30){
928 strncpy(gDischargeFlag, "off" ,4);
930 gDoubleVoltageCnt =bat->bat_voltage;
933 if(bat->bat_voltage < 6800){
934 bat->bat_voltage = 6800;
940 static int rk30_adc_battery_voltage_to_capacity(struct rk30_adc_battery_data *bat, int BatVoltage)
947 if (bat->pdata->use_board_table)
948 p = bat->pdata->board_batt_table;
949 else if (bat->pdata->dts_batt_table)
950 p = bat->pdata->dts_batt_table;
955 if (1 == bat->charge_level){ //charge
956 if(0 == bat->start_voltage_status ){
957 if(BatVoltage >= (p[2*BATT_NUM +5])){
961 if(BatVoltage <= (p[BATT_NUM +6])){
965 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++){
967 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
969 capacity = (i-(BATT_NUM +6))*10 + ((BatVoltage - p[i]) * 10)/ (p[i+1]- p[i]);
978 DBG("start_voltage=%d,start_capacity =%d\n", bat->charge_start_voltage, bat->charge_start_capacity);
979 DBG("charge_down_proportion =%d,charge_up_proprotion=%d\n",bat ->charge_down_proportion,bat ->charge_up_proprotion);
980 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
981 if(((p[i]) <= bat->charge_start_voltage) && (bat->charge_start_voltage < (p[i+1])))
982 bat->voltage_to_local = i;
983 if(BatVoltage >= (p[2*BATT_NUM +5])){
987 if(BatVoltage <= (p[BATT_NUM +6])){
991 if(BatVoltage <bat->charge_start_voltage){
992 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
993 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
994 if( p[i+1] < bat->charge_start_voltage ){
995 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);
996 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]);
1000 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]);
1001 DBG("2<<<<<< %d capacity = %d BatVoltage =%d p[i] = %d,p[i+1] = %d \n", i,capacity,BatVoltage,p[i], p[i+1]);
1009 if(BatVoltage > bat->charge_start_voltage){
1010 for(i = BATT_NUM +6; i <2*BATT_NUM +5; i++)
1011 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
1012 if( p[i] > bat->charge_start_voltage ){
1013 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]);
1014 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]);
1017 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 );
1018 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]);
1025 if(BatVoltage == bat->charge_start_voltage)
1026 capacity = bat ->charge_start_capacity;
1036 if(BatVoltage >= (p[BATT_NUM +5])){
1040 if(BatVoltage <= (p[6])){
1044 for(i = 6; i < BATT_NUM +5; i++){
1045 if(((p[i]) <= BatVoltage) && (BatVoltage < (p[i+1]))){
1046 capacity = (i-6)*10+ ((BatVoltage - p[i]) *10 )/ (p[i+1]- p[i]) ;
1057 DBG("real_voltage_to_capacity =%d\n" ,capacity);
1061 #if defined CONFIG_BATTERY_RK30_USB_CHARGE
1063 static void rk_usb_charger(struct rk30_adc_battery_data *bat)
1066 int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1067 int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
1069 if((1 == bat ->charge_level)&&( 0 == bat ->start_voltage_status)){
1070 bat ->charge_start_voltage = bat ->bat_voltage;
1071 bat ->start_voltage_status = 1;
1072 bat ->charge_start_capacity = bat ->bat_capacity;
1073 if(bat ->charge_start_capacity%10 != 0){
1074 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1075 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1077 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10;
1078 bat ->charge_down_proportion = bat ->charge_start_capacity/10;
1084 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1086 if (capacity > bat->bat_capacity){
1087 if(capacity > bat->bat_capacity + 10 )
1088 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10; //5s
1089 else if(capacity > bat->bat_capacity + 7 )
1090 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
1091 else if(capacity > bat->bat_capacity + 3 )
1092 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
1093 if (++(bat->gBatCapacityusbChargeCnt) >= timer_of_charge_sample){
1094 bat->gBatCapacityusbChargeCnt = 0;
1095 if (bat->bat_capacity < 99){
1096 bat->bat_capacity++;
1097 bat->bat_change = 1;
1100 bat->gBatCapacityChargeCnt = 0;
1101 bat ->gBatCapacityusbdisChargeCnt = 0;//get_suspend_state(void)
1102 }else //if(( get_suspend_state() != PM_SUSPEND_MEM)&&(capacity < bat->bat_capacity)){
1103 // if((gpio_get_value (bat->pdata->back_light_pin) == 1)&&(capacity < bat->bat_capacity)){
1104 if((capacity < bat->bat_capacity)){
1105 DBG("USB CHARGE DOWN\n");
1107 // if (capacity < bat->bat_capacity){
1109 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 40; // 13
1110 }else if(capacity < 20){
1111 if(capacity + 3 > bat->bat_capacity )
1112 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5; //5s
1113 else if(capacity + 7 > bat->bat_capacity )
1114 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10; //10s
1115 else if(capacity + 10> bat->bat_capacity )
1116 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -25; // 13
1118 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 35; // 13
1120 if(capacity + 3 > bat->bat_capacity )
1121 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -5; //5s
1122 else if(capacity + 7 > bat->bat_capacity )
1123 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE -10; //10s
1124 else if(capacity + 10> bat->bat_capacity )
1125 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 15; // 13
1127 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 20; // 13
1130 if (++(bat->gBatCapacityusbdisChargeCnt) >= timer_of_discharge_sample){
1131 bat->gBatCapacityusbdisChargeCnt = 0;
1132 if (bat->bat_capacity > 0){
1133 bat->bat_capacity-- ;
1134 bat->bat_change = 1;
1139 bat->gBatCapacityusbChargeCnt = 0;
1142 else //if(get_suspend_state() == PM_SUSPEND_MEM){
1143 //if(gpio_get_value (bat->pdata->back_light_pin) == 0){
1147 bat->gBatCapacityusbdisChargeCnt = 0;
1148 // (bat->gBatCapacityusbChargeCnt)++;
1149 if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
1150 if( is_charge_ok(bat) == CHARGE_IS_OK){
1152 if (++bat->gBatCapacityusbChargeCnt >= timer_of_charge_sample-30){
1153 bat->gBatCapacityusbChargeCnt = 0;
1154 if (bat->bat_capacity <= 99){
1155 bat->bat_capacity++;
1156 bat->bat_change = 1;
1160 if (capacity > bat->capacitytmp){
1161 bat->gBatCapacityChargeCnt = 0;
1164 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
1165 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1167 if (bat->bat_capacity < 99){
1168 bat->bat_capacity++;
1169 bat->bat_change = 1;
1177 if (capacity > bat->capacitytmp){
1178 bat->gBatCapacityChargeCnt = 0;
1180 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityusbChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
1181 bat->gBatCapacityusbChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1182 if (bat->bat_capacity <= 99){
1183 bat->bat_capacity++;
1184 bat->bat_change = 1;
1191 bat->capacitytmp = capacity;
1195 static void rk_ac_charger(struct rk30_adc_battery_data *bat)
1198 int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1200 if((1 == bat->charge_level)&&( 0 == bat->start_voltage_status)){
1201 bat->charge_start_voltage = bat->bat_voltage;
1202 bat->start_voltage_status = 1;
1203 bat->charge_start_capacity = bat->bat_capacity;
1204 if(bat ->charge_start_capacity%10 != 0){
1205 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1206 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1208 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10;
1209 bat ->charge_down_proportion = bat ->charge_start_capacity/10;
1214 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1215 if (capacity > bat->bat_capacity){
1216 if(capacity > bat->bat_capacity + 10 )
1217 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -10; //5s
1218 else if(capacity > bat->bat_capacity + 7 )
1219 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE -5; //10s
1220 else if(capacity > bat->bat_capacity + 3 )
1221 timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE - 2; // 13
1222 if (++(bat->gBatCapacityacChargeCnt) >= timer_of_charge_sample){
1223 bat->gBatCapacityacChargeCnt = 0;
1224 if (bat->bat_capacity < 99){
1225 bat->bat_capacity++;
1226 bat->bat_change = 1;
1229 bat->gBatCapacityChargeCnt = 0;
1232 bat->gBatCapacityacChargeCnt = 0;
1233 (bat->gBatCapacityChargeCnt)++;
1234 if( is_charge_ok(bat) != INVALID_CHARGE_CHECK){
1235 if( is_charge_ok(bat) == CHARGE_IS_OK){
1236 if (bat->gBatCapacityChargeCnt >= timer_of_charge_sample){
1237 bat->gBatCapacityChargeCnt = 0;
1238 if (bat->bat_capacity < 99){
1239 bat->bat_capacity++;
1240 bat->bat_change = 1;
1244 if (capacity > bat->capacitytmp){
1245 bat->gBatCapacityChargeCnt = 0;
1249 if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
1250 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1252 if (bat->bat_capacity < 99){
1253 bat->bat_capacity++;
1254 bat->bat_change = 1;
1261 if (capacity > bat->capacitytmp){
1262 bat->gBatCapacityChargeCnt = 0;
1266 if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
1267 bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
1269 if (bat->bat_capacity <= 99){
1270 bat->bat_capacity++;
1271 bat->bat_change = 1;
1279 bat->capacitytmp = capacity;
1281 static void rk_battery_charger(struct rk30_adc_battery_data *bat)
1285 int timer_of_discharge_sample = DISCHARGE_MIN_SECOND;
1287 capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1289 if (capacity < bat->bat_capacity){
1292 timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE - 40; // 13
1296 if(capacity + 3 > bat->bat_capacity )
1297 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -5; //5s
1298 else if(capacity + 7 > bat->bat_capacity )
1299 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -10; //10s
1300 else if(capacity + 10> bat->bat_capacity )
1301 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -25; // 13
1303 timer_of_discharge_sample = DISCHARGE_MIN_SECOND - 35; // 13
1305 if(capacity + 3 > bat->bat_capacity )
1306 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -5; //5s
1307 else if(capacity + 7 > bat->bat_capacity )
1308 timer_of_discharge_sample = DISCHARGE_MIN_SECOND -10; //10s
1309 else if(capacity + 10> bat->bat_capacity )
1310 timer_of_discharge_sample = DISCHARGE_MIN_SECOND - 15; // 13
1312 timer_of_discharge_sample = DISCHARGE_MIN_SECOND - 20; // 13
1315 if (++(bat->gBatCapacityDisChargeCnt) >= timer_of_discharge_sample){
1316 bat->gBatCapacityDisChargeCnt = 0;
1317 if (bat->bat_capacity > 0){
1318 bat->bat_capacity-- ;
1319 bat->bat_change = 1;
1324 bat->gBatCapacityDisChargeCnt = 0;
1326 bat->gBatCapacityChargeCnt = 0;
1327 bat->gBatCapacityusbdisChargeCnt=0 ;
1328 bat->gBatCapacityusbChargeCnt =0;
1329 bat->gBatCapacityacChargeCnt = 0;
1330 bat->start_voltage_status = 0;
1332 bat->capacitytmp = capacity;
1338 static void rk30_adc_battery_capacity_samples(struct rk30_adc_battery_data *bat)
1340 // int capacity = 0;
1341 // int timer_of_charge_sample = NUM_CHARGE_MIN_SAMPLE;
1342 // int timer_of_discharge_sample = NUM_CHARGE_MIN_SAMPLE;
1344 if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE) {
1345 bat->gBatCapacityDisChargeCnt = 0;
1346 bat->gBatCapacityChargeCnt = 0;
1347 bat->gBatCapacityacChargeCnt = 0;
1351 if(1 == bat->charge_level){
1352 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1353 if(1 == bat->usb_charging)
1354 rk_usb_charger(bat);
1361 rk_battery_charger(bat);
1367 //static int poweron_check = 0;
1368 static void rk30_adc_battery_poweron_capacity_check(struct rk30_adc_battery_data *bat)
1371 int new_capacity, old_capacity;
1374 new_capacity = bat ->bat_capacity;
1377 old_capacity = rk30_adc_battery_load_capacity();
1378 if( old_capacity >= 0 ){
1384 if ((old_capacity < 0) || (old_capacity > 100)){
1385 old_capacity = new_capacity;
1388 if (bat ->bat_status == POWER_SUPPLY_STATUS_FULL){
1389 if (new_capacity > 80){
1390 bat ->bat_capacity = 100;
1393 else if (bat ->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1396 if( bat ->pdata->is_reboot_charging == 1)
1397 bat ->bat_capacity = (old_capacity < 10) ?(old_capacity+2):old_capacity;
1399 bat ->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
1401 if(new_capacity > old_capacity + 50 )
1402 bat ->bat_capacity = old_capacity + 5;
1404 bat ->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; //avoid the value of capacity increase
1405 if(bat->bat_capacity == 100)
1406 bat->bat_capacity = 99;
1407 if(bat->bat_capacity == 0)
1408 bat->bat_capacity =1;
1410 DBG("oldcapacity %d,newcapacity %d,capacity %d\n", old_capacity
1411 , new_capacity, bat->bat_capacity);
1413 bat ->bat_change = 1;
1415 #if defined CONFIG_BATTERY_RK30_USB_CHARGE
1416 #define to_battery_usb_device_info(x) container_of((x), \
1417 struct rk30_adc_battery_data, usb);
1419 static int rk30_adc_battery_get_usb_property(struct power_supply *psy,
1420 enum power_supply_property psp,
1421 union power_supply_propval *val)
1423 struct rk30_adc_battery_data *bat= to_battery_usb_device_info(psy);
1426 case POWER_SUPPLY_PROP_ONLINE:
1427 if (psy->type == POWER_SUPPLY_TYPE_USB){
1428 val->intval = bat ->usb_charging;
1429 if (strstr(saved_command_line,"charger") == NULL){
1430 if( 1 == bat->charge_full_flag)
1444 static enum power_supply_property rk30_adc_battery_usb_props[] = {
1446 POWER_SUPPLY_PROP_ONLINE,
1449 static struct power_supply rk30_usb_supply =
1452 .type = POWER_SUPPLY_TYPE_USB,
1454 .get_property = rk30_adc_battery_get_usb_property,
1456 .properties = rk30_adc_battery_usb_props,
1457 .num_properties = ARRAY_SIZE(rk30_adc_battery_usb_props),
1460 static irqreturn_t rk30_adc_battery_dc_wakeup(int irq, void *dev_id)
1462 disable_irq_nosync(irq);
1463 queue_work(gBatteryData->wq, &gBatteryData->dcwakeup_work);
1467 #define to_battery_ac_device_info(x) container_of((x), \
1468 struct rk30_adc_battery_data, ac);
1470 static int rk30_adc_battery_get_ac_property(struct power_supply *psy,
1471 enum power_supply_property psp,
1472 union power_supply_propval *val)
1476 struct rk30_adc_battery_data *bat = to_battery_ac_device_info(psy);
1479 case POWER_SUPPLY_PROP_ONLINE:
1480 if (psy->type == POWER_SUPPLY_TYPE_MAINS){
1481 val->intval = bat ->ac_charging;
1482 if (strstr(saved_command_line,"charger") == NULL ){
1483 if( 1 == bat->charge_full_flag)
1497 static enum power_supply_property rk30_adc_battery_ac_props[] =
1499 POWER_SUPPLY_PROP_ONLINE,
1502 static struct power_supply rk30_ac_supply =
1505 .type = POWER_SUPPLY_TYPE_MAINS,
1507 .get_property = rk30_adc_battery_get_ac_property,
1509 .properties = rk30_adc_battery_ac_props,
1510 .num_properties = ARRAY_SIZE(rk30_adc_battery_ac_props),
1512 static void rk30_adc_battery_dcdet_delaywork(struct work_struct *work)
1516 struct rk30_adc_battery_platform_data *pdata;
1519 struct rk30_adc_battery_data *bat = container_of((work), \
1520 struct rk30_adc_battery_data, dcwakeup_work);
1523 irq = gpio_to_irq(pdata->dc_det_pin);
1524 free_irq(irq, NULL);
1526 irq_flag = gpio_get_value (pdata->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
1527 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);// reinitialize the DC irq
1529 free_irq(irq, NULL);
1532 power_supply_changed(&bat ->ac);
1533 rk_send_wakeup_key();
1535 bat ->bat_status_cnt = 0; //the state of battery is change
1540 static int rk30_adc_battery_get_status(struct rk30_adc_battery_data *bat)
1542 return (bat->bat_status);
1545 static int rk30_adc_battery_get_health(struct rk30_adc_battery_data *bat)
1547 return POWER_SUPPLY_HEALTH_GOOD;
1550 static int rk30_adc_battery_get_present(struct rk30_adc_battery_data *bat)
1552 return (bat->bat_voltage < BATT_MAX_VOL_VALUE) ? 0 : 1;
1555 static int rk30_adc_battery_get_voltage(struct rk30_adc_battery_data *bat)
1557 return (bat->bat_voltage );
1560 static int rk30_adc_battery_get_capacity(struct rk30_adc_battery_data *bat)
1562 return (bat->bat_capacity);
1565 static int rk30_adc_battery_get_property(struct power_supply *psy,
1566 enum power_supply_property psp,
1567 union power_supply_propval *val)
1571 struct rk30_adc_battery_data *bat = container_of((psy), \
1572 struct rk30_adc_battery_data, bat);
1574 case POWER_SUPPLY_PROP_STATUS:
1575 val->intval = rk30_adc_battery_get_status(bat);
1576 DBG("gBatStatus=%d\n",val->intval);
1578 case POWER_SUPPLY_PROP_HEALTH:
1579 val->intval = rk30_adc_battery_get_health(bat);
1580 DBG("gBatHealth=%d\n",val->intval);
1582 case POWER_SUPPLY_PROP_PRESENT:
1583 val->intval = rk30_adc_battery_get_present(bat);
1584 DBG("gBatPresent=%d\n",val->intval);
1586 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1587 // val ->intval = rk30_adc_battery_get_voltage(bat);
1588 voltage = rk30_adc_battery_get_voltage(bat);
1589 val->intval = voltage*1000;
1590 DBG("gBatVoltage=%d\n",val->intval);
1592 case POWER_SUPPLY_PROP_CAPACITY:
1593 if(battery_test_flag == 2)
1596 val->intval = rk30_adc_battery_get_capacity(bat);
1597 DBG("gBatCapacity=%d%%\n",val->intval);
1599 case POWER_SUPPLY_PROP_TECHNOLOGY:
1600 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
1602 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1603 val->intval = BATT_MAX_VOL_VALUE;
1605 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1606 val->intval = BATT_ZERO_VOL_VALUE;
1616 static enum power_supply_property rk30_adc_battery_props[] = {
1618 POWER_SUPPLY_PROP_STATUS,
1619 POWER_SUPPLY_PROP_HEALTH,
1620 POWER_SUPPLY_PROP_PRESENT,
1621 POWER_SUPPLY_PROP_VOLTAGE_NOW,
1622 POWER_SUPPLY_PROP_TECHNOLOGY,
1623 POWER_SUPPLY_PROP_CAPACITY,
1624 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
1625 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
1628 static struct power_supply rk30_battery_supply =
1631 .type = POWER_SUPPLY_TYPE_BATTERY,
1633 .get_property = rk30_adc_battery_get_property,
1635 .properties = rk30_adc_battery_props,
1636 .num_properties = ARRAY_SIZE(rk30_adc_battery_props),
1640 static void rk30_adc_battery_resume_check(struct rk30_adc_battery_data *bat)
1644 int new_capacity, old_capacity;
1645 // struct rk30_adc_battery_data *bat = gBatteryData;
1647 bat ->old_charge_level = -1;
1648 bat ->pSamples = bat->adc_samples;
1650 bat->adc_val = rk_adc_battery_iio_read(bat->pdata);
1652 level = oldlevel = rk_battery_get_status(bat);//rk30_adc_battery_status_samples(bat);//init charge status
1654 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) { //0.3 s
1657 rk30_adc_battery_voltage_samples(bat); //get voltage
1658 level = rk_battery_get_status(bat);// rk30_adc_battery_status_samples(bat); //check charge status
1659 if (oldlevel != level){
1660 oldlevel = level; //if charge status changed, reset sample
1664 new_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
1665 old_capacity =bat-> suspend_capacity;
1667 //if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING){
1670 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;
1673 bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity; // aviod the value of capacity increase dicharge
1676 if (batt_gpio_is_valid(bat->pdata->batt_low_pin)) {
1677 if (gpio_get_value(bat ->pdata->batt_low_pin) == bat ->pdata->batt_low_level)
1678 bat->bat_capacity = 0;
1684 static int rk30_adc_battery_suspend(struct platform_device *dev, pm_message_t state)
1687 struct rk30_adc_battery_data *data = platform_get_drvdata(dev);
1689 data ->suspend_capacity = data->bat_capacity;
1690 data ->suspend_time = get_seconds();
1691 cancel_delayed_work(&data ->delay_work);
1693 if (batt_gpio_is_valid(data->pdata->batt_low_pin)) {
1695 irq = gpio_to_irq(data ->pdata->batt_low_pin);
1697 enable_irq_wake(irq);
1703 static int rk30_adc_battery_resume(struct platform_device *dev)
1706 struct rk30_adc_battery_data *data = platform_get_drvdata(dev);
1707 if( data->bat_capacity < 10 ){
1708 wake_lock_timeout(&batt_wake_lock_detect_lowpower,15*HZ);
1709 data->bat_change = 1;
1711 data ->resume_time = get_seconds();
1712 data ->resume = true;
1713 queue_delayed_work(data->wq, &data ->delay_work, msecs_to_jiffies(100));
1714 if (batt_gpio_is_valid(data->pdata->batt_low_pin)) {
1716 irq = gpio_to_irq(data ->pdata ->batt_low_pin);
1717 disable_irq_wake(irq);
1723 #define rk30_adc_battery_suspend NULL
1724 #define rk30_adc_battery_resume NULL
1728 unsigned long AdcTestCnt = 0;
1729 static void rk30_adc_battery_timer_work(struct work_struct *work)
1731 struct rk30_adc_battery_data *bat = container_of((work), struct
1732 rk30_adc_battery_data, delay_work.work);
1736 // if( (bat->resume_time - bat->suspend_time) >= 1800 )
1737 rk30_adc_battery_resume_check(bat);
1739 //bat->bat_capacity = bat->suspend_capacity;
1740 bat ->resume = false;
1741 bat ->bat_change =1;
1744 bat->stop_check = 1;
1745 if( 1 == bat ->lower_power_flag ){
1746 bat ->bat_capacity = 0;
1747 bat ->bat_change =1;
1749 if (bat ->poweron_check){
1750 bat ->poweron_check = 0;
1751 rk30_adc_battery_poweron_capacity_check(bat);
1754 bat ->charge_level = rk_battery_get_status(bat);
1755 DBG("bat ->charge_level =%d\n", bat ->charge_level);
1756 rk30_adc_battery_status_samples(bat);
1757 rk30_adc_battery_voltage_samples(bat);
1758 rk30_adc_battery_capacity_samples(bat);
1760 if( 0 == bat ->pdata ->charging_sleep){
1761 if( 1 == bat->charge_level){ // charge
1762 if(0 == bat->status_lock ){
1763 wake_lock(&batt_wake_lock); //lock
1764 bat ->status_lock = 1;
1768 if(1 == bat ->status_lock ){
1769 wake_unlock(&batt_wake_lock); //unlock
1770 bat ->status_lock = 0;
1776 /*update battery parameter after adc and capacity has been changed*/
1777 if(bat ->bat_change){
1778 bat ->bat_change= 0;
1779 if (strstr(saved_command_line,"charger") == NULL){ //when low charging-current,not in charging-displays
1780 if(0 == bat ->bat_capacity){
1781 bat ->ac_charging = 0;
1782 bat ->usb_charging = 0;
1786 rk30_adc_battery_put_capacity(bat ->bat_capacity);
1787 power_supply_changed(&bat ->bat);
1788 power_supply_changed(&bat ->ac);
1789 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1790 power_supply_changed(&bat ->usb);
1795 //if (rk30_battery_dbg_level){
1796 if (++AdcTestCnt >= 2)
1800 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",
1801 bat ->bat_status, bat ->adc_val, rk_adc_voltage(bat, bat ->adc_val),
1802 bat ->bat_voltage, bat ->bat_capacity, bat ->capacitytmp, bat ->gBatCapacityDisChargeCnt, bat ->gBatCapacityChargeCnt,
1803 bat ->gBatCapacityacChargeCnt, bat ->gBatCapacityusbChargeCnt, bat ->gBatCapacityusbdisChargeCnt);
1807 queue_delayed_work(bat ->wq, &bat ->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
1812 static int rk30_adc_battery_io_init(struct rk30_adc_battery_platform_data *pdata)
1816 if (batt_gpio_is_valid(pdata->dc_det_pin)) {
1817 ret = gpio_request(pdata->dc_det_pin, NULL);
1819 pr_info("failed to request dc_det gpio\n");
1823 ret = gpio_direction_input(pdata->dc_det_pin);
1825 pr_info("failed to set gpio dc_det input\n");
1831 if (batt_gpio_is_valid(pdata->charge_ok_pin)) {
1832 ret = gpio_request(pdata->charge_ok_pin, NULL);
1834 pr_err("failed to request charge_ok gpio\n");
1838 ret = gpio_direction_input(pdata->charge_ok_pin);
1840 pr_err("failed to set gpio charge_ok input\n");
1845 if (batt_gpio_is_valid(pdata->batt_low_pin)) {
1846 ret = gpio_request(pdata->batt_low_pin, NULL);
1848 pr_err("failed to request batt_low_pin gpio\n");
1852 ret = gpio_direction_input(pdata->batt_low_pin);
1854 pr_err("failed to set gpio batt_low_pin input\n");
1864 extern void kernel_power_off(void);
1865 int get_battery_status(void)
1867 return system_lowerpower;
1869 static int rk_adc_battery_poweron_status(struct rk30_adc_battery_data *bat)
1872 #if defined CONFIG_BATTERY_RK30_USB_CHARGE
1876 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1878 if (get_ac_status(bat) ){
1879 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1880 bat -> ac_charging = 1;
1881 if (is_charge_ok(bat) == 1){
1882 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1883 bat->bat_capacity = 100;
1885 power_supply_changed(&bat ->ac);
1888 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1889 otg_status = dwc_otg_check_dpdm();
1890 if( 0 != otg_status ){
1891 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1892 if (is_charge_ok(bat) == 1){
1893 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1894 bat->bat_capacity = 100;
1898 if(otg_status == 1){
1899 bat->usb_charging = 1;
1900 if(bat -> pdata ->control_usb_charging)
1901 bat -> pdata ->control_usb_charging(0);
1902 }else if(otg_status == 2){
1903 bat->usb_charging = 0;
1904 bat -> ac_charging = 1;
1905 if(bat -> pdata ->control_usb_charging)
1906 bat -> pdata ->control_usb_charging(1);
1908 bat->usb_charging = 0;
1910 printk("charge_status = %d\n",otg_status);
1912 power_supply_changed(&bat ->ac);
1913 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1914 power_supply_changed(&bat ->usb);
1916 if((bat -> ac_charging == 1)||(bat->usb_charging == 1)){
1917 bat ->old_charge_level =1;
1918 bat->charge_level = 1;
1921 bat ->old_charge_level =0;
1922 bat->charge_level = 0;
1929 static void rk30_adc_battery_check(struct rk30_adc_battery_data *bat)
1933 // struct rk30_adc_battery_platform_data *pdata = bat->pdata;
1934 int check_data[NUM_VOLTAGE_SAMPLE];
1935 //bat ->old_charge_level
1936 // pSamples = bat->adc_samples;
1939 bat->adc_val = rk_adc_battery_iio_read(bat->pdata);
1941 DBG("first_adc_value is %d\n", bat->adc_val);
1942 level = oldlevel = rk_adc_battery_poweron_status(bat);// rk30_adc_battery_status_samples(bat);//init charge status
1944 for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++){ //0.3 s
1946 rk30_adc_battery_voltage_samples(bat); //get voltage
1947 //level = rk30_adc_battery_status_samples(bat); //check charge status
1949 level = rk_adc_battery_poweron_status(bat);
1951 if (oldlevel != level){
1952 oldlevel = level; //if charge status changed, reset sample
1957 for(i=0; i< NUM_VOLTAGE_SAMPLE; i++){
1959 check_data[i] = bat->adc_val;
1961 bat->adc_val = rk_adc_battery_iio_read(bat->pdata);
1962 bat->adc_value += check_data[i];
1964 bat->adc_value /= NUM_VOLTAGE_SAMPLE;
1966 bat->bat_capacity = rk30_adc_battery_voltage_to_capacity(bat, bat->bat_voltage); //init bat_capacity
1967 bat->capacitytmp = bat->bat_capacity;
1968 level = rk_adc_battery_poweron_status(bat);
1969 if((1 == level)&&(0 == bat->start_voltage_status )){
1970 bat->charge_start_voltage = bat->bat_voltage;
1971 bat->start_voltage_status = 1;
1972 bat->charge_start_capacity = bat->bat_capacity;
1973 bat ->charge_up_proprotion = (100 - bat ->charge_start_capacity)/10+1;
1974 bat ->charge_down_proportion = bat ->charge_start_capacity/10+1;
1977 if (get_ac_status(bat) ){
1978 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1979 bat -> ac_charging = 1;
1980 if (is_charge_ok(bat) == 1){
1981 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1982 bat->bat_capacity = 100;
1985 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
1986 if( 0 != dwc_otg_check_dpdm() ){
1987 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
1988 if (is_charge_ok(bat) == 1){
1989 bat->bat_status = POWER_SUPPLY_STATUS_FULL;
1990 bat->bat_capacity = 100;
1994 if(dwc_otg_check_dpdm() == 1){
1995 bat->usb_charging = 1;
1996 if(bat -> pdata ->control_usb_charging)
1997 bat -> pdata ->control_usb_charging(0);
1998 }else if(dwc_otg_check_dpdm() == 2){
1999 bat->usb_charging = 0;
2000 bat -> ac_charging = 1;
2001 if(bat -> pdata ->control_usb_charging)
2002 bat -> pdata ->control_usb_charging(1);
2004 bat->usb_charging = 0;
2007 power_supply_changed(&bat ->ac);
2008 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
2009 power_supply_changed(&bat ->usb);
2011 if((bat -> ac_charging == 1)||(bat->usb_charging == 1)){
2012 bat ->old_charge_level =1;
2013 bat->charge_level = 1;
2018 if (bat->bat_capacity == 0) {
2019 bat->bat_capacity = 1;
2020 system_lowerpower = 1;
2024 if(0 !=bat ->pdata->low_voltage_protection ){
2025 if (bat->bat_voltage <= bat->pdata->low_voltage_protection) {
2026 system_lowerpower = 1;
2027 printk("protection lower power .....\n");
2030 if (bat->bat_voltage <= BATT_ZERO_VOL_VALUE) {
2031 system_lowerpower = 1;
2032 pr_info("lower power bat->bat_voltage = %d\n"
2033 , bat->bat_voltage);
2038 if ((bat->bat_voltage <= BATT_ZERO_VOL_VALUE)&&(bat->bat_status != POWER_SUPPLY_STATUS_CHARGING)){
2045 static void rk30_adc_battery_lowerpower_delaywork(struct work_struct *work)
2049 struct rk30_adc_battery_data *bat = container_of((work), \
2050 struct rk30_adc_battery_data, lowerpower_work);
2052 if (batt_gpio_is_valid(bat->pdata->batt_low_pin)) {
2053 irq = gpio_to_irq(bat ->pdata ->batt_low_pin);
2057 printk("lowerpower\n");
2062 static irqreturn_t rk30_adc_battery_low_wakeup(int irq,void *dev_id)
2064 queue_work(gBatteryData->wq, &gBatteryData->lowerpower_work);
2067 static void rk_lowerpower_check(struct rk30_adc_battery_data *bat)
2071 int check_data[NUM_VOLTAGE_SAMPLE];
2073 for(i=0; i< NUM_VOLTAGE_SAMPLE; i++){
2075 bat->adc_val = rk_adc_battery_iio_read(bat->pdata);
2076 check_data[i] = bat->adc_val;
2078 adc_val += check_data[i];
2080 adc_val /=NUM_VOLTAGE_SAMPLE;
2082 DBG(">>>>>>>>>>>one>>>%d, two<<<<<%d<<<<\n",bat->adc_value,adc_val);
2083 DBG(">>>>>>>>>>>firset-value>>>%d, second-value<<<<<%d<<<<\n",rk_adc_voltage(bat, bat->adc_value),rk_adc_voltage(bat, adc_val));
2085 if((adc_val >= bat->adc_value+5) &&(bat->bat_status == POWER_SUPPLY_STATUS_NOT_CHARGING ) )//
2087 printk("%d,%d\n",adc_val,bat->adc_value);
2088 printk("lower-power shutdown");
2093 static void rk_adc_battery_check_work(struct work_struct *work)
2095 struct rk30_adc_battery_data *bat =
2096 container_of((work), struct
2097 rk30_adc_battery_data, check_work.work);
2099 if(1 == get_ac_status(bat)){
2100 bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
2101 bat -> ac_charging = 1;
2104 power_supply_changed(&bat ->ac);
2105 if(bat->stop_check != 1)
2106 queue_delayed_work(bat ->wq, &bat ->check_work, msecs_to_jiffies(TIMER_MS_COUNTS));
2109 static void poweron_lowerpoer_handle(struct rk30_adc_battery_data *bat)
2111 #ifdef CONFIG_LOGO_LOWERPOWER_WARNING
2112 if((1 == get_battery_status())&&(bat->bat_status == POWER_SUPPLY_STATUS_NOT_CHARGING )){
2119 static int battery_notifier_call(struct notifier_block *nb,
2120 unsigned long event, void *data)
2122 struct rk30_adc_battery_data *bat=
2123 container_of(nb, struct rk30_adc_battery_data, battery_nb);
2127 rk_lowerpower_check(bat);
2131 poweron_lowerpoer_handle(bat);
2140 static int rk31_adcbat_parse_dt(struct platform_device *pdev, struct
2141 rk30_adc_battery_platform_data *data)
2143 struct device_node *node = pdev->dev.of_node;
2144 enum of_gpio_flags flags;
2145 struct property *prop;
2151 struct iio_channel *chan;
2156 chan = iio_channel_get(&pdev->dev, NULL);
2158 pr_err("iio_channel_get fail\n");
2161 /* determine the number of config info */
2162 prop = of_find_property(node, "bat_table", &length);
2166 length /= sizeof(u32);
2169 size = (sizeof(*data->dts_batt_table)) * length;
2170 data->dts_batt_table =
2171 devm_kzalloc(&(pdev->dev), size, GFP_KERNEL);
2172 if (!data->dts_batt_table)
2175 ret = of_property_read_u32_array(node
2176 , "bat_table", data->dts_batt_table, length);
2181 for (i = 4; i < length; i++) {
2182 batt_table[i] = data->dts_batt_table[i];
2184 pr_info("data->dts_batt_table[ %d ] %d %d\n", i
2185 , data->dts_batt_table[i], batt_table[i]);
2187 data->dc_det_pin = of_get_named_gpio_flags(node
2188 , "dc_det_gpio", 0, &flags);
2189 if (data->dc_det_pin == -EPROBE_DEFER)
2190 pr_info("%s dc_det_gpio error\n", __func__);
2192 if (batt_gpio_is_valid(data->dc_det_pin))
2193 data->dc_det_level = (flags & OF_GPIO_ACTIVE_LOW)
2194 ? RK30_GPIO_LOW : RK30_GPIO_HIGH;
2196 data->batt_low_pin = of_get_named_gpio_flags(node
2197 , "bat_low_gpio", 0, &flags);
2198 if (data->batt_low_pin == -EPROBE_DEFER)
2199 pr_info("%s bat_low_gpio error\n", __func__);
2201 if (batt_gpio_is_valid(data->batt_low_pin))
2202 data->batt_low_level = (flags & OF_GPIO_ACTIVE_LOW)
2203 ? RK30_GPIO_LOW : RK30_GPIO_HIGH;
2205 data->charge_ok_pin = of_get_named_gpio_flags(node
2206 , "chg_ok_gpio", 0, &flags);
2207 if (data->charge_ok_pin == -EPROBE_DEFER)
2208 pr_info("%s chg_ok_gpio error\n", __func__);
2210 if (batt_gpio_is_valid(data->charge_ok_pin))
2211 data->charge_ok_level = (flags & OF_GPIO_ACTIVE_LOW)
2212 ? RK30_GPIO_LOW : RK30_GPIO_HIGH;
2213 pwr_hold = of_get_named_gpio_flags(node, "pwr_hold", 0,
2215 if (pwr_hold == -EPROBE_DEFER)
2216 printk("%s pwr_hold error\n",__func__);
2218 ret = of_property_read_u32(node, "is_dc_charge", &value);
2220 pr_info("%s:hardware unsupport dc charge\n", __func__);
2223 data->is_dc_charge = value;
2225 ret = of_property_read_u32(node, "is_usb_charge"
2228 pr_err("%s:hardware unsupport usb charge\n", __func__);
2231 data->is_usb_charge = value;
2233 pr_info("rk30 battery:support %s %s charger\n",
2234 data->is_dc_charge ? "DC" : ""
2235 , data->is_usb_charge ? "USB" : "");
2240 static int rk31_adcbat_parse_dt(struct platform_device
2241 *dev, struct rk30_adc_battery_platform_data *data)
2248 static int rk30_adc_battery_probe(struct platform_device *pdev)
2254 struct rk30_adc_battery_data *data;
2255 struct rk30_adc_battery_platform_data *pdata;
2256 #ifdef CONFIG_MACH_RK_FAC
2258 for(i=0;i<BATT_NUM;i++)
2260 batt_table[6+i]=pdata->chargeArray[i];
2261 batt_table[BATT_NUM+6+i]=pdata->chargeArray[i];
2264 gSecondsCnt = get_seconds();
2265 /*data = kzalloc(sizeof(*data), GFP_KERNEL);*/
2266 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
2269 goto err_data_alloc_failed;
2272 /*pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);*/
2273 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
2274 if (pdata == NULL) {
2276 goto err_pdata_alloc_failed;
2278 memset(data, 0, sizeof(struct rk30_adc_battery_data));
2279 gBatteryData = data;
2280 platform_set_drvdata(pdev, data);
2282 data->pdata = pdata;
2283 data->status_lock = 0;
2284 data->old_charge_level = -1;
2285 data->capacitytmp = 0;
2286 data->suspend_capacity = 0;
2287 data->ac_charging = 0;
2288 data->usb_charging = 0;
2289 data->full_times = 0;
2290 data->gBatCapacityDisChargeCnt =0;
2291 data->gBatCapacityChargeCnt=0;
2292 data->gBatCapacityusbdisChargeCnt=0 ;
2293 data->gBatCapacityusbChargeCnt =0;
2294 data->gBatCapacityacChargeCnt = 0;
2295 data->charge_source_now = 0;
2296 data->charge_soure_old = 0;
2297 data->start_voltage_status = 0;
2298 data->charge_full_flag =0;
2299 data->pSamples = data->adc_samples;
2300 data->lower_power_flag = 0;
2301 data->capacitytmp = 0;
2302 data->time_to_full = 0;
2303 data->stop_check = 0;
2304 data->voltage_to_local = 0;
2306 data->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
2307 wake_lock_init(&batt_wake_lock, WAKE_LOCK_SUSPEND, "batt_lock");
2308 wake_lock_init(&charge_display_lock, WAKE_LOCK_SUSPEND, "charge_display_lock"); //charge_display_lock
2309 wake_lock_init(&batt_wake_lock_detect_lowpower
2310 , WAKE_LOCK_SUSPEND, "lowpower_lock");
2312 ret = rk31_adcbat_parse_dt(pdev, data->pdata);
2313 /*ret = rk31_adcbat_parse_dt(pdev, pdata);*/
2315 pr_err("failed to find rk30 adc battery platform data\n");
2319 ret = rk30_adc_battery_io_init(data->pdata);
2325 memset(data->adc_samples, 0, sizeof(int)*(NUM_VOLTAGE_SAMPLE + 2));
2327 //register adc for battery sample
2329 if (!pm_power_off) {
2330 pm_power_off = v86_pm_power_off;
2332 data->wq = create_singlethread_workqueue("adc_battd");
2335 /*data->client = client;*/
2336 data->adc_val = rk_adc_battery_iio_read(data->pdata);
2338 data ->bat = rk30_battery_supply;
2339 ret = power_supply_register(&pdev->dev,&data ->bat);
2342 printk(KERN_INFO "fail to battery power_supply_register\n");
2343 goto err_battery_failed;
2345 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
2346 data ->usb = rk30_usb_supply;
2347 ret = power_supply_register(&pdev->dev, &data ->usb);
2350 printk(KERN_INFO "fail to usb power_supply_register\n");
2351 goto err_usb_failed;
2354 data ->ac = rk30_ac_supply;
2355 ret = power_supply_register(&pdev->dev, &data ->ac);
2358 printk(KERN_INFO "fail to ac power_supply_register\n");
2362 //init dc dectet irq & delay work
2363 if (batt_gpio_is_valid(data->pdata->dc_det_pin)) {
2364 INIT_WORK(&data->dcwakeup_work, rk30_adc_battery_dcdet_delaywork);
2366 irq = gpio_to_irq(data->pdata->dc_det_pin);
2367 irq_flag = gpio_get_value(data->pdata->dc_det_pin)
2368 ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
2369 ret = request_irq(irq, rk30_adc_battery_dc_wakeup, irq_flag, "ac_charge_irq", NULL);
2372 printk("failed to request dc det irq\n");
2373 goto err_dcirq_failed;
2375 enable_irq_wake(irq);
2380 ret = device_create_file(&pdev->dev,&dev_attr_batparam);
2383 printk(KERN_ERR "failed to create bat param file\n");
2384 goto err_battery_failed;
2387 ret = create_sysfs_interfaces(&pdev->dev);
2392 "device rk30_adc_batterry sysfs register failed\n");
2396 //Power on Battery detect
2397 rk30_adc_battery_check(data);
2399 // data->wq = create_singlethread_workqueue("adc_battd");
2400 INIT_DELAYED_WORK(&data->delay_work, rk30_adc_battery_timer_work);
2402 if (1 == data->pdata->save_capacity) {
2403 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS*10));
2404 data ->poweron_check = 1;
2406 queue_delayed_work(data->wq, &data->delay_work, msecs_to_jiffies(TIMER_MS_COUNTS));
2407 data ->poweron_check = 0;
2409 INIT_DELAYED_WORK(&data->check_work, rk_adc_battery_check_work);
2410 queue_delayed_work(data ->wq, &data ->check_work, msecs_to_jiffies(TIMER_MS_COUNTS));
2411 if (batt_gpio_is_valid(data->pdata->batt_low_pin)) {
2412 if (0 == gpio_get_value(data->pdata->batt_low_pin)) {
2414 if (gpio_get_value(data->pdata->batt_low_pin) == 0) {
2415 printk("lower power\n");
2420 INIT_WORK(&data->lowerpower_work, rk30_adc_battery_lowerpower_delaywork);
2421 irq = gpio_to_irq(data->pdata->batt_low_pin);
2422 ret = request_irq(irq, rk30_adc_battery_low_wakeup, IRQF_TRIGGER_LOW, "batt_low_irq", NULL);
2425 printk("failed to request batt_low_irq irq\n");
2426 goto err_lowpowerirq_failed;
2431 data->battery_nb.notifier_call = battery_notifier_call;
2432 register_adc_battery_notifier(&data->battery_nb);
2434 printk(KERN_INFO "rk30_adc_battery: driver initialized\n");
2438 power_supply_unregister(&data ->usb);
2440 power_supply_unregister(&data ->ac);
2443 power_supply_unregister(&data ->bat);
2446 if (batt_gpio_is_valid(data->pdata->dc_det_pin))
2447 free_irq(gpio_to_irq(data->pdata->dc_det_pin), data);
2449 err_lowpowerirq_failed:
2450 if (batt_gpio_is_valid(data->pdata->batt_low_pin))
2451 free_irq(gpio_to_irq(data->pdata->batt_low_pin), data);
2456 err_pdata_alloc_failed:
2458 err_data_alloc_failed:
2461 printk("rk30_adc_battery: error!\n");
2466 static int rk30_adc_battery_remove(struct platform_device *pdev)
2468 struct rk30_adc_battery_data *data = platform_get_drvdata(pdev);
2469 struct rk30_adc_battery_platform_data *pdata = data->pdata;
2471 cancel_delayed_work_sync(&data->delay_work);
2472 if (batt_gpio_is_valid(pdata->dc_det_pin))
2473 cancel_work_sync(&data->dcwakeup_work);
2474 cancel_delayed_work_sync(&data->check_work);
2476 if (batt_gpio_is_valid(pdata->batt_low_pin))
2477 cancel_work_sync(&data->lowerpower_work);
2478 #if defined (CONFIG_BATTERY_RK30_USB_CHARGE)
2479 power_supply_unregister(&data ->usb);
2481 power_supply_unregister(&data ->ac);
2482 power_supply_unregister(&data ->bat);
2483 if (batt_gpio_is_valid(pdata->dc_det_pin))
2484 free_irq(gpio_to_irq(pdata->dc_det_pin), data);
2492 static const struct of_device_id rk30_adc_battery_dt_match[] = {
2493 { .compatible = "rk30-adc-battery",},
2496 MODULE_DEVICE_TABLE(of, rk30_adc_battery_dt_match);
2500 static struct platform_driver rk30_adc_battery_driver = {
2501 .probe = rk30_adc_battery_probe,
2502 .remove = rk30_adc_battery_remove,
2503 .suspend = rk30_adc_battery_suspend,
2504 .resume = rk30_adc_battery_resume,
2506 .name = "rk30-adc-battery",
2507 .owner = THIS_MODULE,
2508 .of_match_table = of_match_ptr(rk30_adc_battery_dt_match),
2512 static int __init rk30_adc_battery_init(void)
2514 return platform_driver_register(&rk30_adc_battery_driver);
2517 static void __exit rk30_adc_battery_exit(void)
2519 platform_driver_unregister(&rk30_adc_battery_driver);
2521 //module_init(rk30_adc_battery_init);//module_init(rk30_adc_battery_init);//
2522 subsys_initcall(rk30_adc_battery_init);
2523 //fs_initcall(rk30_adc_battery_init);
2524 module_exit(rk30_adc_battery_exit);
2528 MODULE_DESCRIPTION("Battery detect driver for the rk30");
2529 MODULE_AUTHOR("luowei lw@rock-chips.com");
2530 MODULE_LICENSE("GPL");