if (!ufshcd_is_clkgating_allowed(hba))
                return;
 
+       hba->clk_gating.state = CLKS_ON;
+
        hba->clk_gating.delay_ms = 150;
        INIT_DELAYED_WORK(&hba->clk_gating.gate_work, ufshcd_gate_work);
        INIT_WORK(&hba->clk_gating.ungate_work, ufshcd_ungate_work);
                err = SCSI_MLQUEUE_HOST_BUSY;
                goto out;
        }
-       WARN_ON(hba->clk_gating.state != CLKS_ON);
+       WARN_ON(ufshcd_is_clkgating_allowed(hba) &&
+               (hba->clk_gating.state != CLKS_ON));
 
        lrbp = &hba->lrb[tag];
 
                /* If link is active, device ref_clk can't be switched off */
                __ufshcd_setup_clocks(hba, false, true);
 
-       hba->clk_gating.state = CLKS_OFF;
-       trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state);
+       if (ufshcd_is_clkgating_allowed(hba)) {
+               hba->clk_gating.state = CLKS_OFF;
+               trace_ufshcd_clk_gating(dev_name(hba->dev),
+                                       hba->clk_gating.state);
+       }
 
        /* Put the host controller in low power mode if possible */
        ufshcd_hba_vreg_set_lpm(hba);
        if (hba->clk_scaling.is_allowed)
                ufshcd_suspend_clkscaling(hba);
        ufshcd_setup_clocks(hba, false);
+       if (ufshcd_is_clkgating_allowed(hba)) {
+               hba->clk_gating.state = CLKS_OFF;
+               trace_ufshcd_clk_gating(dev_name(hba->dev),
+                                       hba->clk_gating.state);
+       }
 out:
        hba->pm_op_in_progress = 0;
        if (ret)