From 89f9b33591e498fb01851a531e60606329c58036 Mon Sep 17 00:00:00 2001 From: chenxing Date: Thu, 14 Jun 2012 18:34:45 +0800 Subject: [PATCH] rk30:sdk: add interface of dvfs frequency limit --- arch/arm/mach-rk30/dvfs.c | 43 ++++++++++++++++++++++++-- arch/arm/mach-rk30/include/mach/dvfs.h | 7 +++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rk30/dvfs.c b/arch/arm/mach-rk30/dvfs.c index 38932a63ca0f..180966847590 100644 --- a/arch/arm/mach-rk30/dvfs.c +++ b/arch/arm/mach-rk30/dvfs.c @@ -75,6 +75,28 @@ struct regulator* dvfs_get_regulator(char *regulator_name) return NULL; } +int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate) +{ + struct clk_node* dvfs_clk; + dvfs_clk = clk->dvfs_info; + + dvfs_clk->freq_limit_en = 1; + dvfs_clk->min_rate = min_rate; + dvfs_clk->max_rate = max_rate; + + return 0; +} + +int dvfs_clk_disable_limit(struct clk *clk) +{ + struct clk_node* dvfs_clk; + dvfs_clk = clk->dvfs_info; + + dvfs_clk->freq_limit_en = 0; + + return 0; +} + int is_support_dvfs(struct clk_node *dvfs_info) { return (dvfs_info->vd && dvfs_info->vd->vd_dvfs_target && dvfs_info->enable_dvfs); @@ -680,10 +702,18 @@ int dvfs_target_core(struct clk *clk, unsigned long rate_hz) return -1; } + /* Check limit rate */ + if (dvfs_clk->freq_limit_en) { + if (rate_hz < dvfs_clk->min_rate) { + rate_hz = dvfs_clk->min_rate; + } else if (rate_hz > dvfs_clk->max_rate) { + rate_hz = dvfs_clk->max_rate; + } + } + rate_new = rate_hz; rate_old = clk_get_rate(clk); - if(!is_suport_round_rate(clk)) - { + if(!is_suport_round_rate(clk)) { rate_new=clk_round_rate_nolock(clk, rate_hz); } if(rate_new==rate_old) @@ -818,6 +848,15 @@ int dvfs_target_cpu(struct clk *clk, unsigned long rate_hz) return -1; } + /* Check limit rate */ + if (dvfs_clk->freq_limit_en) { + if (rate_hz < dvfs_clk->min_rate) { + rate_hz = dvfs_clk->min_rate; + } else if (rate_hz > dvfs_clk->max_rate) { + rate_hz = dvfs_clk->max_rate; + } + } + /* need round rate */ rate_new = clk_round_rate_nolock(clk, rate_hz); DVFS_DBG("dvfs(%s) round rate (%lu)(rount %lu)\n", dvfs_clk->name, rate_hz, rate_new); diff --git a/arch/arm/mach-rk30/include/mach/dvfs.h b/arch/arm/mach-rk30/include/mach/dvfs.h index adfa7de4b362..3097c6af66b0 100755 --- a/arch/arm/mach-rk30/include/mach/dvfs.h +++ b/arch/arm/mach-rk30/include/mach/dvfs.h @@ -119,6 +119,9 @@ struct clk_node { int set_freq; //KHZ int set_volt; //MV int enable_dvfs; + int freq_limit_en; //sign if use limit frequency + unsigned int min_rate; //limit min frequency + unsigned int max_rate; //limit max frequency struct clk *clk; struct pds_list *pds; struct vd_node *vd; @@ -148,6 +151,8 @@ int dvfs_set_freq_volt_table(struct clk *clk, struct cpufreq_frequency_table *ta int dvfs_set_depend_table(struct clk *clk, char *vd_name, struct cpufreq_frequency_table *table); 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); struct regulator* dvfs_get_regulator(char *regulator_name); +int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate); +int dvfs_clk_disable_limit(struct clk *clk); #else static inline int rk30_dvfs_init(void) { return 0; } @@ -161,6 +166,8 @@ static inline int dvfs_set_freq_volt_table(struct clk *clk, struct cpufreq_frequ static inline int dvfs_set_depend_table(struct clk *clk, char *vd_name, struct cpufreq_frequency_table *table) {return 0;} 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; } static inline struct regulator* dvfs_get_regulator(char *regulator_name){ return NULL; } +static inline int dvfs_clk_enable_limit(struct clk *clk, unsigned int min_rate, unsigned max_rate){ return 0; } +static inline int dvfs_clk_disable_limit(struct clk *clk){ return 0; }; #endif #endif -- 2.34.1