int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate)\r
{\r
struct clk_node *dvfs_clk;\r
- u32 rate = 0;\r
- dvfs_clk = clk->dvfs_info;\r
+ u32 rate = 0, ret = 0;\r
+ dvfs_clk = clk_get_dvfs_info(clk);\r
+ if (IS_ERR_OR_NULL(dvfs_clk)) {\r
+ DVFS_ERR("%s: can not get dvfs clk(%s)\n", __func__, clk->name);\r
+ return -1;\r
+\r
+ }\r
\r
- dvfs_clk->freq_limit_en = 1;\r
- dvfs_clk->min_rate = min_rate;\r
- dvfs_clk->max_rate = max_rate;\r
+ if (dvfs_clk->vd && dvfs_clk->vd->vd_dvfs_target){\r
+ mutex_lock(&rk_dvfs_mutex);\r
+\r
+ dvfs_clk->freq_limit_en = 1;\r
+ dvfs_clk->min_rate = min_rate;\r
+ dvfs_clk->max_rate = max_rate;\r
+ rate = clk_get_rate(clk);\r
+ ret = dvfs_clk->vd->vd_dvfs_target(clk, rate);\r
+ clk->last_set_rate = rate;\r
+\r
+ mutex_unlock(&rk_dvfs_mutex);\r
+ }\r
\r
- rate = clk_get_rate(clk);\r
- if (rate < min_rate)\r
- dvfs_clk_set_rate(clk, min_rate);\r
- else if (rate > max_rate)\r
- dvfs_clk_set_rate(clk, max_rate);\r
+ DVFS_DBG("%s: clk(%s) last_set_rate=%d; [min_rate, max_rate]=[%d, %d]\n",\r
+ __func__, clk->name, clk->last_set_rate, dvfs_clk->min_rate, dvfs_clk->max_rate);\r
return 0;\r
}\r
\r
int dvfs_clk_disable_limit(struct clk *clk)\r
{\r
struct clk_node *dvfs_clk;\r
- dvfs_clk = clk->dvfs_info;\r
+ u32 ret = 0;\r
+ dvfs_clk = clk_get_dvfs_info(clk);\r
+ if (IS_ERR_OR_NULL(dvfs_clk)) {\r
+ DVFS_ERR("%s: can not get dvfs clk(%s)\n", __func__, clk->name);\r
+ return -1;\r
\r
- dvfs_clk->freq_limit_en = 0;\r
+ }\r
+\r
+ if (dvfs_clk->vd && dvfs_clk->vd->vd_dvfs_target){\r
+ mutex_lock(&rk_dvfs_mutex);\r
+ /* To reset dvfs_clk->min_rate/max_rate */\r
+ dvfs_set_freq_volt_table(clk, dvfs_clk->dvfs_table);\r
\r
+ dvfs_clk->freq_limit_en = 0;\r
+ ret = dvfs_clk->vd->vd_dvfs_target(clk, clk->last_set_rate);\r
+\r
+ mutex_unlock(&rk_dvfs_mutex);\r
+ }\r
+\r
+ DVFS_DBG("%s: clk(%s) last_set_rate=%d; [min_rate, max_rate]=[%d, %d]\n",\r
+ __func__, clk->name, clk->last_set_rate, dvfs_clk->min_rate, dvfs_clk->max_rate);\r
return 0;\r
}\r
\r
{\r
info->min_rate=0; \r
info->max_rate=0; \r
+ mutex_unlock(&mutex);\r
return -1;\r
}\r
\r
\r
list_for_each_entry(child, &pd->clk_list, node) {\r
dvfs_clk = child->dvfs_clk;\r
- printk( "| | |\n| | |- clock: %s current: rate %d, volt = %d, enable_dvfs = %s\n",\r
+ printk( "| | |\n| | |- clock: %s current: rate %d, volt = %d,"\r
+ " enable_dvfs = %s\n",\r
dvfs_clk->name, dvfs_clk->set_freq, dvfs_clk->set_volt,\r
dvfs_clk->enable_dvfs == 0 ? "DISABLE" : "ENABLE");\r
+ printk( "| | |- clk limit:[%d, %d]; last set rate = %lu\n",\r
+ dvfs_clk->min_rate, dvfs_clk->max_rate,\r
+ dvfs_clk->clk->last_set_rate);\r
+\r
for (i = 0; dvfs_clk->pds[i].pd != NULL; i++) {\r
clkparent = dvfs_clk->pds[i].pd;\r
printk( "| | | |- clock parents: %s, vd_parent = %s\n",\r