OSDN Git Service

power: smb-lib: Disable USB IRQs during high duty cycle
authorFenglin Wu <fenglinw@codeaurora.org>
Thu, 24 Aug 2017 06:28:54 +0000 (14:28 +0800)
committerFenglin Wu <fenglinw@codeaurora.org>
Wed, 20 Sep 2017 04:34:11 +0000 (12:34 +0800)
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 <fenglinw@codeaurora.org>
drivers/power/supply/qcom/smb-lib.c

index b3c2b67..8de4708 100644 (file)
@@ -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)