From 496cb2c408e8b5aff0ce03ca299e17145dbd4c4c Mon Sep 17 00:00:00 2001 From: 149 Date: Thu, 21 Sep 2023 18:15:43 +0800 Subject: [PATCH] charge rt9426a add ffc mode rt9426a set FC_VTH and FC_ITH add ffc mode set FC_VTH and FC_ITH in kernel Change-Id: I0822f8b8ba459cb1b61148024205116bd2755fa6 Reviewed-on: https://gerrit.mot.com/2748210 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Lei Chen Reviewed-by: Wei Xu Reviewed-by: Xiangpo Zhao Submit-Approved: Jira Key --- .../mmi_discrete_charger_core.c | 9 ++- .../power/rt9426a_fg_mmi/rt9426a_battery.c | 63 ++++++++++++++++++- .../power/rt9426a_fg_mmi/rt9426a_battery.h | 10 +++ 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c index 6a11d7363969..e77715fd89fa 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -1324,11 +1324,10 @@ static void mmi_discrete_config_chgmod_to_fg(struct mmi_discrete_charger *chip) { union power_supply_propval val; int rc = 0; - - if (!chip->bms_psy || !chip->chgmod_to_fg) + if (!chip->bms_psy) return; - - if (chip->chg_info.chrg_pmax_mw > TURBO_CHRG_FFC_THRSH_MW) { + if (chip->chg_info.chrg_pmax_mw > TURBO_CHRG_FFC_THRSH_MW|| + (chip->is_ffc_enable && chip->enable_10w_ffc)) { val.intval = MMI_CHARGER_MODE_FFC; } else if (chip->chg_info.chrg_type == POWER_SUPPLY_TYPE_USB) { val.intval = MMI_CHARGER_MODE_USB; @@ -1337,7 +1336,7 @@ static void mmi_discrete_config_chgmod_to_fg(struct mmi_discrete_charger *chip) } rc = power_supply_set_property(chip->bms_psy, POWER_SUPPLY_PROP_TYPE, &val); - mmi_dbg(chip, "%s config charger mode to fg\n", rc? "Can't" : "success"); + mmi_dbg(chip,"%s config charger mode to fg\n", rc? "Can't" : "success"); } diff --git a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c index 5723b1d8f976..ae3ea1e2c1d3 100644 --- a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c +++ b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.c @@ -910,6 +910,9 @@ static void rt9426a_update_info(struct rt9426a_chip *chip) regval = rt9426a_get_soh(chip); dev_info(chip->dev, "SOH(%d)\n", regval); + rt9426a_write_page_cmd(chip, RT9426A_PAGE_5); + regval = rt9426a_reg_read_word(chip->i2c, RT9426A_REG_SWINDOW3); + dev_info(chip->dev, "FC_ITH,FC_VTH =(0x%04x)\n", regval); /* rt9426a_update_ieoc_setting(chip); */ if (batt_psy) { @@ -1171,6 +1174,52 @@ out: return offset; } +static int rt9426a_set_ffc_mode(struct rt9426a_chip *chip,u8 mode) +{ + int i = 0; + int ret = 0; + if (mode == 0) { + if (chip->btemp < 250 && chip->btemp >= 0) + i = RT9426A_CV4500_IEOC243; + else if(chip->btemp < 250) + i = RT9426A_CV4530_IEOC506; + else if (chip->btemp < 350) + i = RT9426A_CV4530_IEOC560; + else if (chip->btemp < 450) + i = RT9426A_CV4530_IEOC965; + else + i = RT9426A_CV4200_IEOC243; + } else { + if (chip->btemp < 350 && chip->btemp >= 0) + i = RT9426A_CV4500_IEOC243; + else if (chip->btemp < 450) + i = RT9426A_CV4500_IEOC670; + else + i = RT9426A_CV4200_IEOC243; + } + mutex_lock(&chip->update_lock); + if (rt9426a_unseal_wi_retry(chip) == RT9426A_UNSEAL_FAIL) { + ret = -EINVAL; + goto ccv_out; + } + rt9426a_write_page_cmd(chip, RT9426A_PAGE_5); + ret = rt9426a_reg_read_word(chip->i2c, RT9426A_REG_SWINDOW3); + if (ret < 0) + goto ccv_out; + if (ret != chip->pdata->fc_vth_ith[i]) + ret = rt9426a_reg_write_word(chip->i2c, + RT9426A_REG_SWINDOW3, + chip->pdata->fc_vth_ith[i]); + else + ret = 0; +ccv_out: + mutex_unlock(&chip->update_lock); + dev_notice(chip->dev, "RT9426A ffc_mode:%d chip->btemp:%d fc_vth_ith %x\n", + mode,chip->btemp,chip->pdata->fc_vth_ith[i]); + + return ret; +} + static int rt_fg_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) @@ -1266,11 +1315,14 @@ static int rt_fg_set_property(struct power_supply *psy, chip->ocv_checksum_dtsi = *((u32 *)chip->pdata->ocv_table + (chip->ocv_index * 80) + RT9426A_IDX_OF_OCV_CKSUM); break; + case POWER_SUPPLY_PROP_TYPE: + if (chip->pdata->fc_vth_ith[0] != 0x0) + rc = rt9426a_set_ffc_mode(chip,val->intval); + break; default: rc = -EINVAL; break; } - return rc; } @@ -1281,6 +1333,7 @@ static int rt_fg_property_is_writeable(struct power_supply *psy, enum power_supp case POWER_SUPPLY_PROP_CYCLE_COUNT: /* add for aging cv */ case POWER_SUPPLY_PROP_VOLTAGE_OCV: + case POWER_SUPPLY_PROP_TYPE: return true; default: return false; @@ -1297,6 +1350,7 @@ static enum power_supply_property rt_fg_props[] = { POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, POWER_SUPPLY_PROP_CAPACITY, POWER_SUPPLY_PROP_VOLTAGE_OCV, + POWER_SUPPLY_PROP_TYPE, POWER_SUPPLY_PROP_CHARGE_FULL, POWER_SUPPLY_PROP_CHARGE_COUNTER, }; @@ -2680,7 +2734,12 @@ static int rt_parse_dt(struct device *dev, struct rt9426a_platform_data *pdata) ret = of_property_read_u32(np, "rt,para_version", &pdata->para_version); if (ret < 0) pdata->para_version = 0; - + ret = of_property_read_u32_array(np, "rt,fc_vth-fc_ith", pdata->fc_vth_ith, 6); + if (ret < 0) { + dev_notice(dev, "no fc_vth-fc_ith, use defaut 0x4CAC\n"); + for (i = 0; i < 6; i++) + pdata->fc_vth_ith[i] = 0x0; + } ret = of_property_read_string(np, "rt,bat_name", (const char **)&pdata->bat_name); if (ret < 0) diff --git a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h index 54c993508f64..9341372ccb8c 100644 --- a/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h +++ b/drivers/power/rt9426a_fg_mmi/rt9426a_battery.h @@ -159,6 +159,15 @@ enum { RT9426A_TEMP_FROM_IC, }; +enum { + RT9426A_CV4500_IEOC243 = 0, + RT9426A_CV4500_IEOC670, + RT9426A_CV4200_IEOC243, + RT9426A_CV4530_IEOC506, + RT9426A_CV4530_IEOC560, + RT9426A_CV4530_IEOC965, +}; + struct fg_ocv_table { int data[8]; }; @@ -170,6 +179,7 @@ struct fg_extreg_table { struct rt9426a_platform_data { u32 dtsi_version[2]; u32 para_version; + u32 fc_vth_ith[6]; int soc_offset_size[2]; struct soc_offset_table soc_offset; int offset_interpolation_order[2];