From 6f4dec2b0c316b241d98c15211512d96fd977b5d Mon Sep 17 00:00:00 2001 From: Subbaraman Narayanamurthy Date: Mon, 6 Feb 2017 16:33:12 -0800 Subject: [PATCH] qcom: qpnp-smb2: Reset switcher_power_ok irq count when USBIN_UV fires Currently when 3 switcher_power_ok interrupts are seen within a second, the driver thinks that the switcher is reverse boosting and suspends USB input path. However, switcher_power_ok could happen 3 times within a second while AICL is run from a charger collapse, a valid usecase which ends up in an USB suspended state. Note that AICL run caused switcher_power_ok is accompanied by an USBIN_UV interrupt. Use that to distinguish reverse boost Vs AICL runs. In particular, reset the switcher_power_ok interrupt count updated by storm_watch when an USBIN_UV interrupt is seen. Change-Id: I6817c66319f9af03ac28324a8d863876fdadafb3 Signed-off-by: Subbaraman Narayanamurthy --- drivers/power/supply/qcom/qpnp-smb2.c | 2 +- drivers/power/supply/qcom/smb-lib.c | 15 +++++++++++++++ drivers/power/supply/qcom/smb-lib.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/qcom/qpnp-smb2.c b/drivers/power/supply/qcom/qpnp-smb2.c index a1afd1e236b8..8d0f317297f4 100644 --- a/drivers/power/supply/qcom/qpnp-smb2.c +++ b/drivers/power/supply/qcom/qpnp-smb2.c @@ -1738,7 +1738,7 @@ static struct smb_irq_info smb2_irqs[] = { }, [USBIN_UV_IRQ] = { .name = "usbin-uv", - .handler = smblib_handle_debug, + .handler = smblib_handle_usbin_uv, }, [USBIN_OV_IRQ] = { .name = "usbin-ov", diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c index c9603fa39b03..c4240f2b1bb1 100644 --- a/drivers/power/supply/qcom/smb-lib.c +++ b/drivers/power/supply/qcom/smb-lib.c @@ -2806,6 +2806,21 @@ irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data) return IRQ_HANDLED; } +irqreturn_t smblib_handle_usbin_uv(int irq, void *data) +{ + struct smb_irq_data *irq_data = data; + struct smb_charger *chg = irq_data->parent_data; + struct storm_watch *wdata; + + smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name); + if (!chg->irq_info[SWITCH_POWER_OK_IRQ].irq_data) + return IRQ_HANDLED; + + wdata = &chg->irq_info[SWITCH_POWER_OK_IRQ].irq_data->storm_data; + reset_storm_count(wdata); + return IRQ_HANDLED; +} + irqreturn_t smblib_handle_usb_plugin(int irq, void *data) { struct smb_irq_data *irq_data = data; diff --git a/drivers/power/supply/qcom/smb-lib.h b/drivers/power/supply/qcom/smb-lib.h index d7dea7172464..41089554f370 100644 --- a/drivers/power/supply/qcom/smb-lib.h +++ b/drivers/power/supply/qcom/smb-lib.h @@ -354,6 +354,7 @@ irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data); irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data); irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data); irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data); +irqreturn_t smblib_handle_usbin_uv(int irq, void *data); irqreturn_t smblib_handle_usb_plugin(int irq, void *data); irqreturn_t smblib_handle_usb_source_change(int irq, void *data); irqreturn_t smblib_handle_icl_change(int irq, void *data);