Loading drivers/scsi/ufs/ufshcd.c +6 −1 Original line number Diff line number Diff line Loading @@ -2237,7 +2237,9 @@ int ufshcd_hold(struct ufs_hba *hba, bool async) * If the timer was active but the callback was not running * we have nothing to do, just change state and return. */ if (hrtimer_try_to_cancel(&hba->clk_gating.gate_hrtimer) == 1) { if ((hrtimer_try_to_cancel(&hba->clk_gating.gate_hrtimer) == 1) && !(work_pending(&hba->clk_gating.gate_work)) && !hba->clk_gating.gate_wk_in_process) { hba->clk_gating.state = CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); Loading Loading @@ -2289,7 +2291,9 @@ static void ufshcd_gate_work(struct work_struct *work) clk_gating.gate_work); unsigned long flags; hba->clk_gating.gate_wk_in_process = true; spin_lock_irqsave(hba->host->host_lock, flags); if (hba->clk_gating.state == CLKS_OFF) goto rel_lock; /* Loading Loading @@ -2365,6 +2369,7 @@ static void ufshcd_gate_work(struct work_struct *work) rel_lock: spin_unlock_irqrestore(hba->host->host_lock, flags); out: hba->clk_gating.gate_wk_in_process = false; return; } Loading drivers/scsi/ufs/ufshcd.h +1 −0 Original line number Diff line number Diff line Loading @@ -480,6 +480,7 @@ struct ufs_clk_gating { struct device_attribute delay_perf_attr; struct device_attribute enable_attr; bool is_enabled; bool gate_wk_in_process; int active_reqs; struct workqueue_struct *clk_gating_workq; }; Loading Loading
drivers/scsi/ufs/ufshcd.c +6 −1 Original line number Diff line number Diff line Loading @@ -2237,7 +2237,9 @@ int ufshcd_hold(struct ufs_hba *hba, bool async) * If the timer was active but the callback was not running * we have nothing to do, just change state and return. */ if (hrtimer_try_to_cancel(&hba->clk_gating.gate_hrtimer) == 1) { if ((hrtimer_try_to_cancel(&hba->clk_gating.gate_hrtimer) == 1) && !(work_pending(&hba->clk_gating.gate_work)) && !hba->clk_gating.gate_wk_in_process) { hba->clk_gating.state = CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); Loading Loading @@ -2289,7 +2291,9 @@ static void ufshcd_gate_work(struct work_struct *work) clk_gating.gate_work); unsigned long flags; hba->clk_gating.gate_wk_in_process = true; spin_lock_irqsave(hba->host->host_lock, flags); if (hba->clk_gating.state == CLKS_OFF) goto rel_lock; /* Loading Loading @@ -2365,6 +2369,7 @@ static void ufshcd_gate_work(struct work_struct *work) rel_lock: spin_unlock_irqrestore(hba->host->host_lock, flags); out: hba->clk_gating.gate_wk_in_process = false; return; } Loading
drivers/scsi/ufs/ufshcd.h +1 −0 Original line number Diff line number Diff line Loading @@ -480,6 +480,7 @@ struct ufs_clk_gating { struct device_attribute delay_perf_attr; struct device_attribute enable_attr; bool is_enabled; bool gate_wk_in_process; int active_reqs; struct workqueue_struct *clk_gating_workq; }; Loading