goto out;
                }
 
+               /* enable the device ref clock before changing to HS mode */
+               if (!ufshcd_is_hs_mode(&hba->pwr_info) &&
+                       ufshcd_is_hs_mode(dev_req_params))
+                       ufs_qcom_dev_ref_clk_ctrl(host, true);
                break;
        case POST_CHANGE:
                if (ufs_qcom_cfg_timers(hba, dev_req_params->gear_rx,
                memcpy(&host->dev_req_params,
                                dev_req_params, sizeof(*dev_req_params));
                ufs_qcom_update_bus_bw_vote(host);
+
+               /* disable the device ref clock if entered PWM mode */
+               if (ufshcd_is_hs_mode(&hba->pwr_info) &&
+                       !ufshcd_is_hs_mode(dev_req_params))
+                       ufs_qcom_dev_ref_clk_ctrl(host, false);
                break;
        default:
                ret = -EINVAL;
                        ufs_qcom_phy_disable_iface_clk(host->generic_phy);
                        goto out;
                }
+               /* enable the device ref clock for HS mode*/
+               if (ufshcd_is_hs_mode(&hba->pwr_info))
+                       ufs_qcom_dev_ref_clk_ctrl(host, true);
                vote = host->bus_vote.saved_vote;
                if (vote == host->bus_vote.min_bw_vote)
                        ufs_qcom_update_bus_bw_vote(host);
 
 #include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/regulator/consumer.h>
+#include "unipro.h"
 
 #include <asm/irq.h>
 #include <asm/byteorder.h>
 
 int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size);
 
+static inline bool ufshcd_is_hs_mode(struct ufs_pa_layer_attr *pwr_info)
+{
+       return (pwr_info->pwr_rx == FAST_MODE ||
+               pwr_info->pwr_rx == FASTAUTO_MODE) &&
+               (pwr_info->pwr_tx == FAST_MODE ||
+               pwr_info->pwr_tx == FASTAUTO_MODE);
+}
+
 #define ASCII_STD true
 
 int ufshcd_read_string_desc(struct ufs_hba *hba, int desc_index, u8 *buf,