goto out_free_resources;
        }
 
+       ret = regulator_enable(info->proc_reg);
+       if (ret) {
+               dev_warn(cpu_dev, "cpu%d: failed to enable vproc\n", cpu);
+               goto out_free_resources;
+       }
+
        /* Both presence and absence of sram regulator are valid cases. */
        info->sram_reg = regulator_get_exclusive(cpu_dev, "sram");
        if (IS_ERR(info->sram_reg))
                info->sram_reg = NULL;
+       else {
+               ret = regulator_enable(info->sram_reg);
+               if (ret) {
+                       dev_warn(cpu_dev, "cpu%d: failed to enable vsram\n", cpu);
+                       goto out_free_resources;
+               }
+       }
 
        /* Get OPP-sharing information from "operating-points-v2" bindings */
        ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, &info->cpus);
                goto out_free_resources;
        }
 
+       ret = clk_prepare_enable(info->cpu_clk);
+       if (ret)
+               goto out_free_opp_table;
+
+       ret = clk_prepare_enable(info->inter_clk);
+       if (ret)
+               goto out_disable_mux_clock;
+
        /* Search a safe voltage for intermediate frequency. */
        rate = clk_get_rate(info->inter_clk);
        opp = dev_pm_opp_find_freq_ceil(cpu_dev, &rate);
        if (IS_ERR(opp)) {
                dev_err(cpu_dev, "cpu%d: failed to get intermediate opp\n", cpu);
                ret = PTR_ERR(opp);
-               goto out_free_opp_table;
+               goto out_disable_inter_clock;
        }
        info->intermediate_voltage = dev_pm_opp_get_voltage(opp);
        dev_pm_opp_put(opp);
 
        return 0;
 
+out_disable_inter_clock:
+       clk_disable_unprepare(info->inter_clk);
+
+out_disable_mux_clock:
+       clk_disable_unprepare(info->cpu_clk);
+
 out_free_opp_table:
        dev_pm_opp_of_cpumask_remove_table(&info->cpus);
 
 out_free_resources:
+       if (regulator_is_enabled(info->proc_reg))
+               regulator_disable(info->proc_reg);
+       if (info->sram_reg && regulator_is_enabled(info->sram_reg))
+               regulator_disable(info->sram_reg);
+
        if (!IS_ERR(info->proc_reg))
                regulator_put(info->proc_reg);
        if (!IS_ERR(info->sram_reg))
 
 static void mtk_cpu_dvfs_info_release(struct mtk_cpu_dvfs_info *info)
 {
-       if (!IS_ERR(info->proc_reg))
+       if (!IS_ERR(info->proc_reg)) {
+               regulator_disable(info->proc_reg);
                regulator_put(info->proc_reg);
-       if (!IS_ERR(info->sram_reg))
+       }
+       if (!IS_ERR(info->sram_reg)) {
+               regulator_disable(info->sram_reg);
                regulator_put(info->sram_reg);
-       if (!IS_ERR(info->cpu_clk))
+       }
+       if (!IS_ERR(info->cpu_clk)) {
+               clk_disable_unprepare(info->cpu_clk);
                clk_put(info->cpu_clk);
-       if (!IS_ERR(info->inter_clk))
+       }
+       if (!IS_ERR(info->inter_clk)) {
+               clk_disable_unprepare(info->inter_clk);
                clk_put(info->inter_clk);
+       }
 
        dev_pm_opp_of_cpumask_remove_table(&info->cpus);
 }