From d93f2d210f6f994c255ff98b56484a3742dae8b6 Mon Sep 17 00:00:00 2001 From: Yonghua Yan Date: Tue, 10 Jan 2023 22:57:29 +0800 Subject: [PATCH] align battery current and charger power update rate Align battery current reading request of power supply property reading to avoid too frequent mmi charger status updating and uevent change to user space on dual batteries support products.. Update charger power only when power change more than 1W. Change-Id: I154ad951d79db36ed06eaaeca32785b8a68051a3 Signed-off-by: Yonghua Yan Reviewed-on: https://gerrit.mot.com/2482188 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jianqi Yang Submit-Approved: Jira Key --- drivers/power/mmi_charger/mmi_charger.c | 31 +++++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/power/mmi_charger/mmi_charger.c b/drivers/power/mmi_charger/mmi_charger.c index 567d39a55685..d9d47597df0a 100644 --- a/drivers/power/mmi_charger/mmi_charger.c +++ b/drivers/power/mmi_charger/mmi_charger.c @@ -256,6 +256,7 @@ struct mmi_charger_chip { bool empty_vbat_shutdown_triggered; int heartbeat_dischg_ms; + uint32_t ibat_calc_alignment_time; }; static int mmi_vote(struct mmi_vote *vote, const char *voter, @@ -2086,7 +2087,7 @@ static void mmi_update_battery_status(struct mmi_charger_chip *chip) vbus_present? "present" : "absent"); } - if (chip->power_watt != power_watt) { + if ((chip->power_watt / 1000) != (power_watt / 1000)) { mmi_changed = true; chip->power_watt = power_watt; mmi_notify_charger_event(chip, NOTIFY_EVENT_TYPE_POWER_WATT); @@ -2624,11 +2625,26 @@ static int mmi_get_prop(struct power_supply *psy, { struct mmi_charger_chip *chip = power_supply_get_drvdata(psy); int rc = 0; + uint32_t elapsed_ms; + struct timespec64 now; + static struct timespec64 start = {0}; - if (psp == POWER_SUPPLY_PROP_CURRENT_NOW) { - cancel_delayed_work(&chip->heartbeat_work); - schedule_delayed_work(&chip->heartbeat_work, - msecs_to_jiffies(0)); + if (psp == POWER_SUPPLY_PROP_CURRENT_NOW && + chip->ibat_calc_alignment_time != UINT_MAX) { + ktime_get_real_ts64(&now); + if (now.tv_sec >= start.tv_sec) { + elapsed_ms = (now.tv_sec - start.tv_sec) * 1000; + elapsed_ms += (now.tv_nsec - start.tv_nsec) / 1000000; + } else { + elapsed_ms = 0; + start = now; + } + if (elapsed_ms >= chip->ibat_calc_alignment_time) { + cancel_delayed_work(&chip->heartbeat_work); + schedule_delayed_work(&chip->heartbeat_work, + msecs_to_jiffies(0)); + start = now; + } } switch (psp) { @@ -2772,6 +2788,11 @@ static int mmi_parse_dt(struct mmi_charger_chip *chip) mmi_warn(chip, "mmi,heartbeat dischg ms %d\n", chip->heartbeat_dischg_ms); + rc = of_property_read_u32(node, "mmi,ibat-calc-alignment-time", + &chip->ibat_calc_alignment_time); + if (rc) + chip->ibat_calc_alignment_time = UINT_MAX; + node = of_find_node_by_path("/chosen"); if (!node)