From fc4c5d8ed4d91675c4f8a4110e6d1852c83ff6f3 Mon Sep 17 00:00:00 2001 From: liuyc20 Date: Mon, 1 Nov 2021 09:48:08 +0800 Subject: [PATCH] power: modified the caculation formula of ocv_checksum_dtsi When the phone is restarted, the OCV checksum calculation method is problematic, which causes the OCV parameter to be updated, so that the voltage is re-measured and check the meter to obtain the initial capacity, which causes the battery capacity to jump when restarting the phone. Change-Id: I07bea70c2318eff8d71e7fd44119242f5b830de3 Signed-off-by: liuyc20 Reviewed-on: https://gerrit.mot.com/2105262 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../power/rt9426a_fg_mmi/rt9426a_battery.c | 45 +++++++++++-------- .../power/rt9426a_fg_mmi/rt9426a_battery.h | 2 +- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c index 617f0ab46275..37a8160a12e8 100644 --- a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c +++ b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c @@ -625,17 +625,22 @@ static void __maybe_unused rt9426a_check_cycle_cnt_for_fg_ini(struct rt9426a_chi static unsigned int rt9426a_get_ocv_checksum(struct rt9426a_chip *chip) { - int regval = 0; - regval = rt9426a_unseal_wi_retry(chip); + int i, regval = 0, retry_times = 2; - if (regval == RT9426A_UNSEAL_FAIL) + if (rt9426a_unseal_wi_retry(chip) == RT9426A_UNSEAL_FAIL) chip->ocv_checksum_ic = 0xFFFF; else{ - /* get ocv checksum from ic */ - rt9426a_reg_write_word(chip->i2c, RT9426A_REG_BDCNTL, 0xCA09); - rt9426a_reg_write_word(chip->i2c, RT9426A_REG_BDCNTL, 0xCA09); - mdelay(5); - chip->ocv_checksum_ic = rt9426a_reg_read_word(chip->i2c, RT9426A_REG_SWINDOW5); + /* confirm sending read page cmd successfully ; 2021-10-29 */ + for (i = 0; i < retry_times; i++) { + /* get ocv checksum from ic */ + rt9426a_reg_write_word(chip->i2c, RT9426A_REG_BDCNTL, 0xCA09); + rt9426a_reg_write_word(chip->i2c, RT9426A_REG_BDCNTL, 0xCA09); + mdelay(5); + regval = rt9426a_reg_read_word(chip->i2c, RT9426A_REG_SWINDOW4); + chip->ocv_checksum_ic = rt9426a_reg_read_word(chip->i2c, RT9426A_REG_SWINDOW5); + if ((regval != 0xFFFF)||(chip->ocv_checksum_ic != 0xFFFF)) + break; + } } return chip->ocv_checksum_ic; } @@ -1221,7 +1226,7 @@ static int rt_fg_set_property(struct power_supply *psy, (chip->pdata->fc_vth[chip->ocv_index]) | (chip->pdata->extreg_table[5].data[5] << 8)); mutex_unlock(&chip->update_lock); /* update ocv checksum */ - chip->ocv_checksum_dtsi = *(u32 *)(chip->pdata->ocv_table + + chip->ocv_checksum_dtsi = *((u32 *)chip->pdata->ocv_table + (chip->ocv_index * 80) + RT9426A_IDX_OF_OCV_CKSUM); break; default: @@ -2279,14 +2284,16 @@ static int rt9426a_apply_pdata(struct rt9426a_chip *chip) /* read ocv_index before using it */ chip->ocv_index = rt9426a_reg_read_word(chip->i2c, RT9426A_REG_RSVD2); + dev_info(chip->dev, "%s: ocv_index = %d\n", + __func__, chip->ocv_index); /* update ocv_checksum_dtsi after ocv_index updated */ - chip->ocv_checksum_dtsi = *(u32 *)(chip->pdata->ocv_table + + chip->ocv_checksum_dtsi = *((u32 *)chip->pdata->ocv_table + (chip->ocv_index * 80) + RT9426A_IDX_OF_OCV_CKSUM); /* add for aging cv ; udpate fcc before writing */ chip->pdata->extreg_table[2].data[12] = chip->pdata->fcc[chip->ocv_index] & 0xff; chip->pdata->extreg_table[2].data[13] = (chip->pdata->fcc[chip->ocv_index] >> 8) & 0xff; /* add for aging cv ; udpate fc_vth before writing */ - chip->pdata->extreg_table[5].data[4]= chip->pdata->fc_vth[chip->ocv_index]; + chip->pdata->extreg_table[4].data[4]= chip->pdata->fc_vth[chip->ocv_index]; /* backup opcfg1 */ chip->op_config_1_backup = (chip->pdata->extreg_table[1].data[1] * 256) + @@ -2302,18 +2309,21 @@ static int rt9426a_apply_pdata(struct rt9426a_chip *chip) /* rt9426a_exit_shutdown_mode(chip); */ /* Check [RI]@Reg-Flag3 & fg total checksum */ regval = rt9426a_get_checksum(chip); + total_checksum_target = rt9426a_calculate_checksum_crc(chip); /* get ocv checksum from fg ic before applying ocv table */ rt9426a_get_ocv_checksum(chip); - if(reg_flag3&RT9426A_RI_MASK){ + if(reg_flag3&RT9426A_RI_MASK){ dev_info(chip->dev, "Init RT9426A by [RI]\n"); break; } - else if(regval!=(rt9426a_calculate_checksum_crc(chip))){ + else if(regval != total_checksum_target){ dev_info(chip->dev, "Force Init RT9426A by total checksum\n"); + dev_info(chip->dev, "IC: 0x%04X ; DTSI: 0x%04X \n", regval, total_checksum_target); break; } else if (chip->ocv_checksum_ic != chip->ocv_checksum_dtsi){ dev_info(chip->dev, "Force Init RT9426A by OCV checksum\n"); + dev_info(chip->dev, "IC: 0x%04X ; DTSI: 0x%04X \n", chip->ocv_checksum_ic , chip->ocv_checksum_dtsi); break; } else{ @@ -2339,12 +2349,8 @@ static int rt9426a_apply_pdata(struct rt9426a_chip *chip) /*NOTICE!! Please follow below setting sequence & order */ /* write ocv table only when checksum matched */ /* add for aging cv */ - { - const u32 *pval = (u32 *)(chip->pdata->ocv_table + - (chip->ocv_index * 80) + RT9426A_IDX_OF_OCV_CKSUM); - if(*pval == chip->ocv_checksum_dtsi) + if(chip->ocv_checksum_ic != chip->ocv_checksum_dtsi) wt_ocv_result = rt9426a_write_ocv_table(chip); - } /* Read Reg IRQ to reinital Alert pin state */ rt9426a_reg_read_word(chip->i2c, RT9426A_REG_IRQ); @@ -2853,8 +2859,9 @@ static int rt9426a_i2c_probe(struct i2c_client *i2c) chip->design_capacity = 2000; chip->full_capacity = 2000; chip->ocv_checksum_ic = 0; + chip->ocv_index = 0; /* init as 0 */ /* add for aging cv */ - chip->ocv_checksum_dtsi = *(u32 *)(chip->pdata->ocv_table + + chip->ocv_checksum_dtsi = *((u32 *)chip->pdata->ocv_table + (chip->ocv_index * 80) + RT9426A_IDX_OF_OCV_CKSUM); mutex_init(&chip->var_lock); diff --git a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h index 308e54eabf0e..2c7deeb66691 100644 --- a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h +++ b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h @@ -187,7 +187,7 @@ struct rt9426a_platform_data { /* add for aging cv */ u32 fcc[5]; /* for aging_sts=0~4 */ u32 fc_vth[5]; /* for aging_sts=0~4 */ - unsigned int ocv_table[5][10][8]; /* for aging_sts=0~4 */ + u32 ocv_table[5][10][8]; /* for aging_sts=0~4 */ }; enum {