if (list_empty(head))
                goto out;
 
-       ret = ufshcd_vops_setup_clocks(hba, on, PRE_CHANGE);
-       if (ret)
-               return ret;
+       /*
+        * vendor specific setup_clocks ops may depend on clocks managed by
+        * this standard driver hence call the vendor specific setup_clocks
+        * before disabling the clocks managed here.
+        */
+       if (!on) {
+               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)) {
                }
        }
 
-       ret = ufshcd_vops_setup_clocks(hba, on, POST_CHANGE);
-       if (ret)
-               return ret;
+       /*
+        * vendor specific setup_clocks ops may depend on clocks managed by
+        * this standard driver hence call the vendor specific setup_clocks
+        * after enabling the clocks managed here.
+        */
+       if (on) {
+               ret = ufshcd_vops_setup_clocks(hba, on, POST_CHANGE);
+               if (ret)
+                       return ret;
+       }
 
 out:
        if (ret) {