rockchip: dvfs: switch regulator mode dynamically as rate changes
[firefly-linux-kernel-4.4.55.git] / include / linux / rockchip / dvfs.h
index 297978cb5cb15a04688be542e3994f9fa797e415..163b9557592864d286924030cd961db154c16b68 100644 (file)
@@ -42,7 +42,7 @@ struct vd_node {
        const char              *name;
        const char              *regulator_name;
        int                     volt_time_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support
-       int                     mode_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support
+       int                     mode_flag;// =0 ,is no initing checking ,>0 ,support,<0 not support;
        int                     cur_volt;
        int                     volt_set_flag;
        int                     suspend_volt;
@@ -53,6 +53,7 @@ struct vd_node {
        dvfs_set_rate_callback  vd_dvfs_target;
        unsigned int            n_voltages;
        int volt_list[VD_VOL_LIST_CNT];
+       unsigned int            regu_mode;
 };
 
 /**
@@ -72,6 +73,7 @@ struct pd_node {
        struct vd_node          *vd;
        struct list_head        node;
        struct list_head        clk_list;
+       unsigned int            regu_mode;
 };
 
 /**
@@ -96,17 +98,21 @@ struct dvfs_node {
        int                     freq_limit_en;  //sign if use limit frequency
        unsigned int            min_rate;       //limit min frequency
        unsigned int            max_rate;       //limit max frequency
-       unsigned int            last_set_rate;
+       unsigned long           last_set_rate;
        unsigned int            temp_channel;
-       int                     temp;
+       unsigned long           temp_limit_rate;
        struct clk              *clk;
        struct pd_node          *pd;
        struct vd_node          *vd;
        struct list_head        node;
        struct notifier_block   *dvfs_nb;
        struct cpufreq_frequency_table  *dvfs_table;
-       struct cpufreq_frequency_table  *temp_limit_table;
+       struct cpufreq_frequency_table  *per_temp_limit_table;
+       struct cpufreq_frequency_table  *nor_temp_limit_table;
        clk_set_rate_callback   clk_dvfs_target;
+       struct cpufreq_frequency_table  *regu_mode_table;
+       int                     regu_mode_en;
+       unsigned int            regu_mode;
 };
 
 
@@ -154,6 +160,8 @@ struct avs_ctr_st {
 struct dvfs_node *clk_get_dvfs_node(char *clk_name);
 void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node);
 unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node);
+unsigned long dvfs_clk_get_last_set_rate(struct dvfs_node *clk_dvfs_node);
+unsigned long dvfs_clk_round_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
 int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate);
 int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node);
 void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node);
@@ -162,9 +170,11 @@ void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node);
 int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table);
 int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target);
 int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate);
+int dvfs_clk_get_limit(struct dvfs_node *clk_dvfs_node, unsigned int *min_rate, unsigned int *max_rate) ;
 int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node);
 int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node);
 int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node);
+void dvfs_disable_temp_limit(void);
 struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node);
 int rk_regist_vd(struct vd_node *vd);
 int rk_regist_pd(struct pd_node *pd);
@@ -177,6 +187,8 @@ int of_dvfs_init(void);
 static inline struct dvfs_node *clk_get_dvfs_node(char *clk_name){ return NULL; };
 static inline void clk_put_dvfs_node(struct dvfs_node *clk_dvfs_node){ return; };
 static inline unsigned long dvfs_clk_get_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
+static inline unsigned long dvfs_clk_get_last_set_rate(struct dvfs_node *clk_dvfs_node){ return 0; };
+static inline unsigned long dvfs_clk_round_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate) { return 0; };
 static inline int dvfs_clk_set_rate(struct dvfs_node *clk_dvfs_node, unsigned long rate){ return 0; };
 static inline int dvfs_clk_enable(struct dvfs_node *clk_dvfs_node){ return 0; };
 static inline void dvfs_clk_disable(struct dvfs_node *clk_dvfs_node){ };
@@ -185,9 +197,11 @@ static inline void dvfs_clk_disable_unprepare(struct dvfs_node *clk_dvfs_node){
 static inline int dvfs_set_freq_volt_table(struct dvfs_node *clk_dvfs_node, struct cpufreq_frequency_table *table){ return 0; };
 static inline int dvfs_clk_register_set_rate_callback(struct dvfs_node *clk_dvfs_node, clk_set_rate_callback clk_dvfs_target){ return 0; };
 static inline int dvfs_clk_enable_limit(struct dvfs_node *clk_dvfs_node, unsigned int min_rate, unsigned max_rate){ return 0; };
+static inline int dvfs_clk_get_limit(struct dvfs_node *clk_dvfs_node, unsigned int *min_rate, unsigned int *max_rate) { return 0; };
 static inline int dvfs_clk_disable_limit(struct dvfs_node *clk_dvfs_node){ return 0; };
 static inline int clk_disable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
 static inline int clk_enable_dvfs(struct dvfs_node *clk_dvfs_node){ return 0; };
+static inline void dvfs_disable_temp_limit(void) {};
 static inline struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct dvfs_node *clk_dvfs_node){ return NULL; };
 static inline int rk_regist_vd(struct vd_node *vd){ return 0; };
 static inline int rk_regist_pd(struct pd_node *pd){ return 0; };