From dec0712199dfaf9cbfc4d94f903c19e47813ba78 Mon Sep 17 00:00:00 2001 From: yanyh2 Date: Thu, 14 Apr 2022 22:25:30 +0800 Subject: [PATCH] Add factory kill time debounce support Add factory kill time debounce support to debounce the factory kill event for charger/usb online shake during boot in factory mode. Change-Id: I1ca70dbfebd1fa8555ca36dda2b7b6ab2dbc8a2d Signed-off-by: yanyh2 Reviewed-on: https://gerrit.mot.com/2242975 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Zhenxin Xi Submit-Approved: Jira Key --- drivers/power/mmi_charger/mmi_charger.c | 27 +++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/drivers/power/mmi_charger/mmi_charger.c b/drivers/power/mmi_charger/mmi_charger.c index 8ef71801e2bb..b245a860e25d 100644 --- a/drivers/power/mmi_charger/mmi_charger.c +++ b/drivers/power/mmi_charger/mmi_charger.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "mmi_charger.h" @@ -240,6 +241,7 @@ struct mmi_charger_chip { struct mmi_vote suspend_charger_vote; struct mmi_vote disable_charging_vote; + uint32_t factory_kill_debounce_ms; }; static int mmi_vote(struct mmi_vote *vote, const char *voter, @@ -1958,7 +1960,7 @@ static void mmi_update_battery_status(struct mmi_charger_chip *chip) mmi_changed = true; chip->max_charger_rate = max_charger_rate; mmi_notify_charger_event(chip, NOTIFY_EVENT_TYPE_CHG_RATE); - mmi_info(chip, "%s charger is detected\n", + mmi_err(chip, "%s charger is detected\n", charge_rate[chip->max_charger_rate]); } @@ -2024,6 +2026,9 @@ static void mmi_charger_heartbeat_work(struct work_struct *work) struct mmi_charger_chip *chip = container_of(work, struct mmi_charger_chip, heartbeat_work.work); + struct timespec64 now; + static struct timespec64 start; + uint32_t elapsed_ms; /* Have not been resumed so wait another 100 ms */ if (chip->suspended & IS_SUSPENDED) { @@ -2066,13 +2071,22 @@ static void mmi_charger_heartbeat_work(struct work_struct *work) if (chip->max_charger_rate > MMI_POWER_SUPPLY_CHARGE_RATE_NONE) { mmi_dbg(chip, "Factory Kill Armed\n"); chip->factory_kill_armed = true; + ktime_get_real_ts64(&start); } else if (chip->factory_kill_armed && !factory_kill_disable) { - mmi_warn(chip, "Factory kill power off\n"); + ktime_get_real_ts64(&now); + elapsed_ms = (now.tv_sec - start.tv_sec) * 1000; + elapsed_ms += (now.tv_nsec - start.tv_nsec) / 1000000; + if (elapsed_ms < chip->factory_kill_debounce_ms) { + mmi_err(chip, "Factory kill debounce elapsed_ms:%d\n", + elapsed_ms); + } else { + mmi_err(chip, "Factory kill power off\n"); #if (KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE) || defined(MMI_GKI_API_ALLOWANCE) - orderly_poweroff(true); + orderly_poweroff(true); #else - kernel_power_off(); + kernel_power_off(); #endif + } } else { chip->factory_kill_armed = false; } @@ -2575,6 +2589,11 @@ static int mmi_parse_dt(struct mmi_charger_chip *chip) chip->start_factory_kill_disabled = of_property_read_bool(node, "mmi,start-factory-kill-disabled"); + rc = of_property_read_u32(node, "mmi,factory-kill-debounce-ms", + &chip->factory_kill_debounce_ms); + if (rc) + chip->factory_kill_debounce_ms = 0; + rc = of_property_read_u32(node, "mmi,upper-limit-capacity", &chip->upper_limit_capacity); if (rc)