- struct regulator *vdd_core;\r
- int ret = 0;\r
- DVFS_DBG("first jump %d\n", JUMP_RATE);\r
- vdd_core = dvfs_regulator_get(NULL, "vdd_core");\r
- ret = dvfs_regulator_set_voltage(vdd_core, DVFS_LOGIC_VOLT_L, DVFS_LOGIC_VOLT_L);\r
- //udelay(200);\r
- DVFS_DBG("DVFS <= 816M\n");\r
- if (ret != 0) {\r
- DVFS_ERR("%s err, ret = %d\n", __func__, ret);\r
- return -1;\r
+ struct depend_list *depend;\r
+ struct cpufreq_frequency_table clk_fv;\r
+ int ret = -1;\r
+ int volt = 0;\r
+ struct regulator *regulator;\r
+\r
+ if (rate_old <= rate_new) \r
+ return 0;\r
+ list_for_each_entry(depend, &dvfs_clk->depend_list, node2clk) {\r
+ ret = dvfs_clk_get_ref_volt_depend(depend, rate_new / 1000, &clk_fv);\r
+ if (ret != 0) {\r
+ DVFS_ERR("%s LOGIC DVFS CAN NOT GET REF VOLT!, frequency too large!\n", __func__);\r
+ return -1;\r
+ }\r
+\r
+ if (!depend->dep_vd->regulator) {\r
+ DVFS_LOG("%s regulator empty\n", __func__);\r
+ regulator = dvfs_regulator_get(NULL, depend->dep_vd->regulator_name);\r
+ if (!regulator) {\r
+ DVFS_ERR("%s get regulator err\n", __func__);\r
+ return -1;\r
+ }\r
+\r
+ depend->dep_vd->regulator = regulator;\r
+ }\r
+ if (!depend->dep_vd->regulator) {\r
+ DVFS_ERR("%s vd's(%s) regulator empty\n", __func__, depend->dep_vd->name);\r
+ return -1;\r
+ }\r
+\r
+ if (clk_fv.index == dvfs_regulator_get_voltage(depend->dep_vd->regulator)) {\r
+ depend->req_volt = clk_fv.index;\r
+ DVFS_LOG("%s same voltage\n", __func__);\r
+ return 0;\r
+ }\r
+\r
+ depend->req_volt = clk_fv.index;\r
+ volt = dvfs_vd_get_newvolt_bypd(depend->dep_vd);\r
+ DVFS_LOG("%s setting voltage = %d\n", __func__, volt);\r
+ ret = dvfs_regulator_set_voltage(depend->dep_vd->regulator, volt, volt);\r
+ if (0 != ret) {\r
+ DVFS_ERR("%s set voltage = %d ERROR, ret = %d\n", __func__, volt, ret);\r
+ return -1;\r
+ }\r
+ udelay(200);\r
+ DVFS_LOG("%s set voltage = %d OK, ret = %d\n", __func__, volt, ret);\r
+ if (ret != 0) {\r
+ DVFS_ERR("%s err, ret = %d\n", __func__, ret);\r
+ return -1;\r
+ }\r