#include <linux/of_device.h>
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
+#include <linux/pm_qos.h>
 #include <linux/regulator/consumer.h>
 #include <linux/reset.h>
 #include <linux/sched/clock.h>
        dev_info(hba->dev, "caps: 0x%x", host->caps);
 }
 
-static void ufs_mtk_scale_perf(struct ufs_hba *hba, bool up)
+static void ufs_mtk_boost_pm_qos(struct ufs_hba *hba, bool boost)
 {
        struct ufs_mtk_host *host = ufshcd_get_variant(hba);
 
-       ufs_mtk_boost_crypt(hba, up);
-       ufs_mtk_setup_ref_clk(hba, up);
+       if (!host || !host->pm_qos_init)
+               return;
+
+       cpu_latency_qos_update_request(&host->pm_qos_req,
+                                      boost ? 0 : PM_QOS_DEFAULT_VALUE);
+}
+
+static void ufs_mtk_pwr_ctrl(struct ufs_hba *hba, bool on)
+{
+       struct ufs_mtk_host *host = ufshcd_get_variant(hba);
 
-       if (up)
+       if (on) {
                phy_power_on(host->mphy);
-       else
+               ufs_mtk_setup_ref_clk(hba, on);
+               ufs_mtk_boost_crypt(hba, on);
+               ufs_mtk_boost_pm_qos(hba, on);
+       } else {
+               ufs_mtk_boost_pm_qos(hba, on);
+               ufs_mtk_boost_crypt(hba, on);
+               ufs_mtk_setup_ref_clk(hba, on);
                phy_power_off(host->mphy);
+       }
 }
 
 /**
                }
 
                if (clk_pwr_off)
-                       ufs_mtk_scale_perf(hba, false);
+                       ufs_mtk_pwr_ctrl(hba, false);
        } else if (on && status == POST_CHANGE) {
-               ufs_mtk_scale_perf(hba, true);
+               ufs_mtk_pwr_ctrl(hba, true);
        }
 
        return ret;
        struct ufs_dev_info *dev_info = &hba->dev_info;
        u16 mid = dev_info->wmanufacturerid;
 
-       if (mid == UFS_VENDOR_SAMSUNG)
+       if (mid == UFS_VENDOR_SAMSUNG) {
                ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 6);
+               ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HIBERN8TIME), 10);
+       }
 
        /*
         * Decide waiting time before gating reference clock and
 
 #define _UFS_MEDIATEK_H
 
 #include <linux/bitops.h>
+#include <linux/pm_qos.h>
 #include <linux/soc/mediatek/mtk_sip_svc.h>
 
 /*
 
 struct ufs_mtk_host {
        struct phy *mphy;
+       struct pm_qos_request pm_qos_req;
        struct regulator *reg_va09;
        struct reset_control *hci_reset;
        struct reset_control *unipro_reset;
        struct ufs_mtk_hw_ver hw_ver;
        enum ufs_mtk_host_caps caps;
        bool mphy_powered_on;
+       bool pm_qos_init;
        bool unipro_lpm;
        bool ref_clk_enabled;
        u16 ref_clk_ungating_wait_us;