From 089a4c52c2adac0dbf02da26a12be4fd59bc8726 Mon Sep 17 00:00:00 2001 From: Kenny Kessler Date: Mon, 9 Jul 2018 17:10:08 -0500 Subject: [PATCH] power: qpnp-smbcharger-mmi: Fix Factory Kill Factory Kill was being tripped when USB is suspended. Fix this by checking USBIN Voltage when in suspend rather then the online status. Change-Id: I138db13c0e14b29d887a0dda0dbfdb1d4deffaef Signed-off-by: Kenny Kessler Reviewed-on: https://gerrit.mot.com/1206691 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Ryan Lattrel Reviewed-by: Curtis Porter Reviewed-by: Kenneth Kessler Submit-Approved: Jira Key --- .../qpnp-smbcharger-mmi/qpnp-smbcharger-mmi.c | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/drivers/power/qpnp-smbcharger-mmi/qpnp-smbcharger-mmi.c b/drivers/power/qpnp-smbcharger-mmi/qpnp-smbcharger-mmi.c index d87e9c6242eb..049967f19eb3 100755 --- a/drivers/power/qpnp-smbcharger-mmi/qpnp-smbcharger-mmi.c +++ b/drivers/power/qpnp-smbcharger-mmi/qpnp-smbcharger-mmi.c @@ -861,6 +861,7 @@ static int smb_mmi_get_property(struct power_supply *psy, static int factory_kill_disable; module_param(factory_kill_disable, int, 0644); +#define TWO_VOLT 2000000 static void mmi_heartbeat_work(struct work_struct *work) { struct smb_mmi_charger *chip = container_of(work, @@ -868,7 +869,7 @@ static void mmi_heartbeat_work(struct work_struct *work) heartbeat_work.work); int hb_resch_time; union power_supply_propval pval; - int rc; + int rc, usb_suspend, usbin_uv; if (chip->factory_mode) hb_resch_time = 1000; @@ -876,13 +877,27 @@ static void mmi_heartbeat_work(struct work_struct *work) hb_resch_time = 60000; if (chip->factory_mode) { + rc = smblib_get_usb_suspend(chip, &usb_suspend); + if (rc < 0) + goto sch_hb; + + rc = power_supply_get_property(chip->usb_psy, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + &pval); + if (rc < 0) + goto sch_hb; + else + usbin_uv = pval.intval; + rc = power_supply_get_property(chip->pc_port_psy, POWER_SUPPLY_PROP_ONLINE, &pval); if (rc < 0) goto sch_hb; - if (pval.intval) { + + + if (pval.intval || (usb_suspend && (usbin_uv > TWO_VOLT))) { pr_debug("SMBMMI: Factory Kill Armed\n"); chip->factory_kill_armed = true; } else if (chip->factory_kill_armed && !factory_kill_disable) { @@ -949,14 +964,14 @@ static int smbchg_reboot(struct notifier_block *nb, /* Suspend USB and DC */ smblib_set_usb_suspend(chg, true); - rc = power_supply_get_property(chg->pc_port_psy, - POWER_SUPPLY_PROP_ONLINE, + rc = power_supply_get_property(chg->usb_psy, + POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); - while (rc >= 0 && val.intval) { + while ((rc >= 0) && (val.intval > TWO_VOLT)) { msleep(100); rc = power_supply_get_property( - chg->pc_port_psy, - POWER_SUPPLY_PROP_ONLINE, + chg->usb_psy, + POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); pr_err("Wait for VBUS to decay\n"); }