return NULL;\r
}\r
\r
+int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate)\r
+{\r
+ struct clk_node* dvfs_clk;\r
+ dvfs_clk = clk->dvfs_info;\r
+\r
+ dvfs_clk->freq_limit_en = 1;\r
+ dvfs_clk->min_rate = min_rate;\r
+ dvfs_clk->max_rate = max_rate;\r
+ \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
+ \r
+ dvfs_clk->freq_limit_en = 0;\r
+ \r
+ return 0;\r
+}\r
+\r
int is_support_dvfs(struct clk_node *dvfs_info)\r
{\r
return (dvfs_info->vd && dvfs_info->vd->vd_dvfs_target && dvfs_info->enable_dvfs);\r
return -1;\r
}\r
\r
+ /* Check limit rate */\r
+ if (dvfs_clk->freq_limit_en) {\r
+ if (rate_hz < dvfs_clk->min_rate) {\r
+ rate_hz = dvfs_clk->min_rate;\r
+ } else if (rate_hz > dvfs_clk->max_rate) {\r
+ rate_hz = dvfs_clk->max_rate;\r
+ }\r
+ }\r
+ \r
rate_new = rate_hz;\r
rate_old = clk_get_rate(clk);\r
- if(!is_suport_round_rate(clk))\r
- {\r
+ if(!is_suport_round_rate(clk)) {\r
rate_new=clk_round_rate_nolock(clk, rate_hz);\r
}\r
if(rate_new==rate_old)\r
return -1;\r
}\r
\r
+ /* Check limit rate */\r
+ if (dvfs_clk->freq_limit_en) {\r
+ if (rate_hz < dvfs_clk->min_rate) {\r
+ rate_hz = dvfs_clk->min_rate;\r
+ } else if (rate_hz > dvfs_clk->max_rate) {\r
+ rate_hz = dvfs_clk->max_rate;\r
+ }\r
+ }\r
+ \r
/* need round rate */\r
rate_new = clk_round_rate_nolock(clk, rate_hz);\r
DVFS_DBG("dvfs(%s) round rate (%lu)(rount %lu)\n", dvfs_clk->name, rate_hz, rate_new);\r
int set_freq; //KHZ\r
int set_volt; //MV\r
int enable_dvfs;\r
+ int freq_limit_en; //sign if use limit frequency\r
+ unsigned int min_rate; //limit min frequency\r
+ unsigned int max_rate; //limit max frequency\r
struct clk *clk;\r
struct pds_list *pds;\r
struct vd_node *vd;\r
int dvfs_set_depend_table(struct clk *clk, char *vd_name, struct cpufreq_frequency_table *table);\r
int dvfs_set_arm_logic_volt(struct dvfs_arm_table *dvfs_cpu_logic_table, struct cpufreq_frequency_table *cpu_dvfs_table, struct cpufreq_frequency_table *dep_cpu2core_table);\r
struct regulator* dvfs_get_regulator(char *regulator_name);\r
+int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate);\r
+int dvfs_clk_disable_limit(struct clk *clk);\r
\r
#else\r
static inline int rk30_dvfs_init(void) { return 0; }\r
static inline int dvfs_set_depend_table(struct clk *clk, char *vd_name, struct cpufreq_frequency_table *table) {return 0;}\r
static inline int dvfs_set_arm_logic_volt(struct dvfs_arm_table *dvfs_cpu_logic_table, struct cpufreq_frequency_table *cpu_dvfs_table, struct cpufreq_frequency_table *dep_cpu2core_table){ return 0; }\r
static inline struct regulator* dvfs_get_regulator(char *regulator_name){ return NULL; }\r
+static inline int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate){ return 0; }\r
+static inline int dvfs_clk_disable_limit(struct clk *clk){ return 0; };\r
#endif\r
\r
#endif\r