From: Fenglin Wu Date: Thu, 24 Aug 2017 06:28:54 +0000 (+0800) Subject: power: smb-lib: Disable USB IRQs during high duty cycle X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=28121ca02fefa7d243c0ffdfa8071d5f22d22dc3;p=sagit-ice-cold%2Fkernel_xiaomi_msm8998.git power: smb-lib: Disable USB IRQs during high duty cycle Disable USB IRQs after high duty cycle IRQ triggered and re-enable them in the delay worker. This helps to avoid the high duty cycle IRQ storming. CRs-Fixed: 2094725 Change-Id: Iba22a7402692b5ee5f738cc17ed9c214f6014ac0 Signed-off-by: Fenglin Wu --- diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c index b3c2b67abfde..8de4708332f8 100644 --- a/drivers/power/supply/qcom/smb-lib.c +++ b/drivers/power/supply/qcom/smb-lib.c @@ -4063,6 +4063,14 @@ irqreturn_t smblib_handle_high_duty_cycle(int irq, void *data) struct smb_charger *chg = irq_data->parent_data; chg->is_hdc = true; + /* + * Disable usb IRQs after the flag set and re-enable IRQs after + * the flag cleared in the delayed work queue, to avoid any IRQ + * storming during the delays + */ + if (chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq) + disable_irq_nosync(chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq); + schedule_delayed_work(&chg->clear_hdc_work, msecs_to_jiffies(60)); return IRQ_HANDLED; @@ -4240,6 +4248,8 @@ static void clear_hdc_work(struct work_struct *work) clear_hdc_work.work); chg->is_hdc = 0; + if (chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq) + enable_irq(chg->irq_info[HIGH_DUTY_CYCLE_IRQ].irq); } static void rdstd_cc2_detach_work(struct work_struct *work)