struct list_head list_head;
        int intermediate_voltage;
        bool need_voltage_tracking;
+       int pre_vproc;
 };
 
 static LIST_HEAD(dvfs_info_list);
 
 static int mtk_cpufreq_set_voltage(struct mtk_cpu_dvfs_info *info, int vproc)
 {
+       int ret;
+
        if (info->need_voltage_tracking)
-               return mtk_cpufreq_voltage_tracking(info, vproc);
+               ret = mtk_cpufreq_voltage_tracking(info, vproc);
        else
-               return regulator_set_voltage(info->proc_reg, vproc,
-                                            vproc + VOLT_TOL);
+               ret = regulator_set_voltage(info->proc_reg, vproc,
+                                           MAX_VOLT_LIMIT);
+       if (!ret)
+               info->pre_vproc = vproc;
+
+       return ret;
 }
 
 static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
        inter_vproc = info->intermediate_voltage;
 
        pre_freq_hz = clk_get_rate(cpu_clk);
-       pre_vproc = regulator_get_voltage(info->proc_reg);
+
+       if (unlikely(info->pre_vproc <= 0))
+               pre_vproc = regulator_get_voltage(info->proc_reg);
+       else
+               pre_vproc = info->pre_vproc;
+
        if (pre_vproc < 0) {
                dev_err(cpu_dev, "invalid Vproc value: %d\n", pre_vproc);
                return pre_vproc;