* ufs_qcom_setup_clocks - enables/disable clocks
  * @hba: host controller instance
  * @on: If true, enable clocks else disable them.
+ * @status: PRE_CHANGE or POST_CHANGE notify
  *
  * Returns 0 on success, non-zero on failure.
  */
-static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on)
+static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,
+                                enum ufs_notify_change_status status)
 {
        struct ufs_qcom_host *host = ufshcd_get_variant(hba);
        int err;
        if (!host)
                return 0;
 
-       if (on) {
+       if (on && (status == POST_CHANGE)) {
                err = ufs_qcom_phy_enable_iface_clk(host->generic_phy);
                if (err)
                        goto out;
                if (vote == host->bus_vote.min_bw_vote)
                        ufs_qcom_update_bus_bw_vote(host);
 
-       } else {
+       } else if (!on && (status == PRE_CHANGE)) {
 
                /* M-PHY RMMI interface clocks can be turned off */
                ufs_qcom_phy_disable_iface_clk(host->generic_phy);
        ufs_qcom_set_caps(hba);
        ufs_qcom_advertise_quirks(hba);
 
-       ufs_qcom_setup_clocks(hba, true);
+       ufs_qcom_setup_clocks(hba, true, POST_CHANGE);
 
        if (hba->dev->id < MAX_UFS_QCOM_HOSTS)
                ufs_qcom_hosts[hba->dev->id] = host;
 
        if (!head || list_empty(head))
                goto out;
 
+       ret = ufshcd_vops_setup_clocks(hba, on, PRE_CHANGE);
+       if (ret)
+               return ret;
+
        list_for_each_entry(clki, head, list) {
                if (!IS_ERR_OR_NULL(clki->clk)) {
                        if (skip_ref_clk && !strcmp(clki->name, "ref_clk"))
                }
        }
 
-       ret = ufshcd_vops_setup_clocks(hba, on);
+       ret = ufshcd_vops_setup_clocks(hba, on, POST_CHANGE);
+       if (ret)
+               return ret;
+
 out:
        if (ret) {
                list_for_each_entry(clki, head, list) {
        if (!hba->vops)
                return;
 
-       ufshcd_vops_setup_clocks(hba, false);
-
        ufshcd_vops_setup_regulators(hba, false);
 
        ufshcd_vops_exit(hba);
        if (ret)
                goto set_link_active;
 
-       ret = ufshcd_vops_setup_clocks(hba, false);
-       if (ret)
-               goto vops_resume;
-
        if (!ufshcd_is_link_active(hba))
                ufshcd_setup_clocks(hba, false);
        else
        ufshcd_hba_vreg_set_lpm(hba);
        goto out;
 
-vops_resume:
-       ufshcd_vops_resume(hba, pm_op);
 set_link_active:
        ufshcd_vreg_set_hpm(hba);
        if (ufshcd_is_link_hibern8(hba) && !ufshcd_uic_hibern8_exit(hba))
 
        u32     (*get_ufs_hci_version)(struct ufs_hba *);
        int     (*clk_scale_notify)(struct ufs_hba *, bool,
                                    enum ufs_notify_change_status);
-       int     (*setup_clocks)(struct ufs_hba *, bool);
+       int     (*setup_clocks)(struct ufs_hba *, bool,
+                               enum ufs_notify_change_status);
        int     (*setup_regulators)(struct ufs_hba *, bool);
        int     (*hce_enable_notify)(struct ufs_hba *,
                                     enum ufs_notify_change_status);
        return 0;
 }
 
-static inline int ufshcd_vops_setup_clocks(struct ufs_hba *hba, bool on)
+static inline int ufshcd_vops_setup_clocks(struct ufs_hba *hba, bool on,
+                                       enum ufs_notify_change_status status)
 {
        if (hba->vops && hba->vops->setup_clocks)
-               return hba->vops->setup_clocks(hba, on);
+               return hba->vops->setup_clocks(hba, on, status);
        return 0;
 }