Lines Matching refs:di

288 	void (*led_init)(struct rk816_battery *di);
289 void (*led_charging)(struct rk816_battery *di);
290 void (*led_discharging)(struct rk816_battery *di);
291 void (*led_charging_full)(struct rk816_battery *di);
372 static int rk816_bat_read(struct rk816_battery *di, u8 reg) in rk816_bat_read() argument
376 ret = regmap_read(di->regmap, reg, &val); in rk816_bat_read()
378 dev_err(di->dev, "read reg:0x%x failed\n", reg); in rk816_bat_read()
383 static int rk816_bat_write(struct rk816_battery *di, u8 reg, u8 buf) in rk816_bat_write() argument
387 ret = regmap_write(di->regmap, reg, buf); in rk816_bat_write()
389 dev_err(di->dev, "i2c write reg: 0x%2x error\n", reg); in rk816_bat_write()
394 static int rk816_bat_set_bits(struct rk816_battery *di, u8 reg, u8 mask, u8 buf) in rk816_bat_set_bits() argument
398 ret = regmap_update_bits(di->regmap, reg, mask, buf); in rk816_bat_set_bits()
400 dev_err(di->dev, "write reg:0x%x failed\n", reg); in rk816_bat_set_bits()
405 static int rk816_bat_clear_bits(struct rk816_battery *di, u8 reg, u8 mask) in rk816_bat_clear_bits() argument
409 ret = regmap_update_bits(di->regmap, reg, mask, 0); in rk816_bat_clear_bits()
411 dev_err(di->dev, "clr reg:0x%02x failed\n", reg); in rk816_bat_clear_bits()
416 static void rk816_bat_dump_regs(struct rk816_battery *di, u8 start, u8 end) in rk816_bat_dump_regs() argument
425 DBG("0x%x: 0x%0x\n", i, rk816_bat_read(di, i)); in rk816_bat_dump_regs()
428 static bool rk816_bat_chrg_online(struct rk816_battery *di) in rk816_bat_chrg_online() argument
430 return (di->usb_in || di->ac_in || di->dc_in) ? true : false; in rk816_bat_chrg_online()
433 static int rk816_bat_get_coulomb_cap(struct rk816_battery *di) in rk816_bat_get_coulomb_cap() argument
437 val |= rk816_bat_read(di, RK816_GASCNT_REG3) << 24; in rk816_bat_get_coulomb_cap()
438 val |= rk816_bat_read(di, RK816_GASCNT_REG2) << 16; in rk816_bat_get_coulomb_cap()
439 val |= rk816_bat_read(di, RK816_GASCNT_REG1) << 8; in rk816_bat_get_coulomb_cap()
440 val |= rk816_bat_read(di, RK816_GASCNT_REG0) << 0; in rk816_bat_get_coulomb_cap()
442 if (!di->over_20mR) in rk816_bat_get_coulomb_cap()
443 cap = RES_FAC_MUX(val / 2390, di->res_fac); in rk816_bat_get_coulomb_cap()
445 cap = RES_FAC_DIV(val / 2390, di->res_fac); in rk816_bat_get_coulomb_cap()
450 static int rk816_bat_get_rsoc(struct rk816_battery *di) in rk816_bat_get_rsoc() argument
454 remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_get_rsoc()
455 return (remain_cap + di->fcc / 200) * 100 / DIV(di->fcc); in rk816_bat_get_rsoc()
463 struct rk816_battery *di = dev_get_drvdata(dev); in bat_info_store() local
467 dev_err(di->dev, "error! cmd require only one args\n"); in bat_info_store()
472 rk816_bat_set_bits(di, RK816_MISC_MARK_REG, in bat_info_store()
475 rk816_bat_set_bits(di, RK816_MISC_MARK_REG, in bat_info_store()
478 rk816_bat_clear_bits(di, RK816_MISC_MARK_REG, in bat_info_store()
481 BAT_INFO("0x%2x\n", rk816_bat_read(di, RK816_MISC_MARK_REG)); in bat_info_store()
492 static void rk816_bat_enable_input_current(struct rk816_battery *di) in rk816_bat_enable_input_current() argument
496 buf = rk816_bat_read(di, RK816_BAT_CTRL_REG); in rk816_bat_enable_input_current()
498 rk816_bat_write(di, RK816_BAT_CTRL_REG, buf); in rk816_bat_enable_input_current()
501 static void rk816_bat_disable_input_current(struct rk816_battery *di) in rk816_bat_disable_input_current() argument
505 buf = rk816_bat_read(di, RK816_BAT_CTRL_REG); in rk816_bat_disable_input_current()
507 rk816_bat_write(di, RK816_BAT_CTRL_REG, buf); in rk816_bat_disable_input_current()
510 static int rk816_bat_is_input_enabled(struct rk816_battery *di) in rk816_bat_is_input_enabled() argument
514 buf = rk816_bat_read(di, RK816_BAT_CTRL_REG); in rk816_bat_is_input_enabled()
518 static void rk816_bat_enable_gauge(struct rk816_battery *di) in rk816_bat_enable_gauge() argument
522 buf = rk816_bat_read(di, RK816_TS_CTRL_REG); in rk816_bat_enable_gauge()
524 rk816_bat_write(di, RK816_TS_CTRL_REG, buf); in rk816_bat_enable_gauge()
527 static void rk816_bat_save_age_level(struct rk816_battery *di, u8 level) in rk816_bat_save_age_level() argument
529 rk816_bat_write(di, RK816_UPDATE_LEVE_REG, level); in rk816_bat_save_age_level()
532 static u8 rk816_bat_get_age_level(struct rk816_battery *di) in rk816_bat_get_age_level() argument
534 return rk816_bat_read(di, RK816_UPDATE_LEVE_REG); in rk816_bat_get_age_level()
537 static int rk816_bat_get_vcalib0(struct rk816_battery *di) in rk816_bat_get_vcalib0() argument
541 val |= rk816_bat_read(di, RK816_VCALIB0_REGL) << 0; in rk816_bat_get_vcalib0()
542 val |= rk816_bat_read(di, RK816_VCALIB0_REGH) << 8; in rk816_bat_get_vcalib0()
548 static int rk816_bat_get_vcalib1(struct rk816_battery *di) in rk816_bat_get_vcalib1() argument
552 val |= rk816_bat_read(di, RK816_VCALIB1_REGL) << 0; in rk816_bat_get_vcalib1()
553 val |= rk816_bat_read(di, RK816_VCALIB1_REGH) << 8; in rk816_bat_get_vcalib1()
559 static int rk816_bat_get_ioffset(struct rk816_battery *di) in rk816_bat_get_ioffset() argument
563 val |= rk816_bat_read(di, RK816_IOFFSET_REGL) << 0; in rk816_bat_get_ioffset()
564 val |= rk816_bat_read(di, RK816_IOFFSET_REGH) << 8; in rk816_bat_get_ioffset()
570 static int rk816_bat_get_coffset(struct rk816_battery *di) in rk816_bat_get_coffset() argument
574 val |= rk816_bat_read(di, RK816_CAL_OFFSET_REGL) << 0; in rk816_bat_get_coffset()
575 val |= rk816_bat_read(di, RK816_CAL_OFFSET_REGH) << 8; in rk816_bat_get_coffset()
581 static void rk816_bat_set_coffset(struct rk816_battery *di, int val) in rk816_bat_set_coffset() argument
586 rk816_bat_write(di, RK816_CAL_OFFSET_REGH, buf); in rk816_bat_set_coffset()
588 rk816_bat_write(di, RK816_CAL_OFFSET_REGL, buf); in rk816_bat_set_coffset()
592 static void rk816_bat_init_voltage_kb(struct rk816_battery *di) in rk816_bat_init_voltage_kb() argument
596 vcalib0 = rk816_bat_get_vcalib0(di); in rk816_bat_init_voltage_kb()
597 vcalib1 = rk816_bat_get_vcalib1(di); in rk816_bat_init_voltage_kb()
598 di->voltage_k = (4200 - 3000) * 1000 / DIV(vcalib1 - vcalib0); in rk816_bat_init_voltage_kb()
599 di->voltage_b = 4200 - (di->voltage_k * vcalib1) / 1000; in rk816_bat_init_voltage_kb()
601 DBG("voltage_k=%d(*1000),voltage_b=%d\n", di->voltage_k, di->voltage_b); in rk816_bat_init_voltage_kb()
604 static int rk816_bat_get_ocv_voltage(struct rk816_battery *di) in rk816_bat_get_ocv_voltage() argument
608 val |= rk816_bat_read(di, RK816_BAT_OCV_REGL) << 0; in rk816_bat_get_ocv_voltage()
609 val |= rk816_bat_read(di, RK816_BAT_OCV_REGH) << 8; in rk816_bat_get_ocv_voltage()
610 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_ocv_voltage()
615 static int rk816_bat_get_avg_voltage(struct rk816_battery *di) in rk816_bat_get_avg_voltage() argument
619 val |= rk816_bat_read(di, RK816_BAT_VOL_REGL) << 0; in rk816_bat_get_avg_voltage()
620 val |= rk816_bat_read(di, RK816_BAT_VOL_REGH) << 8; in rk816_bat_get_avg_voltage()
621 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_avg_voltage()
626 static int rk816_bat_get_usb_voltage(struct rk816_battery *di) in rk816_bat_get_usb_voltage() argument
630 val |= rk816_bat_read(di, RK816_USB_ADC_REGL) << 0; in rk816_bat_get_usb_voltage()
631 val |= rk816_bat_read(di, RK816_USB_ADC_REGH) << 8; in rk816_bat_get_usb_voltage()
632 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_usb_voltage()
637 static bool is_rk816_bat_relax_mode(struct rk816_battery *di) in is_rk816_bat_relax_mode() argument
641 status = rk816_bat_read(di, RK816_GGSTS_REG); in is_rk816_bat_relax_mode()
648 static u16 rk816_bat_get_relax_vol1(struct rk816_battery *di) in rk816_bat_get_relax_vol1() argument
652 val |= rk816_bat_read(di, RK816_RELAX_VOL1_REGL) << 0; in rk816_bat_get_relax_vol1()
653 val |= rk816_bat_read(di, RK816_RELAX_VOL1_REGH) << 8; in rk816_bat_get_relax_vol1()
654 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_relax_vol1()
659 static u16 rk816_bat_get_relax_vol2(struct rk816_battery *di) in rk816_bat_get_relax_vol2() argument
663 val |= rk816_bat_read(di, RK816_RELAX_VOL2_REGL) << 0; in rk816_bat_get_relax_vol2()
664 val |= rk816_bat_read(di, RK816_RELAX_VOL2_REGH) << 8; in rk816_bat_get_relax_vol2()
665 vol = di->voltage_k * val / 1000 + di->voltage_b; in rk816_bat_get_relax_vol2()
670 static u16 rk816_bat_get_relax_voltage(struct rk816_battery *di) in rk816_bat_get_relax_voltage() argument
674 if (!is_rk816_bat_relax_mode(di)) in rk816_bat_get_relax_voltage()
677 relax_vol1 = rk816_bat_get_relax_vol1(di); in rk816_bat_get_relax_voltage()
678 relax_vol2 = rk816_bat_get_relax_vol2(di); in rk816_bat_get_relax_voltage()
683 static int rk816_bat_get_avg_current(struct rk816_battery *di) in rk816_bat_get_avg_current() argument
687 val |= rk816_bat_read(di, RK816_BAT_CUR_AVG_REGL) << 0; in rk816_bat_get_avg_current()
688 val |= rk816_bat_read(di, RK816_BAT_CUR_AVG_REGH) << 8; in rk816_bat_get_avg_current()
692 if (!di->over_20mR) in rk816_bat_get_avg_current()
693 cur = RES_FAC_MUX(val * 1506, di->res_fac) / 1000; in rk816_bat_get_avg_current()
695 cur = RES_FAC_DIV(val * 1506, di->res_fac) / 1000; in rk816_bat_get_avg_current()
700 static int rk816_bat_get_relax_cur1(struct rk816_battery *di) in rk816_bat_get_relax_cur1() argument
704 val |= rk816_bat_read(di, RK816_RELAX_CUR1_REGL) << 0; in rk816_bat_get_relax_cur1()
705 val |= rk816_bat_read(di, RK816_RELAX_CUR1_REGH) << 8; in rk816_bat_get_relax_cur1()
712 static int rk816_bat_get_relax_cur2(struct rk816_battery *di) in rk816_bat_get_relax_cur2() argument
716 val |= rk816_bat_read(di, RK816_RELAX_CUR2_REGL) << 0; in rk816_bat_get_relax_cur2()
717 val |= rk816_bat_read(di, RK816_RELAX_CUR2_REGH) << 8; in rk816_bat_get_relax_cur2()
724 static int rk816_bat_get_relax_current(struct rk816_battery *di) in rk816_bat_get_relax_current() argument
728 if (!is_rk816_bat_relax_mode(di)) in rk816_bat_get_relax_current()
731 relax_cur1 = rk816_bat_get_relax_cur1(di); in rk816_bat_get_relax_current()
732 relax_cur2 = rk816_bat_get_relax_cur2(di); in rk816_bat_get_relax_current()
737 static int rk816_bat_vol_to_ocvsoc(struct rk816_battery *di, int voltage) in rk816_bat_vol_to_ocvsoc() argument
742 ocv_table = di->pdata->ocv_table; in rk816_bat_vol_to_ocvsoc()
743 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_ocvsoc()
750 static int rk816_bat_vol_to_ocvcap(struct rk816_battery *di, int voltage) in rk816_bat_vol_to_ocvcap() argument
755 ocv_table = di->pdata->ocv_table; in rk816_bat_vol_to_ocvcap()
756 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_ocvcap()
758 cap = ab_div_c(temp, di->fcc, MAX_INTERPOLATE); in rk816_bat_vol_to_ocvcap()
763 static int rk816_bat_vol_to_zerosoc(struct rk816_battery *di, int voltage) in rk816_bat_vol_to_zerosoc() argument
768 ocv_table = di->pdata->zero_table; in rk816_bat_vol_to_zerosoc()
769 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_zerosoc()
776 static int rk816_bat_vol_to_zerocap(struct rk816_battery *di, int voltage) in rk816_bat_vol_to_zerocap() argument
781 ocv_table = di->pdata->zero_table; in rk816_bat_vol_to_zerocap()
782 ocv_size = di->pdata->ocv_size; in rk816_bat_vol_to_zerocap()
784 cap = ab_div_c(temp, di->fcc, MAX_INTERPOLATE); in rk816_bat_vol_to_zerocap()
789 static int rk816_bat_get_iadc(struct rk816_battery *di) in rk816_bat_get_iadc() argument
793 val |= rk816_bat_read(di, RK816_BAT_CUR_AVG_REGL) << 0; in rk816_bat_get_iadc()
794 val |= rk816_bat_read(di, RK816_BAT_CUR_AVG_REGH) << 8; in rk816_bat_get_iadc()
801 static bool is_rk816_bat_st_cvtlim(struct rk816_battery *di) in is_rk816_bat_st_cvtlim() argument
803 return (rk816_bat_read(di, RK816_INT_STS_REG1) & 0x80) ? true : false; in is_rk816_bat_st_cvtlim()
806 static bool rk816_bat_adc_calib(struct rk816_battery *di) in rk816_bat_adc_calib() argument
810 if ((di->chrg_status != CHARGE_FINISH) || in rk816_bat_adc_calib()
811 (di->adc_calib_cnt > ADC_CALIB_CNT) || in rk816_bat_adc_calib()
812 (base2min(di->boot_base) < ADC_CALIB_LMT_MIN) || in rk816_bat_adc_calib()
813 (abs(di->current_avg) < ADC_CALIB_THRESHOLD) || in rk816_bat_adc_calib()
814 (is_rk816_bat_st_cvtlim(di))) in rk816_bat_adc_calib()
817 di->adc_calib_cnt++; in rk816_bat_adc_calib()
818 save_coffset = rk816_bat_get_coffset(di); in rk816_bat_adc_calib()
820 if (!rk816_bat_chrg_online(di)) { in rk816_bat_adc_calib()
821 rk816_bat_set_coffset(di, save_coffset); in rk816_bat_adc_calib()
827 if (is_rk816_bat_st_cvtlim(di)) { in rk816_bat_adc_calib()
828 rk816_bat_set_coffset(di, save_coffset); in rk816_bat_adc_calib()
832 enable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
834 disable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
835 if (di->cvtlmt_int_event) { in rk816_bat_adc_calib()
836 di->cvtlmt_int_event = 0; in rk816_bat_adc_calib()
837 rk816_bat_set_coffset(di, save_coffset); in rk816_bat_adc_calib()
843 adc = rk816_bat_get_iadc(di); in rk816_bat_adc_calib()
844 coffset = rk816_bat_get_coffset(di); in rk816_bat_adc_calib()
845 rk816_bat_set_coffset(di, coffset + adc); in rk816_bat_adc_calib()
848 if (is_rk816_bat_st_cvtlim(di)) { in rk816_bat_adc_calib()
849 rk816_bat_set_coffset(di, save_coffset); in rk816_bat_adc_calib()
853 enable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
855 disable_irq(di->cvtlmt_irq); in rk816_bat_adc_calib()
856 if (di->cvtlmt_int_event) { in rk816_bat_adc_calib()
857 di->cvtlmt_int_event = 0; in rk816_bat_adc_calib()
858 rk816_bat_set_coffset(di, save_coffset); in rk816_bat_adc_calib()
864 adc = rk816_bat_get_iadc(di); in rk816_bat_adc_calib()
866 coffset = rk816_bat_get_coffset(di); in rk816_bat_adc_calib()
867 ioffset = rk816_bat_get_ioffset(di); in rk816_bat_adc_calib()
868 di->poffset = coffset - ioffset; in rk816_bat_adc_calib()
869 rk816_bat_write(di, RK816_PCB_IOFFSET_REG, di->poffset); in rk816_bat_adc_calib()
871 coffset, ioffset, di->poffset); in rk816_bat_adc_calib()
875 i, di->adc_calib_cnt); in rk816_bat_adc_calib()
876 rk816_bat_set_coffset(di, coffset); in rk816_bat_adc_calib()
880 rk816_bat_set_coffset(di, save_coffset); in rk816_bat_adc_calib()
885 static void rk816_bat_set_ioffset_sample(struct rk816_battery *di) in rk816_bat_set_ioffset_sample() argument
889 ggcon = rk816_bat_read(di, RK816_GGCON_REG); in rk816_bat_set_ioffset_sample()
892 rk816_bat_write(di, RK816_GGCON_REG, ggcon); in rk816_bat_set_ioffset_sample()
895 static void rk816_bat_set_ocv_sample(struct rk816_battery *di) in rk816_bat_set_ocv_sample() argument
899 ggcon = rk816_bat_read(di, RK816_GGCON_REG); in rk816_bat_set_ocv_sample()
902 rk816_bat_write(di, RK816_GGCON_REG, ggcon); in rk816_bat_set_ocv_sample()
905 static void rk816_bat_restart_relax(struct rk816_battery *di) in rk816_bat_restart_relax() argument
909 ggsts = rk816_bat_read(di, RK816_GGSTS_REG); in rk816_bat_restart_relax()
911 rk816_bat_write(di, RK816_GGSTS_REG, ggsts); in rk816_bat_restart_relax()
914 static void rk816_bat_set_relax_sample(struct rk816_battery *di) in rk816_bat_set_relax_sample() argument
918 struct battery_platform_data *pdata = di->pdata; in rk816_bat_set_relax_sample()
922 if (!di->over_20mR) { in rk816_bat_set_relax_sample()
924 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
926 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
929 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
931 di->res_fac) / 1506; in rk816_bat_set_relax_sample()
936 rk816_bat_write(di, RK816_RELAX_ENTRY_THRES_REGL, buf); in rk816_bat_set_relax_sample()
938 rk816_bat_write(di, RK816_RELAX_ENTRY_THRES_REGH, buf); in rk816_bat_set_relax_sample()
941 rk816_bat_write(di, RK816_RELAX_EXIT_THRES_REGL, buf); in rk816_bat_set_relax_sample()
943 rk816_bat_write(di, RK816_RELAX_EXIT_THRES_REGH, buf); in rk816_bat_set_relax_sample()
947 rk816_bat_write(di, RK816_SLEEP_CON_SAMP_CUR_REG, buf); in rk816_bat_set_relax_sample()
950 rk816_bat_restart_relax(di); in rk816_bat_set_relax_sample()
959 static void rk816_bat_lowpwr_check(struct rk816_battery *di) in rk816_bat_lowpwr_check() argument
962 int pwr_off_thresd = di->pdata->pwroff_vol; in rk816_bat_lowpwr_check()
964 if (di->current_avg < 0 && di->voltage_avg < pwr_off_thresd) { in rk816_bat_lowpwr_check()
969 (di->voltage_avg <= pwr_off_thresd - 50)) { in rk816_bat_lowpwr_check()
970 di->fake_offline = 1; in rk816_bat_lowpwr_check()
971 if (di->voltage_avg <= pwr_off_thresd - 50) in rk816_bat_lowpwr_check()
972 di->dsoc--; in rk816_bat_lowpwr_check()
974 di->dsoc, di->current_avg); in rk816_bat_lowpwr_check()
978 di->fake_offline = 0; in rk816_bat_lowpwr_check()
982 __func__, base2sec(time), di->dsoc, in rk816_bat_lowpwr_check()
983 di->current_avg, di->fake_offline); in rk816_bat_lowpwr_check()
986 static bool is_rk816_bat_exist(struct rk816_battery *di) in is_rk816_bat_exist() argument
988 return (rk816_bat_read(di, RK816_SUP_STS_REG) & BAT_EXS) ? true : false; in is_rk816_bat_exist()
991 static bool is_rk816_bat_first_pwron(struct rk816_battery *di) in is_rk816_bat_first_pwron() argument
995 buf = rk816_bat_read(di, RK816_GGSTS_REG); in is_rk816_bat_first_pwron()
998 rk816_bat_write(di, RK816_GGSTS_REG, buf); in is_rk816_bat_first_pwron()
1005 static u8 rk816_bat_get_pwroff_min(struct rk816_battery *di) in rk816_bat_get_pwroff_min() argument
1009 now_min = rk816_bat_read(di, RK816_NON_ACT_TIMER_CNT_REG); in rk816_bat_get_pwroff_min()
1010 last_min = rk816_bat_read(di, RK816_NON_ACT_TIMER_CNT_REG_SAVE); in rk816_bat_get_pwroff_min()
1011 rk816_bat_write(di, RK816_NON_ACT_TIMER_CNT_REG_SAVE, now_min); in rk816_bat_get_pwroff_min()
1016 static u8 is_rk816_bat_initialized(struct rk816_battery *di) in is_rk816_bat_initialized() argument
1018 u8 val = rk816_bat_read(di, RK816_MISC_MARK_REG); in is_rk816_bat_initialized()
1022 rk816_bat_write(di, RK816_MISC_MARK_REG, val); in is_rk816_bat_initialized()
1029 static bool is_rk816_bat_ocv_valid(struct rk816_battery *di) in is_rk816_bat_ocv_valid() argument
1031 return (!di->is_initialized && di->pwroff_min >= 30) ? true : false; in is_rk816_bat_ocv_valid()
1034 static void rk816_bat_init_age_algorithm(struct rk816_battery *di) in rk816_bat_init_age_algorithm() argument
1038 if (di->bat_first_power_on || is_rk816_bat_ocv_valid(di)) { in rk816_bat_init_age_algorithm()
1040 ocv_vol = rk816_bat_get_ocv_voltage(di); in rk816_bat_init_age_algorithm()
1041 ocv_soc = rk816_bat_vol_to_ocvsoc(di, ocv_vol); in rk816_bat_init_age_algorithm()
1042 ocv_cap = rk816_bat_vol_to_ocvcap(di, ocv_vol); in rk816_bat_init_age_algorithm()
1044 di->age_voltage = ocv_vol; in rk816_bat_init_age_algorithm()
1045 di->age_ocv_cap = ocv_cap; in rk816_bat_init_age_algorithm()
1046 di->age_ocv_soc = ocv_soc; in rk816_bat_init_age_algorithm()
1047 di->age_adjust_cap = 0; in rk816_bat_init_age_algorithm()
1050 di->age_level = 100; in rk816_bat_init_age_algorithm()
1052 di->age_level = 95; in rk816_bat_init_age_algorithm()
1054 di->age_level = 90; in rk816_bat_init_age_algorithm()
1056 di->age_level = 80; in rk816_bat_init_age_algorithm()
1058 age_level = rk816_bat_get_age_level(di); in rk816_bat_init_age_algorithm()
1059 if (age_level > di->age_level) { in rk816_bat_init_age_algorithm()
1060 di->age_allow_update = false; in rk816_bat_init_age_algorithm()
1064 rk816_bat_save_age_level(di, age_level); in rk816_bat_init_age_algorithm()
1066 di->age_allow_update = true; in rk816_bat_init_age_algorithm()
1067 di->age_keep_sec = get_boot_sec(); in rk816_bat_init_age_algorithm()
1071 di->age_voltage, di->age_ocv_cap, in rk816_bat_init_age_algorithm()
1072 ocv_soc, age_level, di->age_allow_update, in rk816_bat_init_age_algorithm()
1073 di->age_level); in rk816_bat_init_age_algorithm()
1097 struct rk816_battery *di = power_supply_get_drvdata(psy); in rk816_bat_ac_set_property() local
1102 rk816_bat_enable_input_current(di); in rk816_bat_ac_set_property()
1104 rk816_bat_disable_input_current(di); in rk816_bat_ac_set_property()
1117 struct rk816_battery *di = power_supply_get_drvdata(psy); in rk816_bat_usb_set_property() local
1122 rk816_bat_enable_input_current(di); in rk816_bat_usb_set_property()
1124 rk816_bat_disable_input_current(di); in rk816_bat_usb_set_property()
1133 static int rk816_get_capacity_leve(struct rk816_battery *di) in rk816_get_capacity_leve() argument
1135 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_get_capacity_leve()
1138 if (di->dsoc < 1) in rk816_get_capacity_leve()
1140 else if (di->dsoc <= 20) in rk816_get_capacity_leve()
1142 else if (di->dsoc <= 70) in rk816_get_capacity_leve()
1144 else if (di->dsoc <= 90) in rk816_get_capacity_leve()
1150 static int rk816_battery_time_to_full(struct rk816_battery *di) in rk816_battery_time_to_full() argument
1155 if (di->pdata->bat_mode == MODE_VIRTUAL) { in rk816_battery_time_to_full()
1157 } else if (di->voltage_avg > 0) { in rk816_battery_time_to_full()
1158 cap_temp = di->pdata->design_capacity - di->remain_cap; in rk816_battery_time_to_full()
1161 time_sec = (3600 * cap_temp) / di->voltage_avg; in rk816_battery_time_to_full()
1173 struct rk816_battery *di = power_supply_get_drvdata(psy); in rk816_battery_get_property() local
1177 val->intval = di->current_avg * 1000;/*uA*/ in rk816_battery_get_property()
1178 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1182 val->intval = di->voltage_avg * 1000;/*uV*/ in rk816_battery_get_property()
1183 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1187 val->intval = is_rk816_bat_exist(di); in rk816_battery_get_property()
1188 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1192 val->intval = di->dsoc; in rk816_battery_get_property()
1193 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1198 val->intval = rk816_get_capacity_leve(di); in rk816_battery_get_property()
1204 val->intval = di->prop_status; in rk816_battery_get_property()
1205 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1207 if (!rk816_bat_is_input_enabled(di)) in rk816_battery_get_property()
1211 val->intval = di->temperature; in rk816_battery_get_property()
1212 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_battery_get_property()
1216 val->intval = di->charge_count; in rk816_battery_get_property()
1220 val->intval = di->pdata->design_capacity * 1000;/* uAh */ in rk816_battery_get_property()
1223 val->intval = rk816_battery_time_to_full(di); in rk816_battery_get_property()
1251 struct rk816_battery *di = power_supply_get_drvdata(psy); in rk816_bat_ac_get_property() local
1255 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_bat_ac_get_property()
1257 else if (di->fake_offline) in rk816_bat_ac_get_property()
1260 val->intval = di->ac_in | di->dc_in; in rk816_bat_ac_get_property()
1263 val->intval = di->voltage_max; in rk816_bat_ac_get_property()
1266 val->intval = di->current_max; in rk816_bat_ac_get_property()
1269 val->intval = rk816_bat_is_input_enabled(di); in rk816_bat_ac_get_property()
1284 struct rk816_battery *di = power_supply_get_drvdata(psy); in rk816_bat_usb_get_property() local
1288 if (di->pdata->bat_mode == MODE_VIRTUAL) in rk816_bat_usb_get_property()
1290 else if (di->fake_offline) in rk816_bat_usb_get_property()
1293 val->intval = di->usb_in; in rk816_bat_usb_get_property()
1296 val->intval = di->voltage_max; in rk816_bat_usb_get_property()
1299 val->intval = di->current_max; in rk816_bat_usb_get_property()
1302 val->intval = rk816_bat_is_input_enabled(di); in rk816_bat_usb_get_property()
1353 static int rk816_bat_init_power_supply(struct rk816_battery *di) in rk816_bat_init_power_supply() argument
1355 struct power_supply_config psy_cfg = { .drv_data = di, }; in rk816_bat_init_power_supply()
1357 di->bat = devm_power_supply_register(di->dev, in rk816_bat_init_power_supply()
1359 if (IS_ERR(di->bat)) { in rk816_bat_init_power_supply()
1360 dev_err(di->dev, "register bat power supply fail\n"); in rk816_bat_init_power_supply()
1361 return PTR_ERR(di->bat); in rk816_bat_init_power_supply()
1364 di->ac = devm_power_supply_register(di->dev, in rk816_bat_init_power_supply()
1366 if (IS_ERR(di->ac)) { in rk816_bat_init_power_supply()
1367 dev_err(di->dev, "register ac power supply fail\n"); in rk816_bat_init_power_supply()
1368 return PTR_ERR(di->ac); in rk816_bat_init_power_supply()
1371 di->usb = devm_power_supply_register(di->dev, in rk816_bat_init_power_supply()
1373 if (IS_ERR(di->usb)) { in rk816_bat_init_power_supply()
1374 dev_err(di->dev, "register usb power supply fail\n"); in rk816_bat_init_power_supply()
1375 return PTR_ERR(di->usb); in rk816_bat_init_power_supply()
1381 static void rk816_bat_save_cap(struct rk816_battery *di, int capacity) in rk816_bat_save_cap() argument
1386 if (capacity >= di->qmax) in rk816_bat_save_cap()
1387 capacity = di->qmax; in rk816_bat_save_cap()
1395 rk816_bat_write(di, RK816_REMAIN_CAP_REG3, buf); in rk816_bat_save_cap()
1397 rk816_bat_write(di, RK816_REMAIN_CAP_REG2, buf); in rk816_bat_save_cap()
1399 rk816_bat_write(di, RK816_REMAIN_CAP_REG1, buf); in rk816_bat_save_cap()
1401 rk816_bat_write(di, RK816_REMAIN_CAP_REG0, buf); in rk816_bat_save_cap()
1404 static int rk816_bat_get_prev_cap(struct rk816_battery *di) in rk816_bat_get_prev_cap() argument
1408 val |= rk816_bat_read(di, RK816_REMAIN_CAP_REG3) << 24; in rk816_bat_get_prev_cap()
1409 val |= rk816_bat_read(di, RK816_REMAIN_CAP_REG2) << 16; in rk816_bat_get_prev_cap()
1410 val |= rk816_bat_read(di, RK816_REMAIN_CAP_REG1) << 8; in rk816_bat_get_prev_cap()
1411 val |= rk816_bat_read(di, RK816_REMAIN_CAP_REG0) << 0; in rk816_bat_get_prev_cap()
1416 static void rk816_bat_save_fcc(struct rk816_battery *di, u32 fcc) in rk816_bat_save_fcc() argument
1421 rk816_bat_write(di, RK816_NEW_FCC_REG3, buf); in rk816_bat_save_fcc()
1423 rk816_bat_write(di, RK816_NEW_FCC_REG2, buf); in rk816_bat_save_fcc()
1425 rk816_bat_write(di, RK816_NEW_FCC_REG1, buf); in rk816_bat_save_fcc()
1427 rk816_bat_write(di, RK816_NEW_FCC_REG0, buf); in rk816_bat_save_fcc()
1432 static int rk816_bat_get_fcc(struct rk816_battery *di) in rk816_bat_get_fcc() argument
1436 fcc |= rk816_bat_read(di, RK816_NEW_FCC_REG3) << 24; in rk816_bat_get_fcc()
1437 fcc |= rk816_bat_read(di, RK816_NEW_FCC_REG2) << 16; in rk816_bat_get_fcc()
1438 fcc |= rk816_bat_read(di, RK816_NEW_FCC_REG1) << 8; in rk816_bat_get_fcc()
1439 fcc |= rk816_bat_read(di, RK816_NEW_FCC_REG0) << 0; in rk816_bat_get_fcc()
1443 fcc = di->pdata->design_capacity; in rk816_bat_get_fcc()
1444 rk816_bat_save_fcc(di, fcc); in rk816_bat_get_fcc()
1445 } else if (fcc > di->pdata->design_qmax) { in rk816_bat_get_fcc()
1447 fcc = di->pdata->design_qmax; in rk816_bat_get_fcc()
1448 rk816_bat_save_fcc(di, fcc); in rk816_bat_get_fcc()
1454 static int rk816_bat_get_lock_fcc(struct rk816_battery *di) in rk816_bat_get_lock_fcc() argument
1460 reg = rk816_bat_read(di, RK816_GGSTS_REG); in rk816_bat_get_lock_fcc()
1464 val |= rk816_bat_read(di, RK816_FCC_GASCNT_REG3) << 24; in rk816_bat_get_lock_fcc()
1465 val |= rk816_bat_read(di, RK816_FCC_GASCNT_REG2) << 16; in rk816_bat_get_lock_fcc()
1466 val |= rk816_bat_read(di, RK816_FCC_GASCNT_REG1) << 8; in rk816_bat_get_lock_fcc()
1467 val |= rk816_bat_read(di, RK816_FCC_GASCNT_REG0) << 0; in rk816_bat_get_lock_fcc()
1472 rk816_bat_write(di, RK816_GGSTS_REG, reg); in rk816_bat_get_lock_fcc()
1478 static void rk816_bat_save_dsoc(struct rk816_battery *di, u8 save_soc) in rk816_bat_save_dsoc() argument
1483 rk816_bat_write(di, RK816_SOC_REG, save_soc); in rk816_bat_save_dsoc()
1488 static int rk816_bat_get_prev_dsoc(struct rk816_battery *di) in rk816_bat_get_prev_dsoc() argument
1490 return rk816_bat_read(di, RK816_SOC_REG); in rk816_bat_get_prev_dsoc()
1493 static void rk816_bat_save_reboot_cnt(struct rk816_battery *di, u8 save_cnt) in rk816_bat_save_reboot_cnt() argument
1495 rk816_bat_write(di, RK816_REBOOT_CNT_REG, save_cnt); in rk816_bat_save_reboot_cnt()
1498 static void rk816_bat_init_leds(struct rk816_battery *di) in rk816_bat_init_leds() argument
1501 rk816_led_ops->led_init(di); in rk816_bat_init_leds()
1506 static void rk816_bat_update_leds(struct rk816_battery *di, int prop) in rk816_bat_update_leds() argument
1517 rk816_led_ops->led_charging_full(di); in rk816_bat_update_leds()
1523 rk816_led_ops->led_charging(di); in rk816_bat_update_leds()
1529 rk816_led_ops->led_discharging(di); in rk816_bat_update_leds()
1539 static void rk816_bat_set_chrg_current(struct rk816_battery *di, in rk816_bat_set_chrg_current() argument
1544 chrg_ctrl_reg1 = rk816_bat_read(di, RK816_CHRG_CTRL_REG1); in rk816_bat_set_chrg_current()
1547 rk816_bat_write(di, RK816_CHRG_CTRL_REG1, chrg_ctrl_reg1); in rk816_bat_set_chrg_current()
1550 static void rk816_bat_set_input_current(struct rk816_battery *di, in rk816_bat_set_input_current() argument
1555 if (di->pdata->bat_mode == MODE_VIRTUAL) { in rk816_bat_set_input_current()
1557 input_current = di->chrg_cur_input; in rk816_bat_set_input_current()
1560 usb_ctrl = rk816_bat_read(di, RK816_USB_CTRL_REG); in rk816_bat_set_input_current()
1563 rk816_bat_write(di, RK816_USB_CTRL_REG, usb_ctrl); in rk816_bat_set_input_current()
1566 static void rk816_bat_set_chrg_param(struct rk816_battery *di, in rk816_bat_set_chrg_param() argument
1575 di->usb_in = 0; in rk816_bat_set_chrg_param()
1576 di->ac_in = 0; in rk816_bat_set_chrg_param()
1577 di->dc_in = 0; in rk816_bat_set_chrg_param()
1578 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1579 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1580 rk816_bat_set_input_current(di, INPUT_CUR450MA); in rk816_bat_set_chrg_param()
1581 power_supply_changed(di->bat); in rk816_bat_set_chrg_param()
1582 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1583 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1586 di->usb_in = 0; in rk816_bat_set_chrg_param()
1587 di->ac_in = 0; in rk816_bat_set_chrg_param()
1588 if (di->dc_in == 0) { in rk816_bat_set_chrg_param()
1589 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1590 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1591 rk816_bat_set_input_current(di, INPUT_CUR450MA); in rk816_bat_set_chrg_param()
1593 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1594 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1597 di->usb_in = 1; in rk816_bat_set_chrg_param()
1598 di->ac_in = 0; in rk816_bat_set_chrg_param()
1599 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1600 if (di->dc_in == 0) { in rk816_bat_set_chrg_param()
1601 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1602 rk816_bat_set_input_current(di, INPUT_CUR450MA); in rk816_bat_set_chrg_param()
1604 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1607 di->usb_in = 1; in rk816_bat_set_chrg_param()
1608 di->ac_in = 0; in rk816_bat_set_chrg_param()
1609 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1610 if (di->dc_in == 0) { in rk816_bat_set_chrg_param()
1611 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1612 rk816_bat_set_input_current(di, INPUT_CUR1500MA); in rk816_bat_set_chrg_param()
1614 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1617 di->ac_in = 1; in rk816_bat_set_chrg_param()
1618 di->usb_in = 0; in rk816_bat_set_chrg_param()
1619 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1620 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1621 rk816_bat_set_input_current(di, di->chrg_cur_input); in rk816_bat_set_chrg_param()
1622 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1625 di->dc_in = 1; in rk816_bat_set_chrg_param()
1626 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1627 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1628 rk816_bat_set_input_current(di, di->chrg_cur_input); in rk816_bat_set_chrg_param()
1629 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1632 di->dc_in = 0; in rk816_bat_set_chrg_param()
1638 buf = rk816_bat_read(di, RK816_VB_MON_REG); in rk816_bat_set_chrg_param()
1640 di->ac_in = 0; in rk816_bat_set_chrg_param()
1641 di->usb_in = 0; in rk816_bat_set_chrg_param()
1642 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1643 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1644 rk816_bat_set_input_current(di, INPUT_CUR450MA); in rk816_bat_set_chrg_param()
1645 } else if (di->usb_in) { in rk816_bat_set_chrg_param()
1646 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_set_chrg_param()
1647 rk816_bat_set_input_current(di, INPUT_CUR450MA); in rk816_bat_set_chrg_param()
1648 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_set_chrg_param()
1650 power_supply_changed(di->usb); in rk816_bat_set_chrg_param()
1651 power_supply_changed(di->ac); in rk816_bat_set_chrg_param()
1654 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_set_chrg_param()
1658 di->charger_changed = 1; in rk816_bat_set_chrg_param()
1660 usb_ctrl = rk816_bat_read(di, RK816_USB_CTRL_REG); in rk816_bat_set_chrg_param()
1661 chrg_ctrl1 = rk816_bat_read(di, RK816_CHRG_CTRL_REG1); in rk816_bat_set_chrg_param()
1667 if (di->dsoc == 100 && rk816_bat_chrg_online(di)) in rk816_bat_set_chrg_param()
1668 di->prop_status = POWER_SUPPLY_STATUS_FULL; in rk816_bat_set_chrg_param()
1670 rk816_bat_update_leds(di, di->prop_status); in rk816_bat_set_chrg_param()
1673 static void rk816_bat_set_otg_in(struct rk816_battery *di, int online) in rk816_bat_set_otg_in() argument
1675 di->otg_in = online; in rk816_bat_set_otg_in()
1720 static void rk816_bat_set_otg_power(struct rk816_battery *di, int power) in rk816_bat_set_otg_power() argument
1726 if (di->otg_pmic5v) { in rk816_bat_set_otg_power()
1732 buf = rk816_bat_read(di, RK816_VB_MON_REG); in rk816_bat_set_otg_power()
1739 rk816_bat_set_bits(di, RK816_DCDC_EN_REG2, in rk816_bat_set_otg_power()
1750 buf = rk816_bat_read(di, RK816_VB_MON_REG); in rk816_bat_set_otg_power()
1752 rk816_bat_set_bits(di, RK816_DCDC_EN_REG2, in rk816_bat_set_otg_power()
1762 rk816_bat_set_bits(di, RK816_DCDC_EN_REG2, in rk816_bat_set_otg_power()
1764 di->otg_pmic5v = 1; in rk816_bat_set_otg_power()
1768 if (!di->otg_pmic5v) { in rk816_bat_set_otg_power()
1771 rk816_bat_set_bits(di, RK816_DCDC_EN_REG2, in rk816_bat_set_otg_power()
1773 di->otg_pmic5v = 0; in rk816_bat_set_otg_power()
1782 static enum charger_t rk816_bat_get_adc_dc_state(struct rk816_battery *di) in rk816_bat_get_adc_dc_state() argument
1786 if (!di->iio_chan) { in rk816_bat_get_adc_dc_state()
1787 di->iio_chan = iio_channel_get(&di->rk816->i2c->dev, NULL); in rk816_bat_get_adc_dc_state()
1788 if (IS_ERR(di->iio_chan)) { in rk816_bat_get_adc_dc_state()
1789 di->iio_chan = NULL; in rk816_bat_get_adc_dc_state()
1794 if (iio_read_channel_raw(di->iio_chan, &val) < 0) { in rk816_bat_get_adc_dc_state()
1803 static enum charger_t rk816_bat_get_gpio_dc_state(struct rk816_battery *di) in rk816_bat_get_gpio_dc_state() argument
1807 if (!gpio_is_valid(di->pdata->dc_det_pin)) in rk816_bat_get_gpio_dc_state()
1810 level = gpio_get_value(di->pdata->dc_det_pin); in rk816_bat_get_gpio_dc_state()
1812 return (level == di->pdata->dc_det_level) ? in rk816_bat_get_gpio_dc_state()
1816 static enum charger_t rk816_bat_get_dc_state(struct rk816_battery *di) in rk816_bat_get_dc_state() argument
1820 if (di->pdata->dc_det_adc) in rk816_bat_get_dc_state()
1821 type = rk816_bat_get_adc_dc_state(di); in rk816_bat_get_dc_state()
1823 type = rk816_bat_get_gpio_dc_state(di); in rk816_bat_get_dc_state()
1832 struct rk816_battery *di = container_of(work, in rk816_bat_dc_delay_work() local
1835 type = rk816_bat_get_dc_state(di); in rk816_bat_dc_delay_work()
1842 rk816_bat_set_chrg_param(di, DC_TYPE_DC_CHARGER); in rk816_bat_dc_delay_work()
1844 if (di->otg_in && di->pdata->power_dc2otg) { in rk816_bat_dc_delay_work()
1846 rk816_bat_set_otg_power(di, USB_OTG_POWER_OFF); in rk816_bat_dc_delay_work()
1850 rk816_bat_set_chrg_param(di, DC_TYPE_NONE_CHARGER); in rk816_bat_dc_delay_work()
1852 if (di->otg_in) { in rk816_bat_dc_delay_work()
1859 rk816_bat_set_otg_power(di, USB_OTG_POWER_ON); in rk816_bat_dc_delay_work()
1864 if (di->pdata->dc_det_adc) in rk816_bat_dc_delay_work()
1865 queue_delayed_work(di->usb_charger_wq, in rk816_bat_dc_delay_work()
1866 &di->dc_delay_work, in rk816_bat_dc_delay_work()
1873 struct rk816_battery *di; in rk816_bat_fb_notifier() local
1879 di = container_of(nb, struct rk816_battery, fb_nb); in rk816_bat_fb_notifier()
1880 di->fb_blank = *(int *)evdata->data; in rk816_bat_fb_notifier()
1885 static int rk816_bat_register_fb_notify(struct rk816_battery *di) in rk816_bat_register_fb_notify() argument
1887 memset(&di->fb_nb, 0, sizeof(di->fb_nb)); in rk816_bat_register_fb_notify()
1888 di->fb_nb.notifier_call = rk816_bat_fb_notifier; in rk816_bat_register_fb_notify()
1890 return fb_register_client(&di->fb_nb); in rk816_bat_register_fb_notify()
1893 static int rk816_bat_unregister_fb_notify(struct rk816_battery *di) in rk816_bat_unregister_fb_notify() argument
1895 return fb_unregister_client(&di->fb_nb); in rk816_bat_unregister_fb_notify()
1898 static void rk816_bat_init_coulomb_cap(struct rk816_battery *di, u32 capacity) in rk816_bat_init_coulomb_cap() argument
1903 if (!di->over_20mR) in rk816_bat_init_coulomb_cap()
1904 cap = RES_FAC_DIV(capacity * 2390, di->res_fac); in rk816_bat_init_coulomb_cap()
1906 cap = RES_FAC_MUX(capacity * 2390, di->res_fac); in rk816_bat_init_coulomb_cap()
1909 rk816_bat_write(di, RK816_GASCNT_CAL_REG3, buf); in rk816_bat_init_coulomb_cap()
1911 rk816_bat_write(di, RK816_GASCNT_CAL_REG2, buf); in rk816_bat_init_coulomb_cap()
1913 rk816_bat_write(di, RK816_GASCNT_CAL_REG1, buf); in rk816_bat_init_coulomb_cap()
1915 rk816_bat_write(di, RK816_GASCNT_CAL_REG0, buf); in rk816_bat_init_coulomb_cap()
1917 di->remain_cap = capacity; in rk816_bat_init_coulomb_cap()
1918 di->rsoc = rk816_bat_get_rsoc(di); in rk816_bat_init_coulomb_cap()
1921 static u8 rk816_bat_get_halt_cnt(struct rk816_battery *di) in rk816_bat_get_halt_cnt() argument
1923 return rk816_bat_read(di, RK816_HALT_CNT_REG); in rk816_bat_get_halt_cnt()
1926 static void rk816_bat_inc_halt_cnt(struct rk816_battery *di) in rk816_bat_inc_halt_cnt() argument
1930 cnt = rk816_bat_read(di, RK816_HALT_CNT_REG); in rk816_bat_inc_halt_cnt()
1931 rk816_bat_write(di, RK816_HALT_CNT_REG, ++cnt); in rk816_bat_inc_halt_cnt()
1934 static bool is_rk816_bat_last_halt(struct rk816_battery *di) in is_rk816_bat_last_halt() argument
1936 int pre_cap = rk816_bat_get_prev_cap(di); in is_rk816_bat_last_halt()
1937 int now_cap = rk816_bat_get_coulomb_cap(di); in is_rk816_bat_last_halt()
1940 if (abs(now_cap - pre_cap) > (di->fcc / 10)) { in is_rk816_bat_last_halt()
1941 rk816_bat_inc_halt_cnt(di); in is_rk816_bat_last_halt()
1948 static void rk816_bat_first_pwron(struct rk816_battery *di) in rk816_bat_first_pwron() argument
1952 rk816_bat_save_fcc(di, di->design_cap); in rk816_bat_first_pwron()
1953 ocv_vol = rk816_bat_get_ocv_voltage(di); in rk816_bat_first_pwron()
1954 di->fcc = rk816_bat_get_fcc(di); in rk816_bat_first_pwron()
1955 di->nac = rk816_bat_vol_to_ocvcap(di, ocv_vol); in rk816_bat_first_pwron()
1956 di->rsoc = rk816_bat_vol_to_ocvsoc(di, ocv_vol); in rk816_bat_first_pwron()
1957 di->dsoc = di->rsoc; in rk816_bat_first_pwron()
1958 di->is_first_on = true; in rk816_bat_first_pwron()
1961 di->dsoc, di->rsoc, di->nac, di->fcc, ocv_vol); in rk816_bat_first_pwron()
1964 static void rk816_bat_not_first_pwron(struct rk816_battery *di) in rk816_bat_not_first_pwron() argument
1968 di->fcc = rk816_bat_get_fcc(di); in rk816_bat_not_first_pwron()
1969 pre_soc = rk816_bat_get_prev_dsoc(di); in rk816_bat_not_first_pwron()
1970 pre_cap = rk816_bat_get_prev_cap(di); in rk816_bat_not_first_pwron()
1971 now_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_not_first_pwron()
1972 di->is_halt = is_rk816_bat_last_halt(di); in rk816_bat_not_first_pwron()
1973 di->halt_cnt = rk816_bat_get_halt_cnt(di); in rk816_bat_not_first_pwron()
1974 di->is_initialized = is_rk816_bat_initialized(di); in rk816_bat_not_first_pwron()
1975 di->is_ocv_calib = is_rk816_bat_ocv_valid(di); in rk816_bat_not_first_pwron()
1977 if (di->is_initialized) { in rk816_bat_not_first_pwron()
1980 } else if (di->is_halt) { in rk816_bat_not_first_pwron()
1985 rk816_bat_init_coulomb_cap(di, now_cap); in rk816_bat_not_first_pwron()
1987 pre_soc = di->rsoc; in rk816_bat_not_first_pwron()
1989 } else if (di->is_ocv_calib) { in rk816_bat_not_first_pwron()
1990 ocv_vol = rk816_bat_get_ocv_voltage(di); in rk816_bat_not_first_pwron()
1991 ocv_soc = rk816_bat_vol_to_ocvsoc(di, ocv_vol); in rk816_bat_not_first_pwron()
1992 ocv_cap = rk816_bat_vol_to_ocvcap(di, ocv_vol); in rk816_bat_not_first_pwron()
1994 di->ocv_pre_dsoc = pre_soc; in rk816_bat_not_first_pwron()
1995 di->ocv_new_dsoc = ocv_soc; in rk816_bat_not_first_pwron()
1996 if (abs(ocv_soc - pre_soc) >= di->pdata->max_soc_offset) { in rk816_bat_not_first_pwron()
1997 di->ocv_pre_dsoc = pre_soc; in rk816_bat_not_first_pwron()
1998 di->ocv_new_dsoc = ocv_soc; in rk816_bat_not_first_pwron()
1999 di->is_max_soc_offset = true; in rk816_bat_not_first_pwron()
2005 } else if (di->pwroff_min > 0) { in rk816_bat_not_first_pwron()
2006 ocv_vol = rk816_bat_get_ocv_voltage(di); in rk816_bat_not_first_pwron()
2007 ocv_soc = rk816_bat_vol_to_ocvsoc(di, ocv_vol); in rk816_bat_not_first_pwron()
2008 ocv_cap = rk816_bat_vol_to_ocvcap(di, ocv_vol); in rk816_bat_not_first_pwron()
2009 di->force_pre_dsoc = pre_soc; in rk816_bat_not_first_pwron()
2010 di->force_new_dsoc = ocv_soc; in rk816_bat_not_first_pwron()
2012 di->is_force_calib = true; in rk816_bat_not_first_pwron()
2021 di->dsoc = pre_soc; in rk816_bat_not_first_pwron()
2022 di->nac = pre_cap; in rk816_bat_not_first_pwron()
2023 if (di->nac < 0) in rk816_bat_not_first_pwron()
2024 di->nac = 0; in rk816_bat_not_first_pwron()
2027 di->dsoc, di->nac, rk816_bat_get_avg_voltage(di), in rk816_bat_not_first_pwron()
2028 rk816_bat_get_ocv_voltage(di), rk816_bat_get_relax_voltage(di), in rk816_bat_not_first_pwron()
2029 di->pwroff_min, rk816_bat_get_prev_dsoc(di), in rk816_bat_not_first_pwron()
2030 rk816_bat_get_prev_cap(di)); in rk816_bat_not_first_pwron()
2033 static bool rk816_bat_ocv_sw_reset(struct rk816_battery *di) in rk816_bat_ocv_sw_reset() argument
2037 buf = rk816_bat_read(di, RK816_MISC_MARK_REG); in rk816_bat_ocv_sw_reset()
2038 if (((buf & FG_RESET_LATE) && di->pwroff_min >= 30) || in rk816_bat_ocv_sw_reset()
2042 rk816_bat_write(di, RK816_MISC_MARK_REG, buf); in rk816_bat_ocv_sw_reset()
2050 static void rk816_bat_setup_ocv_table(struct rk816_battery *di, int temp) in rk816_bat_setup_ocv_table() argument
2054 int *temp_t = di->pdata->temp_t; in rk816_bat_setup_ocv_table()
2055 int temp_t_num = di->pdata->temp_t_num; in rk816_bat_setup_ocv_table()
2065 di->pdata->ocv_table = di->pdata->table_t[0]; in rk816_bat_setup_ocv_table()
2072 di->pdata->ocv_table = di->pdata->table_t[temp_t_num - 1]; in rk816_bat_setup_ocv_table()
2080 di->pdata->ocv_table = di->pdata->table_t[i]; in rk816_bat_setup_ocv_table()
2101 for (i = 0; i < di->pdata->ocv_size; i++) { in rk816_bat_setup_ocv_table()
2102 volt_ltemp = di->pdata->table_t[idx][i]; in rk816_bat_setup_ocv_table()
2103 volt_htemp = di->pdata->table_t[idx + 1][i]; in rk816_bat_setup_ocv_table()
2105 di->pdata->ocv_table[i] = volt_ltemp + in rk816_bat_setup_ocv_table()
2109 temp_l, volt_ltemp, temp, di->pdata->ocv_table[i], in rk816_bat_setup_ocv_table()
2115 static void rk816_bat_init_rsoc(struct rk816_battery *di) in rk816_bat_init_rsoc() argument
2117 di->bat_first_power_on = is_rk816_bat_first_pwron(di); in rk816_bat_init_rsoc()
2118 di->is_sw_reset = rk816_bat_ocv_sw_reset(di); in rk816_bat_init_rsoc()
2119 di->pwroff_min = rk816_bat_get_pwroff_min(di); in rk816_bat_init_rsoc()
2121 if (di->bat_first_power_on || di->is_sw_reset) in rk816_bat_init_rsoc()
2122 rk816_bat_first_pwron(di); in rk816_bat_init_rsoc()
2124 rk816_bat_not_first_pwron(di); in rk816_bat_init_rsoc()
2127 static u8 rk816_bat_get_chrg_status(struct rk816_battery *di) in rk816_bat_get_chrg_status() argument
2131 status = rk816_bat_read(di, RK816_SUP_STS_REG) & CHRG_STATUS_MSK; in rk816_bat_get_chrg_status()
2171 static u8 rk816_bat_fb_temp(struct rk816_battery *di) in rk816_bat_fb_temp() argument
2177 fb_temp = di->pdata->fb_temp; in rk816_bat_fb_temp()
2187 static void rk816_bat_select_sample_res(struct rk816_battery *di) in rk816_bat_select_sample_res() argument
2189 if (di->pdata->sample_res == 20) { in rk816_bat_select_sample_res()
2190 di->over_20mR = 0; in rk816_bat_select_sample_res()
2191 di->res_fac = 10; in rk816_bat_select_sample_res()
2192 } else if (di->pdata->sample_res > 20) { in rk816_bat_select_sample_res()
2193 di->over_20mR = 1; in rk816_bat_select_sample_res()
2194 di->res_fac = di->pdata->sample_res * 10 / 20; in rk816_bat_select_sample_res()
2196 di->over_20mR = 0; in rk816_bat_select_sample_res()
2197 di->res_fac = 20 * 10 / di->pdata->sample_res; in rk816_bat_select_sample_res()
2201 static u8 rk816_bat_decode_input_current(struct rk816_battery *di, in rk816_bat_decode_input_current() argument
2224 static u8 rk816_bat_decode_chrg_current(struct rk816_battery *di, in rk816_bat_decode_chrg_current() argument
2230 if (di->pdata->sample_res < 20) { in rk816_bat_decode_chrg_current()
2232 chrg_current = RES_FAC_DIV(chrg_current, di->res_fac); in rk816_bat_decode_chrg_current()
2235 } else if (di->pdata->sample_res > 20) { in rk816_bat_decode_chrg_current()
2236 chrg_current = RES_FAC_MUX(chrg_current, di->res_fac); in rk816_bat_decode_chrg_current()
2252 static u8 rk816_bat_decode_chrg_vol(struct rk816_battery *di, in rk816_bat_decode_chrg_vol() argument
2267 static void rk816_bat_select_chrg_cv(struct rk816_battery *di) in rk816_bat_select_chrg_cv() argument
2269 di->chrg_vol_sel = rk816_bat_decode_chrg_vol(di, in rk816_bat_select_chrg_cv()
2270 di->pdata->max_chrg_voltage); in rk816_bat_select_chrg_cv()
2271 di->chrg_cur_input = rk816_bat_decode_input_current(di, in rk816_bat_select_chrg_cv()
2272 di->pdata->max_input_current); in rk816_bat_select_chrg_cv()
2273 di->chrg_cur_sel = rk816_bat_decode_chrg_current(di, in rk816_bat_select_chrg_cv()
2274 di->pdata->max_chrg_current); in rk816_bat_select_chrg_cv()
2277 __func__, di->chrg_vol_sel, di->chrg_cur_input, di->chrg_cur_sel); in rk816_bat_select_chrg_cv()
2280 static u8 rk816_bat_finish_ma(struct rk816_battery *di, int fcc) in rk816_bat_finish_ma() argument
2294 if (di->pdata->sample_res < 20) { in rk816_bat_finish_ma()
2300 } else if (di->pdata->sample_res > 20) { in rk816_bat_finish_ma()
2311 static void rk816_bat_init_chrg_config(struct rk816_battery *di) in rk816_bat_init_chrg_config() argument
2316 rk816_bat_select_chrg_cv(di); in rk816_bat_init_chrg_config()
2317 finish_ma = rk816_bat_finish_ma(di, di->fcc); in rk816_bat_init_chrg_config()
2318 fb_temp = rk816_bat_fb_temp(di); in rk816_bat_init_chrg_config()
2320 ggcon = rk816_bat_read(di, RK816_GGCON_REG); in rk816_bat_init_chrg_config()
2321 sup_sts = rk816_bat_read(di, RK816_SUP_STS_REG); in rk816_bat_init_chrg_config()
2322 thermal = rk816_bat_read(di, RK816_THERMAL_REG); in rk816_bat_init_chrg_config()
2323 usb_ctrl = rk816_bat_read(di, RK816_USB_CTRL_REG); in rk816_bat_init_chrg_config()
2324 chrg_ctrl1 = rk816_bat_read(di, RK816_CHRG_CTRL_REG1); in rk816_bat_init_chrg_config()
2325 chrg_ctrl2 = rk816_bat_read(di, RK816_CHRG_CTRL_REG2); in rk816_bat_init_chrg_config()
2326 chrg_ctrl3 = rk816_bat_read(di, RK816_CHRG_CTRL_REG3); in rk816_bat_init_chrg_config()
2330 usb_ctrl |= di->chrg_cur_input; in rk816_bat_init_chrg_config()
2331 chrg_ctrl1 = (CHRG_EN) | (di->chrg_vol_sel | di->chrg_cur_sel); in rk816_bat_init_chrg_config()
2346 if (di->pdata->fb_temp) in rk816_bat_init_chrg_config()
2357 rk816_bat_write(di, RK816_GGCON_REG, ggcon); in rk816_bat_init_chrg_config()
2358 rk816_bat_write(di, RK816_SUP_STS_REG, sup_sts); in rk816_bat_init_chrg_config()
2359 rk816_bat_write(di, RK816_THERMAL_REG, thermal); in rk816_bat_init_chrg_config()
2360 rk816_bat_write(di, RK816_USB_CTRL_REG, usb_ctrl); in rk816_bat_init_chrg_config()
2361 rk816_bat_write(di, RK816_CHRG_CTRL_REG1, chrg_ctrl1); in rk816_bat_init_chrg_config()
2362 rk816_bat_write(di, RK816_CHRG_CTRL_REG2, chrg_ctrl2); in rk816_bat_init_chrg_config()
2363 rk816_bat_write(di, RK816_CHRG_CTRL_REG3, chrg_ctrl3); in rk816_bat_init_chrg_config()
2366 static void rk816_bat_init_poffset(struct rk816_battery *di) in rk816_bat_init_poffset() argument
2370 coffset = rk816_bat_get_coffset(di); in rk816_bat_init_poffset()
2371 ioffset = rk816_bat_get_ioffset(di); in rk816_bat_init_poffset()
2372 di->poffset = coffset - ioffset; in rk816_bat_init_poffset()
2377 struct rk816_battery *di = from_timer(di, t, caltimer); in rk816_bat_caltimer_isr() local
2379 mod_timer(&di->caltimer, jiffies + MINUTE(8) * HZ); in rk816_bat_caltimer_isr()
2380 queue_delayed_work(di->bat_monitor_wq, &di->calib_delay_work, in rk816_bat_caltimer_isr()
2387 struct rk816_battery *di = container_of(work, in rk816_bat_internal_calib() local
2390 ioffset = rk816_bat_get_ioffset(di); in rk816_bat_internal_calib()
2391 rk816_bat_set_coffset(di, di->poffset + ioffset); in rk816_bat_internal_calib()
2392 rk816_bat_init_voltage_kb(di); in rk816_bat_internal_calib()
2394 ioffset, rk816_bat_get_coffset(di)); in rk816_bat_internal_calib()
2397 static void rk816_bat_init_caltimer(struct rk816_battery *di) in rk816_bat_init_caltimer() argument
2399 timer_setup(&di->caltimer, rk816_bat_caltimer_isr, 0); in rk816_bat_init_caltimer()
2400 di->caltimer.expires = jiffies + MINUTE(8) * HZ; in rk816_bat_init_caltimer()
2401 add_timer(&di->caltimer); in rk816_bat_init_caltimer()
2402 INIT_DELAYED_WORK(&di->calib_delay_work, rk816_bat_internal_calib); in rk816_bat_init_caltimer()
2405 static void rk816_bat_init_zero_table(struct rk816_battery *di) in rk816_bat_init_zero_table() argument
2410 ocv_size = di->pdata->ocv_size; in rk816_bat_init_zero_table()
2411 length = sizeof(di->pdata->zero_table) * ocv_size; in rk816_bat_init_zero_table()
2412 di->pdata->zero_table = in rk816_bat_init_zero_table()
2413 devm_kzalloc(di->dev, length, GFP_KERNEL); in rk816_bat_init_zero_table()
2414 if (!di->pdata->zero_table) { in rk816_bat_init_zero_table()
2415 di->pdata->zero_table = di->pdata->ocv_table; in rk816_bat_init_zero_table()
2416 dev_err(di->dev, "malloc zero table fail\n"); in rk816_bat_init_zero_table()
2420 min = di->pdata->pwroff_vol, in rk816_bat_init_zero_table()
2421 max = di->pdata->ocv_table[ocv_size - 4]; in rk816_bat_init_zero_table()
2424 di->pdata->zero_table[i] = min + (i * diff); in rk816_bat_init_zero_table()
2430 DBG("zero[%d] = %d\n", i, di->pdata->zero_table[i]); in rk816_bat_init_zero_table()
2433 DBG("ocv[%d] = %d\n", i, di->pdata->ocv_table[i]); in rk816_bat_init_zero_table()
2436 static void rk816_bat_calc_sm_linek(struct rk816_battery *di) in rk816_bat_calc_sm_linek() argument
2441 delta = abs(di->dsoc - di->rsoc); in rk816_bat_calc_sm_linek()
2443 current_avg = rk816_bat_get_avg_current(di); in rk816_bat_calc_sm_linek()
2445 if (di->dsoc < di->rsoc) in rk816_bat_calc_sm_linek()
2447 else if (di->dsoc > di->rsoc) in rk816_bat_calc_sm_linek()
2451 di->dbg_meet_soc = (di->dsoc >= di->rsoc) ? in rk816_bat_calc_sm_linek()
2452 (di->dsoc + diff) : (di->rsoc + diff); in rk816_bat_calc_sm_linek()
2454 if (di->dsoc < di->rsoc) in rk816_bat_calc_sm_linek()
2456 else if (di->dsoc > di->rsoc) in rk816_bat_calc_sm_linek()
2460 di->dbg_meet_soc = (di->dsoc >= di->rsoc) ? in rk816_bat_calc_sm_linek()
2461 (di->dsoc - diff) : (di->rsoc - diff); in rk816_bat_calc_sm_linek()
2464 di->sm_linek = linek; in rk816_bat_calc_sm_linek()
2465 di->sm_remain_cap = di->remain_cap; in rk816_bat_calc_sm_linek()
2466 di->dbg_calc_dsoc = di->dsoc; in rk816_bat_calc_sm_linek()
2467 di->dbg_calc_rsoc = di->rsoc; in rk816_bat_calc_sm_linek()
2472 static void rk816_bat_calc_zero_linek(struct rk816_battery *di) in rk816_bat_calc_zero_linek() argument
2481 if ((abs(di->current_avg) < 400) && (di->dsoc > 5)) in rk816_bat_calc_zero_linek()
2482 pwroff_vol = di->pdata->pwroff_vol + 50; in rk816_bat_calc_zero_linek()
2484 pwroff_vol = di->pdata->pwroff_vol; in rk816_bat_calc_zero_linek()
2487 voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_calc_zero_linek()
2488 current_avg = rk816_bat_get_avg_current(di); in rk816_bat_calc_zero_linek()
2492 di->pdata->pwroff_vol, pwroff_vol, di->pdata->zero_reserve_dsoc); in rk816_bat_calc_zero_linek()
2495 (di->bat_res + DEF_PWRPATH_RES) / 1000; in rk816_bat_calc_zero_linek()
2496 ocv_voltage = voltage_avg - (current_avg * di->bat_res) / 1000; in rk816_bat_calc_zero_linek()
2501 dead_soc = rk816_bat_vol_to_zerosoc(di, dead_voltage); in rk816_bat_calc_zero_linek()
2502 dead_cap = rk816_bat_vol_to_zerocap(di, dead_voltage); in rk816_bat_calc_zero_linek()
2506 ocv_soc = rk816_bat_vol_to_zerosoc(di, ocv_voltage); in rk816_bat_calc_zero_linek()
2507 ocv_cap = rk816_bat_vol_to_zerocap(di, ocv_voltage); in rk816_bat_calc_zero_linek()
2522 if ((xsoc <= 30) && (di->dsoc >= di->pdata->zero_reserve_dsoc)) in rk816_bat_calc_zero_linek()
2525 di->zero_remain_cap = di->remain_cap; in rk816_bat_calc_zero_linek()
2526 di->zero_timeout_cnt = 0; in rk816_bat_calc_zero_linek()
2527 if ((di->dsoc <= 1) && (xsoc > 0)) { in rk816_bat_calc_zero_linek()
2528 di->zero_linek = 400; in rk816_bat_calc_zero_linek()
2529 di->zero_drop_sec = 0; in rk816_bat_calc_zero_linek()
2531 di->zero_drop_sec = 0; in rk816_bat_calc_zero_linek()
2532 di->zero_linek = (di->zero_dsoc + xsoc / 2) / DIV(xsoc); in rk816_bat_calc_zero_linek()
2533 org_linek = di->zero_linek; in rk816_bat_calc_zero_linek()
2535 if ((di->pdata->energy_mode) && in rk816_bat_calc_zero_linek()
2536 (xsoc - di->dsoc >= MIN_ZERO_GAP_XSOC3) && in rk816_bat_calc_zero_linek()
2537 (di->dsoc <= 10) && (di->zero_linek < 300)) { in rk816_bat_calc_zero_linek()
2538 di->zero_linek = 300; in rk816_bat_calc_zero_linek()
2541 } else if ((xsoc - di->dsoc >= min_gap_xsoc) || in rk816_bat_calc_zero_linek()
2542 ((xsoc - di->dsoc >= MIN_ZERO_GAP_XSOC2) && in rk816_bat_calc_zero_linek()
2543 (di->dsoc <= 10) && (xsoc > 15))) { in rk816_bat_calc_zero_linek()
2545 di->dsoc >= di->pdata->zero_reserve_dsoc) in rk816_bat_calc_zero_linek()
2546 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2547 else if (xsoc - di->dsoc >= 2 * min_gap_xsoc) in rk816_bat_calc_zero_linek()
2548 di->zero_linek = 400; in rk816_bat_calc_zero_linek()
2549 else if (xsoc - di->dsoc >= 3 + min_gap_xsoc) in rk816_bat_calc_zero_linek()
2550 di->zero_linek = 600; in rk816_bat_calc_zero_linek()
2552 di->zero_linek = 800; in rk816_bat_calc_zero_linek()
2555 } else if ((di->zero_linek > 1800) && (di->dsoc > 70)) { in rk816_bat_calc_zero_linek()
2556 di->zero_linek = 1800; in rk816_bat_calc_zero_linek()
2559 } else if ((di->zero_linek > 1000) && (di->zero_linek < 1200)) { in rk816_bat_calc_zero_linek()
2560 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2563 } else if ((di->dsoc <= 15 && di->dsoc > 5) && in rk816_bat_calc_zero_linek()
2564 (di->zero_linek <= 1200)) { in rk816_bat_calc_zero_linek()
2566 if ((xsoc - di->dsoc) >= min_gap_xsoc) in rk816_bat_calc_zero_linek()
2567 di->zero_linek = 800; in rk816_bat_calc_zero_linek()
2570 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2573 } else if ((di->zero_linek < 1000) && (di->dsoc >= 5)) { in rk816_bat_calc_zero_linek()
2574 if ((xsoc - di->dsoc) < min_gap_xsoc) { in rk816_bat_calc_zero_linek()
2576 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2578 if (abs(di->current_avg) > 500)/* heavy */ in rk816_bat_calc_zero_linek()
2579 di->zero_linek = 900; in rk816_bat_calc_zero_linek()
2581 di->zero_linek = 1000; in rk816_bat_calc_zero_linek()
2585 } else if ((di->zero_linek < 1000) && (di->dsoc <= 5)) { in rk816_bat_calc_zero_linek()
2586 if ((xsoc - di->dsoc) <= 3) in rk816_bat_calc_zero_linek()
2587 di->zero_linek = 1200; in rk816_bat_calc_zero_linek()
2589 di->zero_linek = 800; in rk816_bat_calc_zero_linek()
2594 di->zero_linek = 1000; in rk816_bat_calc_zero_linek()
2595 if (!di->zero_drop_sec) in rk816_bat_calc_zero_linek()
2596 di->zero_drop_sec = get_boot_sec(); in rk816_bat_calc_zero_linek()
2597 if (base2sec(di->zero_drop_sec) >= WAIT_DSOC_DROP_SEC) { in rk816_bat_calc_zero_linek()
2598 DBG("ZERO0: t=%lu\n", base2sec(di->zero_drop_sec)); in rk816_bat_calc_zero_linek()
2599 di->zero_drop_sec = 0; in rk816_bat_calc_zero_linek()
2600 di->dsoc--; in rk816_bat_calc_zero_linek()
2601 di->zero_dsoc = (di->dsoc + 1) * 1000 - in rk816_bat_calc_zero_linek()
2607 if (!di->shtd_drop_sec) in rk816_bat_calc_zero_linek()
2608 di->shtd_drop_sec = get_boot_sec(); in rk816_bat_calc_zero_linek()
2609 if (base2sec(di->shtd_drop_sec) > WAIT_SHTD_DROP_SEC) { in rk816_bat_calc_zero_linek()
2610 BAT_INFO("voltage extreme low...soc:%d->0\n", di->dsoc); in rk816_bat_calc_zero_linek()
2611 di->shtd_drop_sec = 0; in rk816_bat_calc_zero_linek()
2612 di->dsoc = 0; in rk816_bat_calc_zero_linek()
2615 di->shtd_drop_sec = 0; in rk816_bat_calc_zero_linek()
2620 org_linek, di->zero_linek, di->dsoc, xsoc, di->rsoc, in rk816_bat_calc_zero_linek()
2621 min_gap_xsoc, voltage_avg, vsys, di->zero_dsoc, di->zero_remain_cap, in rk816_bat_calc_zero_linek()
2622 base2sec(di->zero_drop_sec), base2sec(di->shtd_drop_sec)); in rk816_bat_calc_zero_linek()
2625 static void rk816_bat_finish_algo_prepare(struct rk816_battery *di) in rk816_bat_finish_algo_prepare() argument
2627 di->chrg_finish_base = get_boot_sec(); in rk816_bat_finish_algo_prepare()
2628 if (!di->chrg_finish_base) in rk816_bat_finish_algo_prepare()
2629 di->chrg_finish_base = 1; in rk816_bat_finish_algo_prepare()
2632 static void rk816_bat_smooth_algo_prepare(struct rk816_battery *di) in rk816_bat_smooth_algo_prepare() argument
2636 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_smooth_algo_prepare()
2637 if (tmp_soc != di->dsoc) in rk816_bat_smooth_algo_prepare()
2638 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_smooth_algo_prepare()
2640 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_smooth_algo_prepare()
2641 if (tmp_soc != di->dsoc) in rk816_bat_smooth_algo_prepare()
2642 di->sm_dischrg_dsoc = in rk816_bat_smooth_algo_prepare()
2643 (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_smooth_algo_prepare()
2646 __func__, tmp_soc, di->dsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_smooth_algo_prepare()
2648 rk816_bat_calc_sm_linek(di); in rk816_bat_smooth_algo_prepare()
2651 static void rk816_bat_zero_algo_prepare(struct rk816_battery *di) in rk816_bat_zero_algo_prepare() argument
2655 di->zero_timeout_cnt = 0; in rk816_bat_zero_algo_prepare()
2656 tmp_dsoc = di->zero_dsoc / 1000; in rk816_bat_zero_algo_prepare()
2657 if (tmp_dsoc != di->dsoc) in rk816_bat_zero_algo_prepare()
2658 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_zero_algo_prepare()
2662 rk816_bat_calc_zero_linek(di); in rk816_bat_zero_algo_prepare()
2665 static void rk816_bat_calc_zero_algorithm(struct rk816_battery *di) in rk816_bat_calc_zero_algorithm() argument
2669 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2670 if (tmp_soc == di->dsoc) in rk816_bat_calc_zero_algorithm()
2673 DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc); in rk816_bat_calc_zero_algorithm()
2675 if (di->dsoc < di->rsoc) { in rk816_bat_calc_zero_algorithm()
2677 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2678 if (tmp_soc == di->dsoc) { in rk816_bat_calc_zero_algorithm()
2679 sm_delta_dsoc = di->sm_chrg_dsoc - di->dsoc * 1000; in rk816_bat_calc_zero_algorithm()
2680 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_zero_algorithm()
2681 di->zero_dsoc += sm_delta_dsoc; in rk816_bat_calc_zero_algorithm()
2687 if (di->dsoc > di->rsoc) { in rk816_bat_calc_zero_algorithm()
2689 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2690 if (tmp_soc == di->dsoc) { in rk816_bat_calc_zero_algorithm()
2691 sm_delta_dsoc = di->sm_dischrg_dsoc - in rk816_bat_calc_zero_algorithm()
2692 ((di->dsoc + 1) * 1000 - MIN_ACCURACY); in rk816_bat_calc_zero_algorithm()
2693 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - in rk816_bat_calc_zero_algorithm()
2695 di->zero_dsoc += sm_delta_dsoc; in rk816_bat_calc_zero_algorithm()
2701 if (di->zero_dsoc > (di->dsoc + 1) * 1000 - MIN_ACCURACY) { in rk816_bat_calc_zero_algorithm()
2702 DBG("ZERO1: zero dsoc overflow: %d\n", di->zero_dsoc); in rk816_bat_calc_zero_algorithm()
2703 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_zero_algorithm()
2707 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_zero_algorithm()
2708 if (tmp_soc != di->dsoc) { in rk816_bat_calc_zero_algorithm()
2710 if ((di->dsoc - tmp_soc) > 1) { in rk816_bat_calc_zero_algorithm()
2711 di->dsoc--; in rk816_bat_calc_zero_algorithm()
2712 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_zero_algorithm()
2715 di->dsoc = tmp_soc; in rk816_bat_calc_zero_algorithm()
2717 di->zero_drop_sec = 0; in rk816_bat_calc_zero_algorithm()
2722 di->zero_dsoc, di->dsoc, di->rsoc, tmp_soc); in rk816_bat_calc_zero_algorithm()
2724 di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_calc_zero_algorithm()
2727 static void rk816_bat_zero_algorithm(struct rk816_battery *di) in rk816_bat_zero_algorithm() argument
2731 di->zero_timeout_cnt++; in rk816_bat_zero_algorithm()
2732 delta_cap = di->zero_remain_cap - di->remain_cap; in rk816_bat_zero_algorithm()
2733 delta_soc = di->zero_linek * (delta_cap * 100) / DIV(di->fcc); in rk816_bat_zero_algorithm()
2738 di->zero_linek, di->zero_dsoc, di->dsoc, di->rsoc, in rk816_bat_zero_algorithm()
2739 delta_soc, delta_cap, di->zero_remain_cap, in rk816_bat_zero_algorithm()
2740 di->zero_timeout_cnt, di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_zero_algorithm()
2743 (di->zero_timeout_cnt > MIN_ZERO_OVERCNT) || in rk816_bat_zero_algorithm()
2744 (di->zero_linek == 0)) { in rk816_bat_zero_algorithm()
2746 di->zero_timeout_cnt = 0; in rk816_bat_zero_algorithm()
2747 di->zero_dsoc -= delta_soc; in rk816_bat_zero_algorithm()
2748 rk816_bat_calc_zero_algorithm(di); in rk816_bat_zero_algorithm()
2749 rk816_bat_calc_zero_linek(di); in rk816_bat_zero_algorithm()
2753 static void rk816_bat_dump_time_table(struct rk816_battery *di) in rk816_bat_dump_time_table() argument
2759 int mod = di->dsoc % 10; in rk816_bat_dump_time_table()
2760 int index = di->dsoc / 10; in rk816_bat_dump_time_table()
2762 if (rk816_bat_chrg_online(di)) in rk816_bat_dump_time_table()
2763 time = base2min(di->plug_in_base); in rk816_bat_dump_time_table()
2765 time = base2min(di->plug_out_base); in rk816_bat_dump_time_table()
2768 di->dbg_chrg_min[index - 1] = time - old_min; in rk816_bat_dump_time_table()
2774 DBG("Time[%d]=%d, ", (i * 10), di->dbg_chrg_min[i - 1]); in rk816_bat_dump_time_table()
2778 static void rk816_bat_debug_info(struct rk816_battery *di) in rk816_bat_debug_info() argument
2789 if (rk816_bat_chrg_online(di)) in rk816_bat_debug_info()
2790 di->plug_out_base = get_boot_sec(); in rk816_bat_debug_info()
2792 di->plug_in_base = get_boot_sec(); in rk816_bat_debug_info()
2794 rk816_bat_dump_time_table(di); in rk816_bat_debug_info()
2799 reboot_cnt = rk816_bat_read(di, RK816_REBOOT_CNT_REG); in rk816_bat_debug_info()
2800 ts_ctrl = rk816_bat_read(di, RK816_TS_CTRL_REG); in rk816_bat_debug_info()
2801 misc = rk816_bat_read(di, RK816_MISC_MARK_REG); in rk816_bat_debug_info()
2802 ggcon = rk816_bat_read(di, RK816_GGCON_REG); in rk816_bat_debug_info()
2803 ggsts = rk816_bat_read(di, RK816_GGSTS_REG); in rk816_bat_debug_info()
2804 sup_tst = rk816_bat_read(di, RK816_SUP_STS_REG); in rk816_bat_debug_info()
2805 vb_mod = rk816_bat_read(di, RK816_VB_MON_REG); in rk816_bat_debug_info()
2806 usb_ctrl = rk816_bat_read(di, RK816_USB_CTRL_REG); in rk816_bat_debug_info()
2807 chrg_ctrl1 = rk816_bat_read(di, RK816_CHRG_CTRL_REG1); in rk816_bat_debug_info()
2808 chrg_ctrl2 = rk816_bat_read(di, RK816_CHRG_CTRL_REG2); in rk816_bat_debug_info()
2809 chrg_ctrl3 = rk816_bat_read(di, RK816_CHRG_CTRL_REG3); in rk816_bat_debug_info()
2810 rtc = rk816_bat_read(di, RK808_SECONDS_REG); in rk816_bat_debug_info()
2811 thermal = rk816_bat_read(di, RK816_THERMAL_REG); in rk816_bat_debug_info()
2812 int_sts1 = rk816_bat_read(di, RK816_INT_STS_REG1); in rk816_bat_debug_info()
2813 int_sts2 = rk816_bat_read(di, RK816_INT_STS_REG2); in rk816_bat_debug_info()
2814 int_sts3 = rk816_bat_read(di, RK816_INT_STS_REG3); in rk816_bat_debug_info()
2815 int_msk1 = rk816_bat_read(di, RK816_INT_STS_MSK_REG1); in rk816_bat_debug_info()
2816 int_msk2 = rk816_bat_read(di, RK816_INT_STS_MSK_REG2); in rk816_bat_debug_info()
2817 int_msk3 = rk816_bat_read(di, RK816_INT_STS_MSK_REG3); in rk816_bat_debug_info()
2818 dcdc_en2 = rk816_bat_read(di, RK816_DCDC_EN_REG2); in rk816_bat_debug_info()
2820 if (!di->over_20mR) in rk816_bat_debug_info()
2821 chrg_sel = RES_FAC_MUX(chrg_sel, di->res_fac); in rk816_bat_debug_info()
2823 chrg_sel = RES_FAC_DIV(chrg_sel, di->res_fac); in rk816_bat_debug_info()
2851 di->dsoc, di->rsoc, di->voltage_avg, di->current_avg, in rk816_bat_debug_info()
2852 di->remain_cap, di->fcc, di->dsoc - di->rsoc, in rk816_bat_debug_info()
2853 di->sm_linek, work_mode[di->work_mode], di->sm_remain_cap, in rk816_bat_debug_info()
2857 rk816_bat_get_usb_voltage(di), in rk816_bat_debug_info()
2858 di->ac_in, di->usb_in, di->dc_in, di->otg_in, di->otg_pmic5v, in rk816_bat_debug_info()
2859 di->prop_status, in rk816_bat_debug_info()
2860 FEED_BACK_TEMP[(thermal & 0x0c) >> 2], di->temperature, in rk816_bat_debug_info()
2861 rk816_bat_get_ioffset(di), rk816_bat_get_coffset(di), in rk816_bat_debug_info()
2862 di->poffset, di->bat_res, di->age_adjust_cap, di->fb_blank, in rk816_bat_debug_info()
2864 base2min(di->plug_in_base), base2min(di->plug_out_base), in rk816_bat_debug_info()
2865 base2min(di->chrg_finish_base), di->lock_fcc, in rk816_bat_debug_info()
2866 base2min(di->boot_base), di->sleep_sum_sec / 60, in rk816_bat_debug_info()
2867 di->adc_allow_update, di->res_fac, in rk816_bat_debug_info()
2868 bat_mode[di->pdata->bat_mode], di->dbg_meet_soc, in rk816_bat_debug_info()
2869 di->dbg_calc_dsoc, di->dbg_calc_rsoc, di->voltage_ocv, in rk816_bat_debug_info()
2870 di->pdata->sample_res, in rk816_bat_debug_info()
2871 di->dbg_pwr_dsoc, di->dbg_pwr_rsoc, di->dbg_pwr_vol, di->is_halt, in rk816_bat_debug_info()
2872 di->halt_cnt, reboot_cnt, in rk816_bat_debug_info()
2873 di->is_ocv_calib, di->ocv_pre_dsoc, di->ocv_new_dsoc, in rk816_bat_debug_info()
2874 di->is_max_soc_offset, di->max_pre_dsoc, di->max_new_dsoc, in rk816_bat_debug_info()
2875 di->is_force_calib, di->force_pre_dsoc, di->force_new_dsoc, in rk816_bat_debug_info()
2876 di->pwroff_min, di->is_initialized, di->is_sw_reset, in rk816_bat_debug_info()
2877 di->dbg_cap_low0, di->is_first_on, di->last_dsoc in rk816_bat_debug_info()
2881 static void rk816_bat_init_capacity(struct rk816_battery *di, u32 cap) in rk816_bat_init_capacity() argument
2885 delta_cap = cap - di->remain_cap; in rk816_bat_init_capacity()
2889 di->age_adjust_cap += delta_cap; in rk816_bat_init_capacity()
2890 rk816_bat_init_coulomb_cap(di, cap); in rk816_bat_init_capacity()
2891 rk816_bat_smooth_algo_prepare(di); in rk816_bat_init_capacity()
2892 rk816_bat_zero_algo_prepare(di); in rk816_bat_init_capacity()
2895 static void rk816_bat_update_age_fcc(struct rk816_battery *di) in rk816_bat_update_age_fcc() argument
2901 di->lock_fcc = rk816_bat_get_lock_fcc(di); in rk816_bat_update_age_fcc()
2902 if (di->lock_fcc == 0) in rk816_bat_update_age_fcc()
2905 fcc = di->lock_fcc; in rk816_bat_update_age_fcc()
2906 remain_cap = fcc - di->age_ocv_cap - di->age_adjust_cap; in rk816_bat_update_age_fcc()
2907 age_keep_min = base2min(di->age_keep_sec); in rk816_bat_update_age_fcc()
2910 __func__, fcc, di->age_ocv_cap, di->age_adjust_cap, remain_cap, in rk816_bat_update_age_fcc()
2911 di->age_allow_update, age_keep_min); in rk816_bat_update_age_fcc()
2913 if ((di->chrg_status == CHARGE_FINISH) && (di->age_allow_update) && in rk816_bat_update_age_fcc()
2915 di->age_allow_update = false; in rk816_bat_update_age_fcc()
2916 fcc = remain_cap * 100 / DIV(100 - di->age_ocv_soc); in rk816_bat_update_age_fcc()
2918 di->lock_fcc, remain_cap, di->age_ocv_soc, in rk816_bat_update_age_fcc()
2919 di->age_ocv_cap, di->age_level, di->fcc, fcc); in rk816_bat_update_age_fcc()
2921 if ((fcc < di->qmax) && (fcc > MIN_FCC)) { in rk816_bat_update_age_fcc()
2922 BAT_INFO("fcc:%d->%d!\n", di->fcc, fcc); in rk816_bat_update_age_fcc()
2923 di->fcc = fcc; in rk816_bat_update_age_fcc()
2924 rk816_bat_init_capacity(di, di->fcc); in rk816_bat_update_age_fcc()
2925 rk816_bat_save_fcc(di, di->fcc); in rk816_bat_update_age_fcc()
2926 rk816_bat_save_age_level(di, di->age_level); in rk816_bat_update_age_fcc()
2931 static void rk816_bat_wait_finish_sig(struct rk816_battery *di) in rk816_bat_wait_finish_sig() argument
2933 int chrg_finish_vol = di->pdata->max_chrg_voltage; in rk816_bat_wait_finish_sig()
2935 if (!rk816_bat_chrg_online(di)) in rk816_bat_wait_finish_sig()
2938 if ((di->chrg_status == CHARGE_FINISH) && in rk816_bat_wait_finish_sig()
2939 (!is_rk816_bat_st_cvtlim(di)) && in rk816_bat_wait_finish_sig()
2940 (di->voltage_avg > chrg_finish_vol - 150) && di->adc_allow_update) { in rk816_bat_wait_finish_sig()
2941 rk816_bat_update_age_fcc(di);/* save new fcc*/ in rk816_bat_wait_finish_sig()
2942 if (rk816_bat_adc_calib(di)) in rk816_bat_wait_finish_sig()
2943 di->adc_allow_update = false; in rk816_bat_wait_finish_sig()
2947 static void rk816_bat_finish_algorithm(struct rk816_battery *di) in rk816_bat_finish_algorithm() argument
2953 if ((di->remain_cap != di->fcc) && in rk816_bat_finish_algorithm()
2954 (rk816_bat_get_chrg_status(di) == CHARGE_FINISH)) { in rk816_bat_finish_algorithm()
2955 di->age_adjust_cap += (di->fcc - di->remain_cap); in rk816_bat_finish_algorithm()
2956 rk816_bat_init_coulomb_cap(di, di->fcc); in rk816_bat_finish_algorithm()
2960 if (di->dsoc < 100) { in rk816_bat_finish_algorithm()
2961 if (!di->chrg_finish_base) in rk816_bat_finish_algorithm()
2962 di->chrg_finish_base = get_boot_sec(); in rk816_bat_finish_algorithm()
2964 finish_current = (di->rsoc - di->dsoc) > FINISH_MAX_SOC_DELAY ? in rk816_bat_finish_algorithm()
2966 finish_sec = base2sec(di->chrg_finish_base); in rk816_bat_finish_algorithm()
2967 soc_sec = di->fcc * 3600 / 100 / DIV(finish_current); in rk816_bat_finish_algorithm()
2971 di->dsoc += plus_soc; in rk816_bat_finish_algorithm()
2972 di->chrg_finish_base = get_boot_sec(); in rk816_bat_finish_algorithm()
2973 if (di->chrg_finish_base > rest) in rk816_bat_finish_algorithm()
2974 di->chrg_finish_base = get_boot_sec() - rest; in rk816_bat_finish_algorithm()
2978 __func__, di->dsoc, soc_sec, finish_sec, plus_soc, rest); in rk816_bat_finish_algorithm()
2982 static void rk816_bat_calc_smooth_dischrg(struct rk816_battery *di) in rk816_bat_calc_smooth_dischrg() argument
2986 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
2987 if (tmp_soc == di->dsoc) in rk816_bat_calc_smooth_dischrg()
2990 DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc); in rk816_bat_calc_smooth_dischrg()
2992 if (di->dsoc < di->rsoc) { in rk816_bat_calc_smooth_dischrg()
2993 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
2994 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_dischrg()
2995 sm_delta_dsoc = di->sm_chrg_dsoc - di->dsoc * 1000; in rk816_bat_calc_smooth_dischrg()
2996 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_smooth_dischrg()
2997 di->sm_dischrg_dsoc += sm_delta_dsoc; in rk816_bat_calc_smooth_dischrg()
3004 if (di->dsoc > di->rsoc) { in rk816_bat_calc_smooth_dischrg()
3005 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
3006 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_dischrg()
3007 zero_delta_dsoc = di->zero_dsoc - ((di->dsoc + 1) * in rk816_bat_calc_smooth_dischrg()
3009 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_dischrg()
3010 di->sm_dischrg_dsoc += zero_delta_dsoc; in rk816_bat_calc_smooth_dischrg()
3017 if ((di->sm_dischrg_dsoc) > ((di->dsoc + 1) * 1000 - MIN_ACCURACY)) { in rk816_bat_calc_smooth_dischrg()
3019 di->sm_dischrg_dsoc = (di->dsoc + 1) * in rk816_bat_calc_smooth_dischrg()
3024 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_smooth_dischrg()
3025 if (tmp_soc != di->dsoc) { in rk816_bat_calc_smooth_dischrg()
3026 di->dsoc = tmp_soc; in rk816_bat_calc_smooth_dischrg()
3027 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_smooth_dischrg()
3031 __func__, di->dsoc, di->rsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc, in rk816_bat_calc_smooth_dischrg()
3032 di->zero_dsoc); in rk816_bat_calc_smooth_dischrg()
3035 static void rk816_bat_calc_smooth_chrg(struct rk816_battery *di) in rk816_bat_calc_smooth_chrg() argument
3039 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3040 if (tmp_soc == di->dsoc) in rk816_bat_calc_smooth_chrg()
3043 DBG("<%s>. enter: dsoc=%d, rsoc=%d\n", __func__, di->dsoc, di->rsoc); in rk816_bat_calc_smooth_chrg()
3045 if (di->dsoc > di->rsoc) { in rk816_bat_calc_smooth_chrg()
3047 tmp_soc = di->sm_dischrg_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3048 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_chrg()
3049 sm_delta_dsoc = di->sm_dischrg_dsoc - in rk816_bat_calc_smooth_chrg()
3050 ((di->dsoc + 1) * 1000 - MIN_ACCURACY); in rk816_bat_calc_smooth_chrg()
3051 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - in rk816_bat_calc_smooth_chrg()
3053 di->sm_chrg_dsoc += sm_delta_dsoc; in rk816_bat_calc_smooth_chrg()
3059 tmp_soc = di->zero_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3060 if (tmp_soc == di->dsoc) { in rk816_bat_calc_smooth_chrg()
3061 zero_delta_dsoc = di->zero_dsoc - in rk816_bat_calc_smooth_chrg()
3062 ((di->dsoc + 1) * 1000 - MIN_ACCURACY); in rk816_bat_calc_smooth_chrg()
3063 di->zero_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_chrg()
3064 di->sm_chrg_dsoc += zero_delta_dsoc; in rk816_bat_calc_smooth_chrg()
3071 if (di->sm_chrg_dsoc < di->dsoc * 1000) { in rk816_bat_calc_smooth_chrg()
3073 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_calc_smooth_chrg()
3077 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_calc_smooth_chrg()
3078 if (tmp_soc != di->dsoc) { in rk816_bat_calc_smooth_chrg()
3079 di->dsoc = tmp_soc; in rk816_bat_calc_smooth_chrg()
3080 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_calc_smooth_chrg()
3084 __func__, di->dsoc, di->rsoc, di->sm_dischrg_dsoc, di->sm_chrg_dsoc, in rk816_bat_calc_smooth_chrg()
3085 di->zero_dsoc); in rk816_bat_calc_smooth_chrg()
3088 static void rk816_bat_smooth_algorithm(struct rk816_battery *di) in rk816_bat_smooth_algorithm() argument
3093 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_smooth_algorithm()
3096 if ((di->dsoc == 99) && (di->chrg_status == CC_OR_CV) && in rk816_bat_smooth_algorithm()
3097 (di->current_avg > 0)) { in rk816_bat_smooth_algorithm()
3098 di->sm_linek = FULL_CHRG_K; in rk816_bat_smooth_algorithm()
3100 } else if ((di->current_avg >= TERM_CHRG_CURR) && in rk816_bat_smooth_algorithm()
3101 (di->chrg_status == CC_OR_CV) && (di->dsoc >= TERM_CHRG_DSOC)) { in rk816_bat_smooth_algorithm()
3102 di->sm_linek = TERM_CHRG_K; in rk816_bat_smooth_algorithm()
3105 } else if ((di->current_avg <= SIMULATE_CHRG_CURR) && in rk816_bat_smooth_algorithm()
3106 (di->current_avg > 0) && (di->chrg_status == CC_OR_CV) && in rk816_bat_smooth_algorithm()
3107 (di->dsoc < TERM_CHRG_DSOC) && in rk816_bat_smooth_algorithm()
3108 ((di->rsoc - di->dsoc) >= SIMULATE_CHRG_INTV)) { in rk816_bat_smooth_algorithm()
3109 di->sm_linek = SIMULATE_CHRG_K; in rk816_bat_smooth_algorithm()
3113 if ((di->sm_linek * di->current_avg <= 0) || in rk816_bat_smooth_algorithm()
3114 (di->sm_linek == TERM_CHRG_K) || in rk816_bat_smooth_algorithm()
3115 (di->sm_linek == FULL_CHRG_K) || in rk816_bat_smooth_algorithm()
3116 (di->sm_linek == SIMULATE_CHRG_K)) { in rk816_bat_smooth_algorithm()
3118 rk816_bat_calc_sm_linek(di); in rk816_bat_smooth_algorithm()
3122 old_cap = di->sm_remain_cap; in rk816_bat_smooth_algorithm()
3128 if ((di->dsoc == di->rsoc) && (abs(di->sm_linek) != 1000) && in rk816_bat_smooth_algorithm()
3129 (di->sm_linek != FULL_CHRG_K && di->sm_linek != TERM_CHRG_K && in rk816_bat_smooth_algorithm()
3130 di->sm_linek != SIMULATE_CHRG_K)) { in rk816_bat_smooth_algorithm()
3131 if (!di->flat_match_sec) in rk816_bat_smooth_algorithm()
3132 di->flat_match_sec = get_boot_sec(); in rk816_bat_smooth_algorithm()
3133 tgt_sec = di->fcc * 3600 / 100 / DIV(abs(di->current_avg)) / 3; in rk816_bat_smooth_algorithm()
3134 if (base2sec(di->flat_match_sec) >= tgt_sec) { in rk816_bat_smooth_algorithm()
3135 di->flat_match_sec = 0; in rk816_bat_smooth_algorithm()
3136 di->sm_linek = (di->current_avg >= 0) ? 1000 : -1000; in rk816_bat_smooth_algorithm()
3139 base2sec(di->flat_match_sec), tgt_sec, di->sm_linek); in rk816_bat_smooth_algorithm()
3141 di->flat_match_sec = 0; in rk816_bat_smooth_algorithm()
3145 if ((abs(di->sm_linek) == 1000) || (di->current_avg >= 0 && in rk816_bat_smooth_algorithm()
3146 di->chrg_status == CC_OR_CV && di->dsoc >= 100)) { in rk816_bat_smooth_algorithm()
3147 DBG("<%s>. sm_linek=%d\n", __func__, di->sm_linek); in rk816_bat_smooth_algorithm()
3148 if (abs(di->sm_linek) == 1000) { in rk816_bat_smooth_algorithm()
3149 di->dsoc = di->rsoc; in rk816_bat_smooth_algorithm()
3150 di->sm_linek = (di->sm_linek > 0) ? 1000 : -1000; in rk816_bat_smooth_algorithm()
3152 __func__, di->sm_linek); in rk816_bat_smooth_algorithm()
3154 di->sm_remain_cap = di->remain_cap; in rk816_bat_smooth_algorithm()
3155 di->sm_chrg_dsoc = di->dsoc * 1000; in rk816_bat_smooth_algorithm()
3156 di->sm_dischrg_dsoc = (di->dsoc + 1) * 1000 - MIN_ACCURACY; in rk816_bat_smooth_algorithm()
3158 __func__, di->sm_dischrg_dsoc, di->sm_chrg_dsoc); in rk816_bat_smooth_algorithm()
3160 delta_cap = di->remain_cap - di->sm_remain_cap; in rk816_bat_smooth_algorithm()
3165 ydsoc = di->sm_linek * abs(delta_cap) * 100 / DIV(di->fcc); in rk816_bat_smooth_algorithm()
3170 di->sm_remain_cap = di->remain_cap; in rk816_bat_smooth_algorithm()
3173 __func__, di->sm_linek, ydsoc, old_cap, in rk816_bat_smooth_algorithm()
3174 di->sm_remain_cap, delta_cap); in rk816_bat_smooth_algorithm()
3178 di->sm_dischrg_dsoc += ydsoc; in rk816_bat_smooth_algorithm()
3179 rk816_bat_calc_smooth_dischrg(di); in rk816_bat_smooth_algorithm()
3182 di->sm_chrg_dsoc += ydsoc; in rk816_bat_smooth_algorithm()
3183 rk816_bat_calc_smooth_chrg(di); in rk816_bat_smooth_algorithm()
3186 if (di->s2r) { in rk816_bat_smooth_algorithm()
3187 di->s2r = false; in rk816_bat_smooth_algorithm()
3188 rk816_bat_calc_sm_linek(di); in rk816_bat_smooth_algorithm()
3193 static bool rk816_bat_fake_finish_mode(struct rk816_battery *di) in rk816_bat_fake_finish_mode() argument
3195 if ((di->rsoc == 100) && (rk816_bat_get_chrg_status(di) == CC_OR_CV) && in rk816_bat_fake_finish_mode()
3196 (abs(di->current_avg) <= 100)) in rk816_bat_fake_finish_mode()
3202 static void rk816_bat_display_smooth(struct rk816_battery *di) in rk816_bat_display_smooth() argument
3205 if (di->s2r && !di->sleep_chrg_online) { in rk816_bat_display_smooth()
3207 di->s2r = false; in rk816_bat_display_smooth()
3208 rk816_bat_zero_algo_prepare(di); in rk816_bat_display_smooth()
3209 rk816_bat_smooth_algo_prepare(di); in rk816_bat_display_smooth()
3213 if (di->work_mode == MODE_FINISH) { in rk816_bat_display_smooth()
3215 rk816_bat_finish_algorithm(di); in rk816_bat_display_smooth()
3216 if ((rk816_bat_get_chrg_status(di) != CHARGE_FINISH) && in rk816_bat_display_smooth()
3217 !rk816_bat_fake_finish_mode(di)) { in rk816_bat_display_smooth()
3218 if ((di->current_avg < 0) && in rk816_bat_display_smooth()
3219 (di->voltage_avg < di->pdata->zero_algorithm_vol)) { in rk816_bat_display_smooth()
3221 rk816_bat_zero_algo_prepare(di); in rk816_bat_display_smooth()
3222 di->work_mode = MODE_ZERO; in rk816_bat_display_smooth()
3225 rk816_bat_smooth_algo_prepare(di); in rk816_bat_display_smooth()
3226 di->work_mode = MODE_SMOOTH; in rk816_bat_display_smooth()
3229 } else if (di->work_mode == MODE_ZERO) { in rk816_bat_display_smooth()
3231 rk816_bat_zero_algorithm(di); in rk816_bat_display_smooth()
3232 if ((di->voltage_avg >= di->pdata->zero_algorithm_vol + 50) || in rk816_bat_display_smooth()
3233 (di->current_avg >= 0)) { in rk816_bat_display_smooth()
3235 rk816_bat_smooth_algo_prepare(di); in rk816_bat_display_smooth()
3236 di->work_mode = MODE_SMOOTH; in rk816_bat_display_smooth()
3237 } else if ((rk816_bat_get_chrg_status(di) == CHARGE_FINISH) || in rk816_bat_display_smooth()
3238 rk816_bat_fake_finish_mode(di)) { in rk816_bat_display_smooth()
3240 rk816_bat_finish_algo_prepare(di); in rk816_bat_display_smooth()
3241 di->work_mode = MODE_FINISH; in rk816_bat_display_smooth()
3245 rk816_bat_smooth_algorithm(di); in rk816_bat_display_smooth()
3246 if ((di->current_avg < 0) && in rk816_bat_display_smooth()
3247 (di->voltage_avg < di->pdata->zero_algorithm_vol)) { in rk816_bat_display_smooth()
3249 rk816_bat_zero_algo_prepare(di); in rk816_bat_display_smooth()
3250 di->work_mode = MODE_ZERO; in rk816_bat_display_smooth()
3251 } else if ((rk816_bat_get_chrg_status(di) == CHARGE_FINISH) || in rk816_bat_display_smooth()
3252 rk816_bat_fake_finish_mode(di)) { in rk816_bat_display_smooth()
3254 rk816_bat_finish_algo_prepare(di); in rk816_bat_display_smooth()
3255 di->work_mode = MODE_FINISH; in rk816_bat_display_smooth()
3260 static void rk816_bat_relax_vol_calib(struct rk816_battery *di) in rk816_bat_relax_vol_calib() argument
3264 vol = di->voltage_relax - (di->current_relax * di->bat_res) / 1000; in rk816_bat_relax_vol_calib()
3265 soc = rk816_bat_vol_to_ocvsoc(di, vol); in rk816_bat_relax_vol_calib()
3266 cap = rk816_bat_vol_to_ocvcap(di, vol); in rk816_bat_relax_vol_calib()
3267 rk816_bat_init_capacity(di, cap); in rk816_bat_relax_vol_calib()
3271 static void rk816_bat_relife_age_flag(struct rk816_battery *di) in rk816_bat_relife_age_flag() argument
3275 if (di->voltage_relax <= 0) in rk816_bat_relife_age_flag()
3278 ocv_soc = rk816_bat_vol_to_ocvsoc(di, di->voltage_relax); in rk816_bat_relife_age_flag()
3279 ocv_cap = rk816_bat_vol_to_ocvcap(di, di->voltage_relax); in rk816_bat_relife_age_flag()
3281 ocv_soc, di->sleep_dischrg_sec / 60, di->voltage_relax); in rk816_bat_relife_age_flag()
3284 if (!di->age_allow_update && ocv_soc <= 10) { in rk816_bat_relife_age_flag()
3285 di->age_voltage = di->voltage_relax; in rk816_bat_relife_age_flag()
3286 di->age_ocv_cap = ocv_cap; in rk816_bat_relife_age_flag()
3287 di->age_ocv_soc = ocv_soc; in rk816_bat_relife_age_flag()
3288 di->age_adjust_cap = 0; in rk816_bat_relife_age_flag()
3291 di->age_level = 100; in rk816_bat_relife_age_flag()
3293 di->age_level = 90; in rk816_bat_relife_age_flag()
3295 di->age_level = 80; in rk816_bat_relife_age_flag()
3297 soc_level = rk816_bat_get_age_level(di); in rk816_bat_relife_age_flag()
3298 if (soc_level > di->age_level) { in rk816_bat_relife_age_flag()
3299 di->age_allow_update = false; in rk816_bat_relife_age_flag()
3301 di->age_allow_update = true; in rk816_bat_relife_age_flag()
3302 di->age_keep_sec = get_boot_sec(); in rk816_bat_relife_age_flag()
3306 di->age_voltage, di->age_ocv_cap, ocv_soc, soc_level, in rk816_bat_relife_age_flag()
3307 di->age_allow_update, di->age_level); in rk816_bat_relife_age_flag()
3311 static int rk816_bat_sleep_dischrg(struct rk816_battery *di) in rk816_bat_sleep_dischrg() argument
3315 int pwroff_vol = di->pdata->pwroff_vol; in rk816_bat_sleep_dischrg()
3316 unsigned long sleep_sec = di->sleep_dischrg_sec; in rk816_bat_sleep_dischrg()
3319 __func__, di->dsoc, di->rsoc, di->voltage_relax, in rk816_bat_sleep_dischrg()
3320 di->voltage_avg, sleep_sec / 60); in rk816_bat_sleep_dischrg()
3322 if (di->voltage_relax >= di->voltage_avg) { in rk816_bat_sleep_dischrg()
3323 rk816_bat_relax_vol_calib(di); in rk816_bat_sleep_dischrg()
3324 rk816_bat_restart_relax(di); in rk816_bat_sleep_dischrg()
3325 rk816_bat_relife_age_flag(di); in rk816_bat_sleep_dischrg()
3330 if (di->dsoc <= di->rsoc) { in rk816_bat_sleep_dischrg()
3331 di->sleep_sum_cap = (SLP_CURR_MIN * sleep_sec / 3600); in rk816_bat_sleep_dischrg()
3332 sleep_soc = di->sleep_sum_cap * 100 / DIV(di->fcc); in rk816_bat_sleep_dischrg()
3333 tgt_dsoc = di->dsoc - sleep_soc; in rk816_bat_sleep_dischrg()
3336 di->rsoc, di->dsoc, sleep_soc); in rk816_bat_sleep_dischrg()
3337 if (di->dsoc < 5) { in rk816_bat_sleep_dischrg()
3338 di->dsoc--; in rk816_bat_sleep_dischrg()
3339 } else if ((tgt_dsoc < 5) && (di->dsoc >= 5)) { in rk816_bat_sleep_dischrg()
3340 if (di->dsoc == 5) in rk816_bat_sleep_dischrg()
3341 di->dsoc--; in rk816_bat_sleep_dischrg()
3343 di->dsoc = 5; in rk816_bat_sleep_dischrg()
3345 di->dsoc = tgt_dsoc; in rk816_bat_sleep_dischrg()
3350 __func__, di->sleep_sum_cap, sleep_soc, tgt_dsoc); in rk816_bat_sleep_dischrg()
3353 di->sleep_sum_cap = (SLP_CURR_MAX * sleep_sec / 3600); in rk816_bat_sleep_dischrg()
3354 sleep_soc = di->sleep_sum_cap / DIV(di->fcc / 100); in rk816_bat_sleep_dischrg()
3355 gap_soc = di->dsoc - di->rsoc; in rk816_bat_sleep_dischrg()
3358 di->rsoc, di->dsoc, sleep_soc); in rk816_bat_sleep_dischrg()
3361 di->dsoc -= (sleep_soc * 2); in rk816_bat_sleep_dischrg()
3363 di->dsoc -= sleep_soc; in rk816_bat_sleep_dischrg()
3365 di->dsoc = di->rsoc; in rk816_bat_sleep_dischrg()
3369 __func__, di->sleep_sum_cap, sleep_soc, gap_soc); in rk816_bat_sleep_dischrg()
3372 if (di->voltage_avg <= pwroff_vol - 70) { in rk816_bat_sleep_dischrg()
3373 di->dsoc = 0; in rk816_bat_sleep_dischrg()
3375 BAT_INFO("low power sleeping, shutdown... %d\n", di->dsoc); in rk816_bat_sleep_dischrg()
3378 if (ocv_soc_updated && sleep_soc && (di->rsoc - di->dsoc) < 5 && in rk816_bat_sleep_dischrg()
3379 di->dsoc < 40) { in rk816_bat_sleep_dischrg()
3380 di->dsoc--; in rk816_bat_sleep_dischrg()
3381 BAT_INFO("low power sleeping, reserved... %d\n", di->dsoc); in rk816_bat_sleep_dischrg()
3384 if (di->dsoc <= 0) { in rk816_bat_sleep_dischrg()
3385 di->dsoc = 0; in rk816_bat_sleep_dischrg()
3387 BAT_INFO("sleep dsoc is %d...\n", di->dsoc); in rk816_bat_sleep_dischrg()
3391 __func__, di->dsoc, di->rsoc, di->sleep_sum_cap); in rk816_bat_sleep_dischrg()
3396 static void rk816_bat_power_supply_changed(struct rk816_battery *di) in rk816_bat_power_supply_changed() argument
3402 if (di->dsoc > 100) in rk816_bat_power_supply_changed()
3403 di->dsoc = 100; in rk816_bat_power_supply_changed()
3404 else if (di->dsoc < 0) in rk816_bat_power_supply_changed()
3405 di->dsoc = 0; in rk816_bat_power_supply_changed()
3408 if (rk816_bat_chrg_online(di)) { in rk816_bat_power_supply_changed()
3409 if (di->dsoc == 100) in rk816_bat_power_supply_changed()
3410 di->prop_status = POWER_SUPPLY_STATUS_FULL; in rk816_bat_power_supply_changed()
3412 di->prop_status = POWER_SUPPLY_STATUS_CHARGING; in rk816_bat_power_supply_changed()
3413 rk816_bat_update_leds(di, di->prop_status); in rk816_bat_power_supply_changed()
3416 if (di->dsoc == old_soc) in rk816_bat_power_supply_changed()
3420 thermal = rk816_bat_read(di, RK816_THERMAL_REG); in rk816_bat_power_supply_changed()
3421 status = rk816_bat_read(di, RK816_SUP_STS_REG); in rk816_bat_power_supply_changed()
3423 old_soc = di->dsoc; in rk816_bat_power_supply_changed()
3424 di->last_dsoc = di->dsoc; in rk816_bat_power_supply_changed()
3425 power_supply_changed(di->bat); in rk816_bat_power_supply_changed()
3427 di->dsoc, di->rsoc, di->voltage_avg, di->voltage_ocv, in rk816_bat_power_supply_changed()
3428 di->current_avg, di->remain_cap, di->fcc, bat_status[status], in rk816_bat_power_supply_changed()
3432 di->dbg_pwr_dsoc, di->dbg_pwr_rsoc, di->dbg_pwr_vol, in rk816_bat_power_supply_changed()
3433 di->is_halt, di->halt_cnt, di->is_max_soc_offset, in rk816_bat_power_supply_changed()
3434 di->is_initialized, di->is_sw_reset, di->is_ocv_calib, in rk816_bat_power_supply_changed()
3435 di->dbg_cap_low0, di->is_force_calib); in rk816_bat_power_supply_changed()
3438 static u8 rk816_bat_check_reboot(struct rk816_battery *di) in rk816_bat_check_reboot() argument
3442 cnt = rk816_bat_read(di, RK816_REBOOT_CNT_REG); in rk816_bat_check_reboot()
3446 BAT_INFO("reboot: %d --> %d\n", di->dsoc, di->rsoc); in rk816_bat_check_reboot()
3447 di->dsoc = di->rsoc; in rk816_bat_check_reboot()
3448 if (di->dsoc > 100) in rk816_bat_check_reboot()
3449 di->dsoc = 100; in rk816_bat_check_reboot()
3450 else if (di->dsoc < 0) in rk816_bat_check_reboot()
3451 di->dsoc = 0; in rk816_bat_check_reboot()
3452 rk816_bat_save_dsoc(di, di->dsoc); in rk816_bat_check_reboot()
3456 rk816_bat_save_reboot_cnt(di, cnt); in rk816_bat_check_reboot()
3462 static void rk816_bat_check_charger(struct rk816_battery *di) in rk816_bat_check_charger() argument
3466 buf = rk816_bat_read(di, RK816_VB_MON_REG); in rk816_bat_check_charger()
3468 if ((buf & PLUG_IN_STS) != 0 && !rk816_bat_chrg_online(di)) { in rk816_bat_check_charger()
3469 rk816_bat_set_chrg_param(di, USB_TYPE_USB_CHARGER); in rk816_bat_check_charger()
3472 } else if ((buf & PLUG_IN_STS) == 0 && rk816_bat_chrg_online(di)) { in rk816_bat_check_charger()
3473 rk816_bat_set_chrg_param(di, USB_TYPE_UNKNOWN_CHARGER); in rk816_bat_check_charger()
3478 static void rk816_bat_rsoc_daemon(struct rk816_battery *di) in rk816_bat_rsoc_daemon() argument
3483 if ((di->remain_cap < 0) && (di->fb_blank != 0)) { in rk816_bat_rsoc_daemon()
3486 wake_lock_timeout(&di->wake_lock, in rk816_bat_rsoc_daemon()
3487 (di->pdata->monitor_sec + 1) * HZ); in rk816_bat_rsoc_daemon()
3491 di->dbg_cap_low0++; in rk816_bat_rsoc_daemon()
3492 est_vol = di->voltage_avg - in rk816_bat_rsoc_daemon()
3493 (di->bat_res * di->current_avg) / 1000; in rk816_bat_rsoc_daemon()
3494 remain_cap = rk816_bat_vol_to_ocvcap(di, est_vol); in rk816_bat_rsoc_daemon()
3495 rk816_bat_init_capacity(di, remain_cap); in rk816_bat_rsoc_daemon()
3497 di->remain_cap, di->rsoc); in rk816_bat_rsoc_daemon()
3498 wake_unlock(&di->wake_lock); in rk816_bat_rsoc_daemon()
3505 static void rk816_bat_update_info(struct rk816_battery *di) in rk816_bat_update_info() argument
3509 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_update_info()
3510 di->current_avg = rk816_bat_get_avg_current(di); in rk816_bat_update_info()
3511 di->chrg_status = rk816_bat_get_chrg_status(di); in rk816_bat_update_info()
3512 di->voltage_relax = rk816_bat_get_relax_voltage(di); in rk816_bat_update_info()
3513 di->rsoc = rk816_bat_get_rsoc(di); in rk816_bat_update_info()
3514 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_update_info()
3515 is_charging = rk816_bat_chrg_online(di); in rk816_bat_update_info()
3516 if (is_charging != di->is_charging) { in rk816_bat_update_info()
3517 di->is_charging = is_charging; in rk816_bat_update_info()
3519 di->charge_count++; in rk816_bat_update_info()
3521 if (di->voltage_avg > di->voltage_max) in rk816_bat_update_info()
3522 di->voltage_max = di->voltage_avg; in rk816_bat_update_info()
3523 if (di->current_avg > di->current_max) in rk816_bat_update_info()
3524 di->current_max = di->current_avg; in rk816_bat_update_info()
3527 if (di->remain_cap > di->fcc) { in rk816_bat_update_info()
3528 di->sm_remain_cap -= (di->remain_cap - di->fcc); in rk816_bat_update_info()
3530 __func__, di->remain_cap, di->sm_remain_cap); in rk816_bat_update_info()
3531 rk816_bat_init_coulomb_cap(di, di->fcc); in rk816_bat_update_info()
3534 if (di->chrg_status != CHARGE_FINISH) in rk816_bat_update_info()
3535 di->chrg_finish_base = get_boot_sec(); in rk816_bat_update_info()
3542 if (base2min(di->plug_out_base) > 120) in rk816_bat_update_info()
3543 di->age_allow_update = false; in rk816_bat_update_info()
3545 if (di->chrg_status == CC_OR_CV) { in rk816_bat_update_info()
3546 di->adc_allow_update = true; in rk816_bat_update_info()
3547 di->adc_calib_cnt = 0; in rk816_bat_update_info()
3551 static void rk816_bat_init_dsoc_algorithm(struct rk816_battery *di) in rk816_bat_init_dsoc_algorithm() argument
3560 rest |= rk816_bat_read(di, RK816_CALC_REST_REGH) << 8; in rk816_bat_init_dsoc_algorithm()
3561 rest |= rk816_bat_read(di, RK816_CALC_REST_REGL) << 0; in rk816_bat_init_dsoc_algorithm()
3564 buf = rk816_bat_read(di, RK816_MISC_MARK_REG); in rk816_bat_init_dsoc_algorithm()
3565 di->algo_rest_mode = (buf & ALGO_REST_MODE_MSK) >> ALGO_REST_MODE_SHIFT; in rk816_bat_init_dsoc_algorithm()
3567 if (rk816_bat_get_chrg_status(di) == CHARGE_FINISH) { in rk816_bat_init_dsoc_algorithm()
3568 if (di->algo_rest_mode == MODE_FINISH) { in rk816_bat_init_dsoc_algorithm()
3569 soc_sec = di->fcc * 3600 / 100 / FINISH_CHRG_CUR1; in rk816_bat_init_dsoc_algorithm()
3571 if (di->dsoc < 100) { in rk816_bat_init_dsoc_algorithm()
3572 di->dsoc++; in rk816_bat_init_dsoc_algorithm()
3573 di->algo_rest_val = rest % soc_sec; in rk816_bat_init_dsoc_algorithm()
3575 rest, di->dsoc); in rk816_bat_init_dsoc_algorithm()
3577 di->algo_rest_val = 0; in rk816_bat_init_dsoc_algorithm()
3580 di->algo_rest_val = rest; in rk816_bat_init_dsoc_algorithm()
3583 di->algo_rest_val = rest; in rk816_bat_init_dsoc_algorithm()
3586 buf = rk816_bat_read(di, RK816_VB_MON_REG); in rk816_bat_init_dsoc_algorithm()
3589 if (di->dsoc < di->rsoc) { in rk816_bat_init_dsoc_algorithm()
3590 di->dsoc++; in rk816_bat_init_dsoc_algorithm()
3591 di->algo_rest_val = rest % 1000; in rk816_bat_init_dsoc_algorithm()
3593 rest, di->dsoc); in rk816_bat_init_dsoc_algorithm()
3595 di->algo_rest_val = 0; in rk816_bat_init_dsoc_algorithm()
3599 if (di->dsoc > di->rsoc) { in rk816_bat_init_dsoc_algorithm()
3600 di->dsoc--; in rk816_bat_init_dsoc_algorithm()
3601 di->algo_rest_val = rest % 1000; in rk816_bat_init_dsoc_algorithm()
3603 rest, di->dsoc); in rk816_bat_init_dsoc_algorithm()
3605 di->algo_rest_val = 0; in rk816_bat_init_dsoc_algorithm()
3608 di->algo_rest_val = rest; in rk816_bat_init_dsoc_algorithm()
3612 if (di->dsoc >= 100) in rk816_bat_init_dsoc_algorithm()
3613 di->dsoc = 100; in rk816_bat_init_dsoc_algorithm()
3614 else if (di->dsoc <= 0) in rk816_bat_init_dsoc_algorithm()
3615 di->dsoc = 0; in rk816_bat_init_dsoc_algorithm()
3618 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_init_dsoc_algorithm()
3619 di->current_avg = rk816_bat_get_avg_current(di); in rk816_bat_init_dsoc_algorithm()
3620 if (rk816_bat_get_chrg_status(di) == CHARGE_FINISH) { in rk816_bat_init_dsoc_algorithm()
3621 rk816_bat_finish_algo_prepare(di); in rk816_bat_init_dsoc_algorithm()
3622 di->work_mode = MODE_FINISH; in rk816_bat_init_dsoc_algorithm()
3624 rk816_bat_smooth_algo_prepare(di); in rk816_bat_init_dsoc_algorithm()
3625 di->work_mode = MODE_SMOOTH; in rk816_bat_init_dsoc_algorithm()
3630 __func__, rest, di->algo_rest_val, mode_name[di->algo_rest_mode], in rk816_bat_init_dsoc_algorithm()
3631 di->zero_dsoc, di->sm_chrg_dsoc, di->sm_dischrg_dsoc, in rk816_bat_init_dsoc_algorithm()
3632 di->chrg_finish_base); in rk816_bat_init_dsoc_algorithm()
3635 static void rk816_bat_save_algo_rest(struct rk816_battery *di) in rk816_bat_save_algo_rest() argument
3646 tmp_soc = (di->zero_dsoc) / 1000; in rk816_bat_save_algo_rest()
3647 if (tmp_soc == di->dsoc) in rk816_bat_save_algo_rest()
3648 zero_rest = di->zero_dsoc - ((di->dsoc + 1) * 1000 - in rk816_bat_save_algo_rest()
3652 tmp_soc = di->sm_chrg_dsoc / 1000; in rk816_bat_save_algo_rest()
3653 if (tmp_soc == di->dsoc) in rk816_bat_save_algo_rest()
3654 sm_chrg_rest = di->sm_chrg_dsoc - di->dsoc * 1000; in rk816_bat_save_algo_rest()
3657 tmp_soc = (di->sm_dischrg_dsoc) / 1000; in rk816_bat_save_algo_rest()
3658 if (tmp_soc == di->dsoc) in rk816_bat_save_algo_rest()
3659 sm_dischrg_rest = di->sm_dischrg_dsoc - ((di->dsoc + 1) * 1000 - in rk816_bat_save_algo_rest()
3663 if (di->algo_rest_mode == MODE_FINISH && di->algo_rest_val) in rk816_bat_save_algo_rest()
3664 finish_rest = base2sec(di->chrg_finish_base) + in rk816_bat_save_algo_rest()
3665 di->algo_rest_val; in rk816_bat_save_algo_rest()
3667 finish_rest = base2sec(di->chrg_finish_base); in rk816_bat_save_algo_rest()
3670 if ((rk816_bat_chrg_online(di) && (di->dsoc > di->rsoc)) || in rk816_bat_save_algo_rest()
3671 (!rk816_bat_chrg_online(di) && (di->dsoc < di->rsoc)) || in rk816_bat_save_algo_rest()
3672 (di->dsoc == di->rsoc)) { in rk816_bat_save_algo_rest()
3673 di->algo_rest_val = 0; in rk816_bat_save_algo_rest()
3676 } else if (di->work_mode == MODE_FINISH) { in rk816_bat_save_algo_rest()
3679 } else if (di->algo_rest_mode == MODE_FINISH) { in rk816_bat_save_algo_rest()
3683 if (rk816_bat_chrg_online(di) && (di->dsoc < di->rsoc)) in rk816_bat_save_algo_rest()
3684 algo_rest = sm_chrg_rest + di->algo_rest_val; in rk816_bat_save_algo_rest()
3685 else if (!rk816_bat_chrg_online(di) && (di->dsoc > di->rsoc)) in rk816_bat_save_algo_rest()
3687 di->algo_rest_val; in rk816_bat_save_algo_rest()
3690 di->algo_rest_val; in rk816_bat_save_algo_rest()
3695 if ((di->work_mode == MODE_FINISH) || (di->work_mode == MODE_ZERO)) { in rk816_bat_save_algo_rest()
3696 mode = di->work_mode; in rk816_bat_save_algo_rest()
3698 if (di->sm_linek > 0) in rk816_bat_save_algo_rest()
3705 buf = rk816_bat_read(di, RK816_MISC_MARK_REG); in rk816_bat_save_algo_rest()
3708 rk816_bat_write(di, RK816_MISC_MARK_REG, buf); in rk816_bat_save_algo_rest()
3712 rk816_bat_write(di, RK816_CALC_REST_REGH, buf); in rk816_bat_save_algo_rest()
3714 rk816_bat_write(di, RK816_CALC_REST_REGL, buf); in rk816_bat_save_algo_rest()
3717 __func__, algo_rest, mode_name[mode], di->algo_rest_val, zero_rest, in rk816_bat_save_algo_rest()
3718 sm_chrg_rest, sm_dischrg_rest, base2sec(di->chrg_finish_base)); in rk816_bat_save_algo_rest()
3721 static void rk816_bat_save_data(struct rk816_battery *di) in rk816_bat_save_data() argument
3723 rk816_bat_save_dsoc(di, di->dsoc); in rk816_bat_save_data()
3724 rk816_bat_save_cap(di, di->remain_cap); in rk816_bat_save_data()
3725 rk816_bat_save_algo_rest(di); in rk816_bat_save_data()
3729 static int rk816_bat_get_ntc_res(struct rk816_battery *di) in rk816_bat_get_ntc_res() argument
3733 val |= rk816_bat_read(di, RK816_TS_ADC_REGL) << 0; in rk816_bat_get_ntc_res()
3734 val |= rk816_bat_read(di, RK816_TS_ADC_REGH) << 8; in rk816_bat_get_ntc_res()
3736 res = ((di->voltage_k * val) / 1000 + di->voltage_b) * 1000 / 2200; in rk816_bat_get_ntc_res()
3737 res = res * 1000 / di->pdata->ntc_factor; in rk816_bat_get_ntc_res()
3740 __func__, val, res, di->pdata->ntc_factor); in rk816_bat_get_ntc_res()
3743 di->pdata->ntc_degree_from, di->pdata->ntc_table[0], in rk816_bat_get_ntc_res()
3744 di->pdata->ntc_degree_from + di->pdata->ntc_size - 1, in rk816_bat_get_ntc_res()
3745 di->pdata->ntc_table[di->pdata->ntc_size - 1]); in rk816_bat_get_ntc_res()
3750 static int rk816_bat_temperature_chrg(struct rk816_battery *di, int temp) in rk816_bat_temperature_chrg() argument
3758 for (i = 0; i < di->pdata->tc_count; i++) { in rk816_bat_temperature_chrg()
3759 up_temp = di->pdata->tc_table[i].temp_up; in rk816_bat_temperature_chrg()
3760 down_temp = di->pdata->tc_table[i].temp_down; in rk816_bat_temperature_chrg()
3761 cfg_current = di->pdata->tc_table[i].chrg_current; in rk816_bat_temperature_chrg()
3765 if (config_index == i && !di->charger_changed) in rk816_bat_temperature_chrg()
3769 di->charger_changed = 0; in rk816_bat_temperature_chrg()
3772 if (di->pdata->tc_table[i].set_chrg_current) { in rk816_bat_temperature_chrg()
3773 rk816_bat_set_chrg_current(di, cfg_current); in rk816_bat_temperature_chrg()
3774 if (!di->over_20mR) in rk816_bat_temperature_chrg()
3777 di->res_fac); in rk816_bat_temperature_chrg()
3781 di->res_fac); in rk816_bat_temperature_chrg()
3785 rk816_bat_set_input_current(di, cfg_current); in rk816_bat_temperature_chrg()
3801 rk816_bat_set_chrg_current(di, di->chrg_cur_sel); in rk816_bat_temperature_chrg()
3802 if (di->ac_in || di->dc_in) in rk816_bat_temperature_chrg()
3803 rk816_bat_set_input_current(di, di->chrg_cur_input); in rk816_bat_temperature_chrg()
3805 rk816_bat_set_input_current(di, INPUT_CUR450MA); in rk816_bat_temperature_chrg()
3806 usb_ctrl = rk816_bat_read(di, RK816_USB_CTRL_REG); in rk816_bat_temperature_chrg()
3807 chrg_ctrl1 = rk816_bat_read(di, RK816_CHRG_CTRL_REG1); in rk816_bat_temperature_chrg()
3809 if (!di->over_20mR) in rk816_bat_temperature_chrg()
3811 RES_FAC_MUX(CHRG_CUR_SEL[cfg_current], di->res_fac); in rk816_bat_temperature_chrg()
3814 RES_FAC_DIV(CHRG_CUR_SEL[cfg_current], di->res_fac); in rk816_bat_temperature_chrg()
3822 static void rk816_bat_update_temperature(struct rk816_battery *di) in rk816_bat_update_temperature() argument
3827 ntc_table = di->pdata->ntc_table; in rk816_bat_update_temperature()
3828 ntc_size = di->pdata->ntc_size; in rk816_bat_update_temperature()
3829 di->temperature = VIRTUAL_TEMPERATURE; in rk816_bat_update_temperature()
3832 res = rk816_bat_get_ntc_res(di); in rk816_bat_update_temperature()
3835 rk816_bat_set_input_current(di, INPUT_CUR80MA); in rk816_bat_update_temperature()
3838 rk816_bat_set_input_current(di, INPUT_CUR80MA); in rk816_bat_update_temperature()
3845 di->temperature = (i + di->pdata->ntc_degree_from) * 10; in rk816_bat_update_temperature()
3846 rk816_bat_temperature_chrg(di, di->temperature / 10); in rk816_bat_update_temperature()
3851 static void rk816_bat_update_ocv_table(struct rk816_battery *di) in rk816_bat_update_ocv_table() argument
3856 int i, curr_temp = di->temperature / 10; in rk816_bat_update_ocv_table()
3858 if (di->pdata->temp_t_num < 2) in rk816_bat_update_ocv_table()
3891 rk816_bat_setup_ocv_table(di, curr_avg_temp); in rk816_bat_update_ocv_table()
3897 for (i = 0; i < di->pdata->ocv_size; i++) in rk816_bat_update_ocv_table()
3898 DBG("* ocv_table[%d]=%d\n", i, di->pdata->ocv_table[i]); in rk816_bat_update_ocv_table()
3904 struct rk816_battery *di = in rk816_battery_work() local
3907 rk816_bat_update_info(di); in rk816_battery_work()
3908 rk816_bat_wait_finish_sig(di); in rk816_battery_work()
3909 rk816_bat_rsoc_daemon(di); in rk816_battery_work()
3910 rk816_bat_check_charger(di); in rk816_battery_work()
3911 rk816_bat_update_temperature(di); in rk816_battery_work()
3912 rk816_bat_update_ocv_table(di); in rk816_battery_work()
3913 rk816_bat_lowpwr_check(di); in rk816_battery_work()
3914 rk816_bat_display_smooth(di); in rk816_battery_work()
3915 rk816_bat_power_supply_changed(di); in rk816_battery_work()
3916 rk816_bat_save_data(di); in rk816_battery_work()
3917 rk816_bat_debug_info(di); in rk816_battery_work()
3919 queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work, in rk816_battery_work()
3920 msecs_to_jiffies(di->monitor_ms)); in rk816_battery_work()
3925 struct rk816_battery *di = container_of(work, in rk816_bat_discnt_evt_worker() local
3928 if (extcon_get_state(di->cable_edev, EXTCON_USB) == 0) { in rk816_bat_discnt_evt_worker()
3930 rk816_bat_set_chrg_param(di, USB_TYPE_NONE_CHARGER); in rk816_bat_discnt_evt_worker()
3936 struct rk816_battery *di = container_of(work, in rk816_bat_host_evt_worker() local
3938 struct extcon_dev *edev = di->cable_edev; in rk816_bat_host_evt_worker()
3942 rk816_bat_set_otg_in(di, ONLINE); in rk816_bat_host_evt_worker()
3944 if (di->dc_in && di->pdata->power_dc2otg) in rk816_bat_host_evt_worker()
3947 rk816_bat_set_otg_power(di, USB_OTG_POWER_ON); in rk816_bat_host_evt_worker()
3950 rk816_bat_set_otg_in(di, OFFLINE); in rk816_bat_host_evt_worker()
3951 rk816_bat_set_otg_power(di, USB_OTG_POWER_OFF); in rk816_bat_host_evt_worker()
3957 struct rk816_battery *di = container_of(work, in rk816_bat_charger_evt_worker() local
3959 struct extcon_dev *edev = di->cable_edev; in rk816_bat_charger_evt_worker()
3976 rk816_bat_set_chrg_param(di, charger); in rk816_bat_charger_evt_worker()
3983 struct rk816_battery *di = in rk816_bat_charger_evt_notifier() local
3986 queue_delayed_work(di->usb_charger_wq, &di->usb_work, in rk816_bat_charger_evt_notifier()
3995 struct rk816_battery *di = in rk816_bat_discnt_evt_notfier() local
3998 queue_delayed_work(di->usb_charger_wq, &di->discnt_work, in rk816_bat_discnt_evt_notfier()
4007 struct rk816_battery *di = in rk816_bat_host_evt_notifier() local
4010 queue_delayed_work(di->usb_charger_wq, &di->host_work, in rk816_bat_host_evt_notifier()
4018 struct rk816_battery *di = (struct rk816_battery *)bat; in rk816_vb_low_irq() local
4021 di->voltage_avg); in rk816_vb_low_irq()
4022 di->dsoc = 0; in rk816_vb_low_irq()
4024 power_supply_changed(di->bat); in rk816_vb_low_irq()
4039 struct rk816_battery *di = (struct rk816_battery *)bat; in rk816_cvtlmt() local
4041 di->cvtlmt_int_event = 1; in rk816_cvtlmt()
4057 struct rk816_battery *di = (struct rk816_battery *)bat; in rk816_vbat_dc_det() local
4059 if (gpio_get_value(di->pdata->dc_det_pin)) in rk816_vbat_dc_det()
4065 queue_delayed_work(di->usb_charger_wq, in rk816_vbat_dc_det()
4066 &di->dc_delay_work, msecs_to_jiffies(500)); in rk816_vbat_dc_det()
4072 static void rk816_bat_init_sysfs(struct rk816_battery *di) in rk816_bat_init_sysfs() argument
4077 ret = sysfs_create_file(&di->dev->kobj, in rk816_bat_init_sysfs()
4080 dev_err(di->dev, "create bat node(%s) error\n", in rk816_bat_init_sysfs()
4085 static int rk816_bat_init_irqs(struct rk816_battery *di) in rk816_bat_init_irqs() argument
4089 struct rk808 *rk816 = di->rk816; in rk816_bat_init_irqs()
4090 struct platform_device *pdev = di->pdev; in rk816_bat_init_irqs()
4120 ret = devm_request_threaded_irq(di->dev, vb_lo_irq, NULL, in rk816_bat_init_irqs()
4123 "rk816_vb_low", di); in rk816_bat_init_irqs()
4125 dev_err(di->dev, "vb low irq request failed!\n"); in rk816_bat_init_irqs()
4132 ret = devm_request_threaded_irq(di->dev, plug_in_irq, NULL, in rk816_bat_init_irqs()
4135 "rk816_plug_in", di); in rk816_bat_init_irqs()
4137 dev_err(di->dev, "plug in irq request failed!\n"); in rk816_bat_init_irqs()
4142 ret = devm_request_threaded_irq(di->dev, plug_out_irq, NULL, in rk816_bat_init_irqs()
4145 "rk816_plug_out", di); in rk816_bat_init_irqs()
4147 dev_err(di->dev, "plug out irq request failed!\n"); in rk816_bat_init_irqs()
4152 ret = devm_request_threaded_irq(di->dev, cvtlmt_irq, NULL, in rk816_bat_init_irqs()
4155 "rk816_cvtlmt", di); in rk816_bat_init_irqs()
4157 dev_err(di->dev, "cvtlmt irq request failed!\n"); in rk816_bat_init_irqs()
4162 di->cvtlmt_irq = cvtlmt_irq; in rk816_bat_init_irqs()
4167 static void rk816_bat_init_info(struct rk816_battery *di) in rk816_bat_init_info() argument
4169 di->design_cap = di->pdata->design_capacity; in rk816_bat_init_info()
4170 di->qmax = di->pdata->design_qmax; in rk816_bat_init_info()
4171 di->bat_res = di->pdata->bat_res; in rk816_bat_init_info()
4172 di->sleep_chrg_status = rk816_bat_get_chrg_status(di); in rk816_bat_init_info()
4173 di->monitor_ms = di->pdata->monitor_sec * TIMER_MS_COUNTS; in rk816_bat_init_info()
4174 di->prop_status = POWER_SUPPLY_STATUS_DISCHARGING; in rk816_bat_init_info()
4175 di->boot_base = POWER_ON_SEC_BASE; in rk816_bat_init_info()
4176 di->chrg_finish_base = 0; in rk816_bat_init_info()
4177 di->plug_in_base = 0; in rk816_bat_init_info()
4178 di->plug_out_base = 0; in rk816_bat_init_info()
4181 static enum charger_t rk816_bat_init_adc_dc_det(struct rk816_battery *di) in rk816_bat_init_adc_dc_det() argument
4183 return rk816_bat_get_adc_dc_state(di); in rk816_bat_init_adc_dc_det()
4186 static enum charger_t rk816_bat_init_gpio_dc_det(struct rk816_battery *di) in rk816_bat_init_gpio_dc_det() argument
4193 if (gpio_is_valid(di->pdata->dc_det_pin)) { in rk816_bat_init_gpio_dc_det()
4194 ret = devm_gpio_request(di->dev, di->pdata->dc_det_pin, in rk816_bat_init_gpio_dc_det()
4197 dev_err(di->dev, "Failed to request gpio %d\n", in rk816_bat_init_gpio_dc_det()
4198 di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4202 ret = gpio_direction_input(di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4204 dev_err(di->dev, "failed to set gpio input\n"); in rk816_bat_init_gpio_dc_det()
4208 level = gpio_get_value(di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4209 if (level == di->pdata->dc_det_level) in rk816_bat_init_gpio_dc_det()
4219 dc_det_irq = gpio_to_irq(di->pdata->dc_det_pin); in rk816_bat_init_gpio_dc_det()
4220 ret = devm_request_irq(di->dev, dc_det_irq, rk816_vbat_dc_det, in rk816_bat_init_gpio_dc_det()
4221 irq_flags, "rk816_dc_det", di); in rk816_bat_init_gpio_dc_det()
4223 dev_err(di->dev, "rk816_dc_det_irq request failed!\n"); in rk816_bat_init_gpio_dc_det()
4233 static enum charger_t rk816_bat_init_dc_det(struct rk816_battery *di) in rk816_bat_init_dc_det() argument
4237 if (di->pdata->dc_det_adc) in rk816_bat_init_dc_det()
4238 type = rk816_bat_init_adc_dc_det(di); in rk816_bat_init_dc_det()
4240 type = rk816_bat_init_gpio_dc_det(di); in rk816_bat_init_dc_det()
4245 static int rk816_bat_init_charger(struct rk816_battery *di) in rk816_bat_init_charger() argument
4248 struct device *dev = di->dev; in rk816_bat_init_charger()
4252 di->usb_charger_wq = alloc_ordered_workqueue("%s", in rk816_bat_init_charger()
4255 INIT_DELAYED_WORK(&di->dc_delay_work, rk816_bat_dc_delay_work); in rk816_bat_init_charger()
4266 INIT_DELAYED_WORK(&di->usb_work, rk816_bat_charger_evt_worker); in rk816_bat_init_charger()
4267 di->cable_cg_nb.notifier_call = rk816_bat_charger_evt_notifier; in rk816_bat_init_charger()
4269 &di->cable_cg_nb); in rk816_bat_init_charger()
4276 &di->cable_cg_nb); in rk816_bat_init_charger()
4280 &di->cable_cg_nb); in rk816_bat_init_charger()
4285 &di->cable_cg_nb); in rk816_bat_init_charger()
4289 &di->cable_cg_nb); in rk816_bat_init_charger()
4291 &di->cable_cg_nb); in rk816_bat_init_charger()
4296 INIT_DELAYED_WORK(&di->host_work, rk816_bat_host_evt_worker); in rk816_bat_init_charger()
4297 di->cable_host_nb.notifier_call = rk816_bat_host_evt_notifier; in rk816_bat_init_charger()
4299 &di->cable_host_nb); in rk816_bat_init_charger()
4303 &di->cable_cg_nb); in rk816_bat_init_charger()
4305 &di->cable_cg_nb); in rk816_bat_init_charger()
4307 &di->cable_cg_nb); in rk816_bat_init_charger()
4313 INIT_DELAYED_WORK(&di->discnt_work, rk816_bat_discnt_evt_worker); in rk816_bat_init_charger()
4314 di->cable_discnt_nb.notifier_call = rk816_bat_discnt_evt_notfier; in rk816_bat_init_charger()
4316 &di->cable_discnt_nb); in rk816_bat_init_charger()
4320 &di->cable_cg_nb); in rk816_bat_init_charger()
4322 &di->cable_cg_nb); in rk816_bat_init_charger()
4324 &di->cable_cg_nb); in rk816_bat_init_charger()
4326 &di->cable_host_nb); in rk816_bat_init_charger()
4330 di->cable_edev = edev; in rk816_bat_init_charger()
4333 schedule_delayed_work(&di->host_work, 0); in rk816_bat_init_charger()
4334 schedule_delayed_work(&di->usb_work, 0); in rk816_bat_init_charger()
4339 if (di->pdata->dc_det_adc) in rk816_bat_init_charger()
4340 queue_delayed_work(di->usb_charger_wq, &di->dc_delay_work, in rk816_bat_init_charger()
4343 dc_charger = rk816_bat_init_dc_det(di); in rk816_bat_init_charger()
4344 rk816_bat_set_chrg_param(di, dc_charger); in rk816_bat_init_charger()
4345 if (di->dc_in && di->otg_in && di->pdata->power_dc2otg) { in rk816_bat_init_charger()
4347 rk816_bat_set_otg_power(di, USB_OTG_POWER_OFF); in rk816_bat_init_charger()
4374 static int rk816_bat_rtc_sleep_sec(struct rk816_battery *di) in rk816_bat_rtc_sleep_sec() argument
4378 interval_sec = rk816_get_rtc_sec() - di->rtc_base; in rk816_bat_rtc_sleep_sec()
4383 static void rk816_bat_init_ts_detect(struct rk816_battery *di) in rk816_bat_init_ts_detect() argument
4387 if (!di->pdata->ntc_size) in rk816_bat_init_ts_detect()
4391 buf = rk816_bat_read(di, RK816_GPIO_IO_POL_REG); in rk816_bat_init_ts_detect()
4393 rk816_bat_write(di, RK816_GPIO_IO_POL_REG, buf); in rk816_bat_init_ts_detect()
4396 buf = rk816_bat_read(di, RK816_TS_CTRL_REG); in rk816_bat_init_ts_detect()
4398 rk816_bat_write(di, RK816_TS_CTRL_REG, buf); in rk816_bat_init_ts_detect()
4401 buf = rk816_bat_read(di, RK816_TS_CTRL_REG); in rk816_bat_init_ts_detect()
4403 if (di->pdata->ntc_factor == NTC_CALC_FACTOR_80UA) in rk816_bat_init_ts_detect()
4405 else if (di->pdata->ntc_factor == NTC_CALC_FACTOR_60UA) in rk816_bat_init_ts_detect()
4407 else if (di->pdata->ntc_factor == NTC_CALC_FACTOR_40UA) in rk816_bat_init_ts_detect()
4411 rk816_bat_write(di, RK816_TS_CTRL_REG, buf); in rk816_bat_init_ts_detect()
4414 buf = rk816_bat_read(di, RK816_ADC_CTRL_REG); in rk816_bat_init_ts_detect()
4416 rk816_bat_write(di, RK816_ADC_CTRL_REG, buf); in rk816_bat_init_ts_detect()
4419 static void rk816_bat_init_fg(struct rk816_battery *di) in rk816_bat_init_fg() argument
4421 rk816_bat_enable_input_current(di); in rk816_bat_init_fg()
4422 rk816_bat_enable_gauge(di); in rk816_bat_init_fg()
4423 rk816_bat_init_voltage_kb(di); in rk816_bat_init_fg()
4424 rk816_bat_init_poffset(di); in rk816_bat_init_fg()
4425 rk816_bat_select_sample_res(di); in rk816_bat_init_fg()
4426 rk816_bat_set_relax_sample(di); in rk816_bat_init_fg()
4427 rk816_bat_set_ioffset_sample(di); in rk816_bat_init_fg()
4428 rk816_bat_set_ocv_sample(di); in rk816_bat_init_fg()
4429 rk816_bat_init_ts_detect(di); in rk816_bat_init_fg()
4430 rk816_bat_update_temperature(di); in rk816_bat_init_fg()
4431 rk816_bat_setup_ocv_table(di, di->temperature / 10); in rk816_bat_init_fg()
4432 rk816_bat_init_rsoc(di); in rk816_bat_init_fg()
4433 rk816_bat_init_coulomb_cap(di, di->nac); in rk816_bat_init_fg()
4434 rk816_bat_init_age_algorithm(di); in rk816_bat_init_fg()
4435 rk816_bat_init_chrg_config(di); in rk816_bat_init_fg()
4436 rk816_bat_init_zero_table(di); in rk816_bat_init_fg()
4437 rk816_bat_init_caltimer(di); in rk816_bat_init_fg()
4438 rk816_bat_init_dsoc_algorithm(di); in rk816_bat_init_fg()
4440 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_bat_init_fg()
4441 di->voltage_ocv = rk816_bat_get_ocv_voltage(di); in rk816_bat_init_fg()
4442 di->voltage_relax = rk816_bat_get_relax_voltage(di); in rk816_bat_init_fg()
4443 di->current_avg = rk816_bat_get_avg_current(di); in rk816_bat_init_fg()
4444 di->current_relax = rk816_bat_get_relax_current(di); in rk816_bat_init_fg()
4445 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_bat_init_fg()
4446 di->dbg_pwr_dsoc = di->dsoc; in rk816_bat_init_fg()
4447 di->dbg_pwr_rsoc = di->rsoc; in rk816_bat_init_fg()
4448 di->dbg_pwr_vol = di->voltage_avg; in rk816_bat_init_fg()
4450 rk816_bat_dump_regs(di, 0x99, 0xee); in rk816_bat_init_fg()
4452 di->nac, di->remain_cap, di->voltage_ocv, di->voltage_avg, in rk816_bat_init_fg()
4453 di->voltage_relax, di->dsoc, di->rsoc, di->current_avg); in rk816_bat_init_fg()
4456 static int rk816_bat_read_ocv_tables(struct rk816_battery *di, in rk816_bat_read_ocv_tables() argument
4459 struct battery_platform_data *pdata = di->pdata; in rk816_bat_read_ocv_tables()
4472 dev_err(di->dev, "invalid table_t0\n"); in rk816_bat_read_ocv_tables()
4478 dev_err(di->dev, "invalid temp_t0\n"); in rk816_bat_read_ocv_tables()
4496 dev_err(di->dev, "invalid table_t1\n"); in rk816_bat_read_ocv_tables()
4502 dev_err(di->dev, "invalid temp_t1\n"); in rk816_bat_read_ocv_tables()
4520 dev_err(di->dev, "invalid table_t2\n"); in rk816_bat_read_ocv_tables()
4526 dev_err(di->dev, "invalid temp_t2\n"); in rk816_bat_read_ocv_tables()
4544 dev_err(di->dev, "invalid table_t3\n"); in rk816_bat_read_ocv_tables()
4550 dev_err(di->dev, "invalid temp_t3\n"); in rk816_bat_read_ocv_tables()
4560 di->pdata->temp_t_num = idx; in rk816_bat_read_ocv_tables()
4562 DBG("realtime ocv table nums=%d\n", di->pdata->temp_t_num); in rk816_bat_read_ocv_tables()
4567 for (i = 0; i < di->pdata->ocv_size; i++) in rk816_bat_read_ocv_tables()
4576 static int parse_temperature_chrg_table(struct rk816_battery *di, in parse_temperature_chrg_table() argument
4589 dev_err(di->dev, in parse_temperature_chrg_table()
4595 di->pdata->tc_count = count; in parse_temperature_chrg_table()
4596 di->pdata->tc_table = devm_kzalloc(di->dev, in parse_temperature_chrg_table()
4597 count * sizeof(*di->pdata->tc_table), in parse_temperature_chrg_table()
4599 if (!di->pdata->tc_table) in parse_temperature_chrg_table()
4604 di->pdata->tc_table[i].temp_down = be32_to_cpu(*list++); in parse_temperature_chrg_table()
4605 di->pdata->tc_table[i].temp_up = be32_to_cpu(*list++); in parse_temperature_chrg_table()
4614 di->pdata->tc_table[i].set_chrg_current = 1; in parse_temperature_chrg_table()
4615 di->pdata->tc_table[i].chrg_current = in parse_temperature_chrg_table()
4616 rk816_bat_decode_chrg_current(di, chrg_current); in parse_temperature_chrg_table()
4618 di->pdata->tc_table[i].chrg_current = in parse_temperature_chrg_table()
4619 rk816_bat_decode_input_current(di, chrg_current); in parse_temperature_chrg_table()
4623 i, di->pdata->tc_table[i].temp_down, in parse_temperature_chrg_table()
4624 di->pdata->tc_table[i].temp_up, in parse_temperature_chrg_table()
4625 di->pdata->tc_table[i].chrg_current); in parse_temperature_chrg_table()
4632 static int rk816_bat_parse_dt(struct rk816_battery *di) in rk816_bat_parse_dt() argument
4639 struct device *dev = di->dev; in rk816_bat_parse_dt()
4642 np = of_find_node_by_name(di->rk816->i2c->dev.of_node, "battery"); in rk816_bat_parse_dt()
4648 pdata = devm_kzalloc(di->dev, sizeof(*pdata), GFP_KERNEL); in rk816_bat_parse_dt()
4652 di->pdata = pdata; in rk816_bat_parse_dt()
4680 pdata->ocv_table = devm_kzalloc(di->dev, size, GFP_KERNEL); in rk816_bat_parse_dt()
4689 ret = rk816_bat_read_ocv_tables(di, np); in rk816_bat_parse_dt()
4691 di->pdata->temp_t_num = 0; in rk816_bat_parse_dt()
4840 pdata->ntc_table = devm_kzalloc(di->dev, size, GFP_KERNEL); in rk816_bat_parse_dt()
4860 ret = parse_temperature_chrg_table(di, np); in rk816_bat_parse_dt()
4911 struct rk816_battery *di; in rk816_battery_probe() local
4920 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in rk816_battery_probe()
4921 if (!di) in rk816_battery_probe()
4924 di->rk816 = rk816; in rk816_battery_probe()
4925 di->pdev = pdev; in rk816_battery_probe()
4926 di->dev = &pdev->dev; in rk816_battery_probe()
4927 di->regmap = rk816->regmap; in rk816_battery_probe()
4928 platform_set_drvdata(pdev, di); in rk816_battery_probe()
4930 ret = rk816_bat_parse_dt(di); in rk816_battery_probe()
4936 if (!is_rk816_bat_exist(di)) { in rk816_battery_probe()
4937 di->pdata->bat_mode = MODE_VIRTUAL; in rk816_battery_probe()
4941 ret = rk816_bat_init_power_supply(di); in rk816_battery_probe()
4947 rk816_bat_init_info(di); in rk816_battery_probe()
4948 rk816_bat_init_fg(di); in rk816_battery_probe()
4949 rk816_bat_init_leds(di); in rk816_battery_probe()
4950 rk816_bat_init_charger(di); in rk816_battery_probe()
4951 rk816_bat_init_sysfs(di); in rk816_battery_probe()
4952 rk816_bat_register_fb_notify(di); in rk816_battery_probe()
4953 wake_lock_init(&di->wake_lock, WAKE_LOCK_SUSPEND, "rk816_bat_lock"); in rk816_battery_probe()
4954 di->bat_monitor_wq = alloc_ordered_workqueue("%s", in rk816_battery_probe()
4956 INIT_DELAYED_WORK(&di->bat_delay_work, rk816_battery_work); in rk816_battery_probe()
4958 ret = rk816_bat_init_irqs(di); in rk816_battery_probe()
4964 queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work, in rk816_battery_probe()
4972 cancel_delayed_work(&di->dc_delay_work); in rk816_battery_probe()
4973 cancel_delayed_work(&di->bat_delay_work); in rk816_battery_probe()
4974 cancel_delayed_work(&di->calib_delay_work); in rk816_battery_probe()
4975 destroy_workqueue(di->bat_monitor_wq); in rk816_battery_probe()
4976 destroy_workqueue(di->usb_charger_wq); in rk816_battery_probe()
4977 rk816_bat_unregister_fb_notify(di); in rk816_battery_probe()
4978 del_timer(&di->caltimer); in rk816_battery_probe()
4979 wake_lock_destroy(&di->wake_lock); in rk816_battery_probe()
4987 struct rk816_battery *di = platform_get_drvdata(dev); in rk816_battery_suspend() local
4990 cancel_delayed_work_sync(&di->bat_delay_work); in rk816_battery_suspend()
4991 di->s2r = false; in rk816_battery_suspend()
4992 di->sleep_chrg_online = rk816_bat_chrg_online(di); in rk816_battery_suspend()
4993 di->sleep_chrg_status = rk816_bat_get_chrg_status(di); in rk816_battery_suspend()
4994 di->current_avg = rk816_bat_get_avg_current(di); in rk816_battery_suspend()
4995 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_battery_suspend()
4996 di->rsoc = rk816_bat_get_rsoc(di); in rk816_battery_suspend()
4997 di->rtc_base = rk816_get_rtc_sec(); in rk816_battery_suspend()
4998 rk816_bat_save_data(di); in rk816_battery_suspend()
4999 st = (rk816_bat_read(di, RK816_SUP_STS_REG) & CHRG_STATUS_MSK) >> 4; in rk816_battery_suspend()
5000 di->slp_dcdc_en_reg = rk816_bat_read(di, RK816_SLP_DCDC_EN_REG); in rk816_battery_suspend()
5003 if (di->pdata->otg5v_suspend_enable) { in rk816_battery_suspend()
5004 if ((di->otg_in && !di->dc_in) || in rk816_battery_suspend()
5005 (di->otg_in && di->dc_in && !di->pdata->power_dc2otg)) { in rk816_battery_suspend()
5006 rk816_bat_set_bits(di, RK816_SLP_DCDC_EN_REG, in rk816_battery_suspend()
5011 rk816_bat_set_bits(di, RK816_SLP_DCDC_EN_REG, in rk816_battery_suspend()
5017 rk816_bat_set_bits(di, RK816_SLP_DCDC_EN_REG, in rk816_battery_suspend()
5025 if (di->sleep_chrg_status != CHARGE_FINISH) in rk816_battery_suspend()
5026 di->chrg_finish_base = get_boot_sec(); in rk816_battery_suspend()
5029 if ((di->work_mode == MODE_ZERO) && in rk816_battery_suspend()
5030 (di->sleep_chrg_online) && (di->current_avg >= 0)) { in rk816_battery_suspend()
5035 if (di->sleep_chrg_status == CHARGE_FINISH) { in rk816_battery_suspend()
5036 di->work_mode = MODE_FINISH; in rk816_battery_suspend()
5037 di->chrg_finish_base = get_boot_sec(); in rk816_battery_suspend()
5039 di->work_mode = MODE_SMOOTH; in rk816_battery_suspend()
5040 rk816_bat_smooth_algo_prepare(di); in rk816_battery_suspend()
5045 di->dsoc, di->rsoc, di->current_avg, in rk816_battery_suspend()
5046 rk816_bat_get_avg_voltage(di), rk816_bat_get_coulomb_cap(di), in rk816_battery_suspend()
5047 di->sleep_dischrg_sec, di->sleep_chrg_online, bat_status[st]); in rk816_battery_suspend()
5055 struct rk816_battery *di = platform_get_drvdata(dev); in rk816_battery_resume() local
5058 di->s2r = true; in rk816_battery_resume()
5059 di->voltage_avg = rk816_bat_get_avg_voltage(di); in rk816_battery_resume()
5060 di->current_avg = rk816_bat_get_avg_current(di); in rk816_battery_resume()
5061 di->voltage_relax = rk816_bat_get_relax_voltage(di); in rk816_battery_resume()
5062 di->current_relax = rk816_bat_get_relax_current(di); in rk816_battery_resume()
5063 di->remain_cap = rk816_bat_get_coulomb_cap(di); in rk816_battery_resume()
5064 di->rsoc = rk816_bat_get_rsoc(di); in rk816_battery_resume()
5065 interval_sec = rk816_bat_rtc_sleep_sec(di); in rk816_battery_resume()
5066 di->sleep_sum_sec += interval_sec; in rk816_battery_resume()
5067 pwroff_vol = di->pdata->pwroff_vol; in rk816_battery_resume()
5068 st = (rk816_bat_read(di, RK816_SUP_STS_REG) & CHRG_STATUS_MSK) >> 4; in rk816_battery_resume()
5070 rk816_bat_set_bits(di, RK816_SLP_DCDC_EN_REG, in rk816_battery_resume()
5071 OTG_BOOST_SLP_ON, di->slp_dcdc_en_reg); in rk816_battery_resume()
5073 if (!di->sleep_chrg_online) { in rk816_battery_resume()
5075 di->sleep_dischrg_sec += interval_sec; in rk816_battery_resume()
5076 if (di->voltage_avg <= pwroff_vol + 50) in rk816_battery_resume()
5083 di->dsoc, di->rsoc, di->current_avg, di->voltage_avg, in rk816_battery_resume()
5084 di->voltage_relax, rk816_bat_get_coulomb_cap(di), interval_sec, in rk816_battery_resume()
5085 di->sleep_dischrg_sec, di->sleep_chrg_online, bat_status[st]); in rk816_battery_resume()
5088 if ((di->sleep_dischrg_sec > time_step) && (!di->sleep_chrg_online)) { in rk816_battery_resume()
5089 if (rk816_bat_sleep_dischrg(di)) in rk816_battery_resume()
5090 di->sleep_dischrg_sec = 0; in rk816_battery_resume()
5093 rk816_bat_save_data(di); in rk816_battery_resume()
5096 if ((di->sleep_chrg_online) || in rk816_battery_resume()
5097 (!di->sleep_chrg_online && di->voltage_avg <= pwroff_vol)) in rk816_battery_resume()
5098 wake_lock_timeout(&di->wake_lock, msecs_to_jiffies(2000)); in rk816_battery_resume()
5100 queue_delayed_work(di->bat_monitor_wq, &di->bat_delay_work, in rk816_battery_resume()
5109 struct rk816_battery *di = platform_get_drvdata(dev); in rk816_battery_shutdown() local
5111 extcon_unregister_notifier(di->cable_edev, EXTCON_CHG_USB_SDP, in rk816_battery_shutdown()
5112 &di->cable_cg_nb); in rk816_battery_shutdown()
5113 extcon_unregister_notifier(di->cable_edev, EXTCON_CHG_USB_DCP, in rk816_battery_shutdown()
5114 &di->cable_cg_nb); in rk816_battery_shutdown()
5115 extcon_unregister_notifier(di->cable_edev, EXTCON_CHG_USB_CDP, in rk816_battery_shutdown()
5116 &di->cable_cg_nb); in rk816_battery_shutdown()
5117 extcon_unregister_notifier(di->cable_edev, EXTCON_USB_VBUS_EN, in rk816_battery_shutdown()
5118 &di->cable_host_nb); in rk816_battery_shutdown()
5119 extcon_unregister_notifier(di->cable_edev, EXTCON_USB, in rk816_battery_shutdown()
5120 &di->cable_discnt_nb); in rk816_battery_shutdown()
5122 rk816_bat_unregister_fb_notify(di); in rk816_battery_shutdown()
5123 cancel_delayed_work_sync(&di->dc_delay_work); in rk816_battery_shutdown()
5124 cancel_delayed_work_sync(&di->bat_delay_work); in rk816_battery_shutdown()
5125 cancel_delayed_work_sync(&di->calib_delay_work); in rk816_battery_shutdown()
5126 cancel_delayed_work_sync(&di->usb_work); in rk816_battery_shutdown()
5127 cancel_delayed_work_sync(&di->host_work); in rk816_battery_shutdown()
5128 cancel_delayed_work_sync(&di->discnt_work); in rk816_battery_shutdown()
5129 destroy_workqueue(di->bat_monitor_wq); in rk816_battery_shutdown()
5130 destroy_workqueue(di->usb_charger_wq); in rk816_battery_shutdown()
5132 del_timer(&di->caltimer); in rk816_battery_shutdown()
5133 rk816_bat_set_otg_power(di, USB_OTG_POWER_OFF); in rk816_battery_shutdown()
5135 if (base2sec(di->boot_base) < REBOOT_PERIOD_SEC) in rk816_battery_shutdown()
5136 cnt = rk816_bat_check_reboot(di); in rk816_battery_shutdown()
5138 rk816_bat_save_reboot_cnt(di, 0); in rk816_battery_shutdown()
5141 di->dsoc, di->rsoc, di->current_avg, di->voltage_avg, in rk816_battery_shutdown()
5142 di->remain_cap, di->fcc, rk816_bat_chrg_online(di), in rk816_battery_shutdown()
5143 di->otg_in, di->otg_pmic5v, cnt, in rk816_battery_shutdown()
5144 di->algo_rest_mode, di->algo_rest_val); in rk816_battery_shutdown()