From 25f8a99be04069cfcb398ab9e0e4af3536cdb10f Mon Sep 17 00:00:00 2001 From: Haijian Ma Date: Fri, 3 Nov 2023 09:06:33 +0800 Subject: [PATCH] charge: config qg iterm small than FCC Sometimes thermal limit FCC small than qg iterm when soc >90%. Qcom gauge will track to 100% but now battery is not full. So qg iterm should setted small than FCC and large than chg_iterm. Change-Id: I0dbeee2bfe79d0ddeaf5681ce7b77f0bb7eb7424 Signed-off-by: Haijian Ma Reviewed-on: https://gerrit.mot.com/2784309 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../mmi-smbcharger-iio/mmi-smbcharger-iio.c | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c b/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c index f7b2756776f0..30f8f3686c49 100755 --- a/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c +++ b/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c @@ -524,6 +524,8 @@ struct smb_mmi_charger { /* DCP FFC */ bool ffc_stop_chg; bool enable_dcp_ffc; + + bool enable_fcc_large_qg_iterm; }; #define CHGR_FAST_CHARGE_CURRENT_CFG_REG (CHGR_BASE + 0x61) @@ -3317,6 +3319,33 @@ vote_now: return sched_time; } +static int mmi_set_qg_iterm(struct smb_mmi_charger *chip, int qg_iterm) +{ + int rc = 0; + int fcc = 0; + union power_supply_propval val; + + rc = power_supply_get_property(chip->batt_psy, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, &val); + if (rc < 0) { + mmi_err(chip, "Couldn't get batt FCC, rc=%d\n", rc); + return rc; + } + + fcc = val.intval / 1000; + + if (chip->enable_fcc_large_qg_iterm && (qg_iterm > (fcc - 50))) + qg_iterm = fcc - 50; + + rc = smb_mmi_write_iio_chan(chip, + SMB5_QG_BATT_FULL_CURRENT, qg_iterm); + if (rc < 0) { + mmi_err(chip, "Couldn't set batt full current, rc=%d\n", rc); + } + + return rc; +} + static int mmi_get_ffc_fv(struct smb_mmi_charger *chip, int zone, bool force_ffc) { int rc; @@ -3334,8 +3363,7 @@ static int mmi_get_ffc_fv(struct smb_mmi_charger *chip, int zone, bool force_ffc if ((zone == ZONE_35C_TO_45C) && (chip->noffc_chg_iterm_45c != -EINVAL)) { prm->chrg_iterm = chip->noffc_chg_iterm_45c; - rc = smb_mmi_write_iio_chan(chip, - SMB5_QG_BATT_FULL_CURRENT, + rc = mmi_set_qg_iterm(chip, (chip->noffc_qg_iterm_45c != -EINVAL) ? chip->noffc_qg_iterm_45c : chip->noffc_qg_iterm); if (rc < 0) { @@ -3344,8 +3372,7 @@ static int mmi_get_ffc_fv(struct smb_mmi_charger *chip, int zone, bool force_ffc } else { prm->chrg_iterm = chip->noffc_chg_iterm; - rc = smb_mmi_write_iio_chan(chip, - SMB5_QG_BATT_FULL_CURRENT, chip->noffc_qg_iterm); + rc = mmi_set_qg_iterm(chip, chip->noffc_qg_iterm); if (rc < 0) { mmi_err(chip, "Couldn't set batt full current, rc=%d\n", rc); } @@ -3356,8 +3383,7 @@ static int mmi_get_ffc_fv(struct smb_mmi_charger *chip, int zone, bool force_ffc return ffc_max_fv; } - rc = smb_mmi_write_iio_chan(chip, - SMB5_QG_BATT_FULL_CURRENT, prm->ffc_zones[zone].ffc_qg_iterm); + rc = mmi_set_qg_iterm(chip, prm->ffc_zones[zone].ffc_qg_iterm); if (rc < 0) { mmi_err(chip, "Couldn't set batt full current, rc=%d\n", rc); } @@ -4760,6 +4786,8 @@ static int parse_mmi_dt(struct smb_mmi_charger *chg) chg->enable_dcp_ffc = of_property_read_bool(node, "mmi,enable-dcp-ffc"); + chg->enable_fcc_large_qg_iterm = of_property_read_bool(node, "mmi,enable-fcc-large-qg-iterm"); + return rc; }