rk30:sdk: add interface of dvfs frequency limit
authorchenxing <chenxing@rock-chips.com>
Thu, 14 Jun 2012 10:34:45 +0000 (18:34 +0800)
committerchenxing <chenxing@rock-chips.com>
Thu, 14 Jun 2012 10:34:45 +0000 (18:34 +0800)
arch/arm/mach-rk30/dvfs.c
arch/arm/mach-rk30/include/mach/dvfs.h

index 38932a63ca0fd4ede0886eca56455703bc2ce3e5..180966847590e338153d8c467d5f11d550731a8a 100644 (file)
@@ -75,6 +75,28 @@ struct regulator* dvfs_get_regulator(char *regulator_name)
        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
@@ -680,10 +702,18 @@ int dvfs_target_core(struct clk *clk, unsigned long rate_hz)
                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
@@ -818,6 +848,15 @@ int dvfs_target_cpu(struct clk *clk, unsigned long rate_hz)
                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
index adfa7de4b36229345814151d818cc2c36c03f16f..3097c6af66b08d831330259730ce422a8b4f685c 100755 (executable)
@@ -119,6 +119,9 @@ struct clk_node {
        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
@@ -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);\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
@@ -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;}\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