rk30:sdk: add logic dynamic voltage scale
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk30 / include / mach / dvfs.h
index 67d79d8beaeef61c3a0cc64cb7b2988e65423d45..8f4ce715ede494d91510a19f45fa6cad4e19fd70 100755 (executable)
@@ -24,100 +24,134 @@ typedef int (*clk_dvfs_target_callback)(struct clk *clk, unsigned long rate,
 \r
 /**\r
  * struct vd_node:     To Store All Voltage Domains' info\r
- * @vd_name:   Voltage Domain's Name\r
- * @cur_volt:  Voltage Domain's Current Voltage\r
- * @vd_list:   Point of he Voltage Domain List Node\r
- * @pd_list:   Head of Power Domain List Belongs to This Voltage Domain\r
- * @vd_voltreq_list:   Head of Voltage Request List for Voltage Domain\r
+ * @name:              Voltage Domain's Name\r
+ * @regulator_name:    Voltage domain's regulator name\r
+ * @cur_volt:          Voltage Domain's Current Voltage\r
+ * @regulator:         Voltage Domain's regulator point\r
+ * @node:              Point of he Voltage Domain List Node\r
+ * @pd_list:           Head of Power Domain List Belongs to This Voltage Domain\r
+ * @req_volt_list:     The list of clocks requests\r
+ * @dvfs_mutex:                Lock\r
+ * @vd_dvfs_target:    Callback function       \r
  */\r
 \r
 struct vd_node {\r
-       char    *name;\r
-       char    *regulator_name;\r
-       int             cur_volt;\r
+       char                    *name;\r
+       char                    *regulator_name;\r
+       int                     cur_volt;\r
        struct regulator        *regulator;\r
-       struct mutex            dvfs_mutex;\r
        struct list_head        node;\r
        struct list_head        pd_list;\r
+       struct list_head        req_volt_list;\r
+       struct mutex            dvfs_mutex;\r
        vd_dvfs_target_callback vd_dvfs_target;\r
 };\r
-struct vd_node_lookup {\r
-       struct vd_node  *vd;\r
-       char                    *regulator_name;\r
-};\r
+\r
 /**\r
- * struct pd_node:     To Store All Power Domains' info per Voltage Domain\r
- * @pd_name:   Power Domain's Name\r
- * @cur_volt:  Power Domain's Current Voltage\r
- * @pd_list:   Point of the Power Domain List Node\r
- * @clk_list:  Head of Power Domain's Clocks List\r
- * @pd_status:         If The Power Domain On: 1 means on, 0 means off\r
+ * struct pd_node:     To Store All Power Domains' info\r
+ * @name:              Power Domain's Name\r
+ * @cur_volt:          Power Domain's Current Voltage\r
+ * @pd_status:         Power Domain's status\r
+ * @vd:                        Voltage Domain the power domain belongs to\r
+ * @pd_clk:            Look power domain as a clock\r
+ * @node:              List node to Voltage Domain\r
+ * @clk_list:          Head of Power Domain's Clocks List\r
  */\r
 struct pd_node {\r
-       char    *name;\r
-       int             cur_volt;\r
-       unsigned char   pd_status;\r
-       struct vd_node  *vd;\r
-       struct  clk             *pd_clk;\r
+       char                    *name;\r
+       int                     cur_volt;\r
+       unsigned char           pd_status;\r
+       struct vd_node          *vd;\r
+       //struct clk            *pd_clk;\r
        struct list_head        node;\r
        struct list_head        clk_list;\r
 };\r
 \r
 struct pd_node_lookup {\r
-       struct pd_nodepd;\r
+       struct pd_node          *pd;\r
 };\r
 \r
 struct clk_list{\r
-       struct clk_node *dvfs_clk;\r
-       struct list_head node;\r
+       struct clk_node         *dvfs_clk;\r
+       struct list_head        node;\r
 };\r
 \r
 struct pds_list {\r
-       struct clk_list clk_list;\r
-       struct pd_node *pd;\r
+       struct clk_list         clk_list;\r
+       struct pd_node          *pd;\r
+};\r
+\r
+struct depend_list {\r
+       int                     req_volt;\r
+       struct clk_node         *dvfs_clk;\r
+       struct vd_node          *dep_vd;\r
+       struct list_head        node2clk;\r
+       struct list_head        node2vd;\r
+       struct cpufreq_frequency_table  *dep_table;\r
+};\r
+\r
+struct depend_lookup {\r
+       char                    *clk_name;\r
+       struct clk_node         *dvfs_clk;\r
+       struct vd_node          *dep_vd;\r
+       struct depend_list      dep_list;\r
+       struct cpufreq_frequency_table  *dep_table;\r
 };\r
 \r
+/**\r
+ * struct clk_node:    To Store All dvfs clocks' info\r
+ * @name:              Dvfs clock's Name\r
+ * @set_freq:          Dvfs clock's Current Frequency\r
+ * @set_volt:          Dvfs clock's Current Voltage\r
+ * @enable_dvfs:       Sign if DVFS clock enable\r
+ * @clk:               System clk's point\r
+ * @pds:               Power Domains dvfs clock belongs to\r
+ * @vd:                        Voltage Domains dvfs clock belongs to\r
+ * @depend_list:       Dvfs Clock depend list\r
+ * @dvfs_nb:           Notify list\r
+ * @dvfs_table:                Frequency and voltage table for dvfs\r
+ * @clk_dvfs_target:   Callback function\r
+ */\r
 struct clk_node {\r
-       char    *name;\r
-       int             set_freq;//khz\r
-       int             set_volt;\r
-       int             enable_dvfs;\r
-       struct clk *ck;\r
+       char                    *name;\r
+       int                     set_freq;       //KHZ\r
+       int                     set_volt;       //MV\r
+       int                     enable_dvfs;\r
+       struct clk              *clk;\r
        struct pds_list         *pds;\r
        struct vd_node          *vd;\r
+       struct list_head        depend_list;\r
+       struct notifier_block   *dvfs_nb;\r
        struct cpufreq_frequency_table  *dvfs_table;\r
-       struct notifier_block *dvfs_nb;\r
-       struct list_head        node;\r
-       clk_dvfs_target_callback clk_dvfs_target;\r
+       clk_dvfs_target_callback        clk_dvfs_target;\r
 };\r
+struct dvfs_arm_table {\r
+       unsigned int    frequency; /* kHz - doesn't need to be in ascending\r
+                                   * order */\r
+       unsigned int    cpu_volt;     /* any */\r
 \r
+       unsigned int    logic_volt;\r
+};\r
 #ifdef CONFIG_DVFS\r
 int rk30_dvfs_init(void);\r
 int is_support_dvfs(struct clk_node *dvfs_info);\r
 int dvfs_set_rate(struct clk *clk, unsigned long rate);\r
 int clk_enable_dvfs(struct clk *clk);\r
 int clk_disable_dvfs(struct clk *clk);\r
-int cpufreq_dvfs_init(struct clk *ck, struct cpufreq_frequency_table **table, clk_dvfs_target_callback clk_dvfs_target);\r
 void dvfs_clk_register_set_rate_callback(struct clk *clk, clk_dvfs_target_callback clk_dvfs_target);\r
 struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct clk *clk);\r
 int dvfs_set_freq_volt_table(struct clk *clk, struct cpufreq_frequency_table *table);\r
-int rk30_dvfs_init(void);\r
+int dvfs_set_depend_table(struct clk *clk, char *vd_name, struct cpufreq_frequency_table *table);\r
 #else\r
-int rk30_dvfs_init(void){};\r
-int is_support_dvfs(struct clk_node *dvfs_info){};\r
-int dvfs_set_rate(struct clk *clk, unsigned long rate){};\r
-int clk_enable_dvfs(struct clk *clk){};\r
-int clk_disable_dvfs(struct clk *clk){};\r
-int cpufreq_dvfs_init(struct clk *ck, struct cpufreq_frequency_table **table, clk_dvfs_target_callback clk_dvfs_target){};\r
-void dvfs_clk_register_set_rate_callback(struct clk *clk, clk_dvfs_target_callback clk_dvfs_target){};\r
-struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct clk *clk){};\r
-int dvfs_set_freq_volt_table(struct clk *clk, struct cpufreq_frequency_table *table);\r
-int rk30_dvfs_init(void){};\r
-\r
-\r
-\r
-\r
+static inline int rk30_dvfs_init(void) { return 0; }\r
+static inline int is_support_dvfs(struct clk_node *dvfs_info) { return 0; }\r
+static inline int dvfs_set_rate(struct clk *clk, unsigned long rate) { return 0; }\r
+static inline int clk_enable_dvfs(struct clk *clk) { return 0; }\r
+static inline int clk_disable_dvfs(struct clk *clk) { return 0; }\r
+static inline void dvfs_clk_register_set_rate_callback(struct clk *clk, clk_dvfs_target_callback clk_dvfs_target) {}\r
+static inline struct cpufreq_frequency_table *dvfs_get_freq_volt_table(struct clk *clk) { return NULL; }\r
+static inline int dvfs_set_freq_volt_table(struct clk *clk, struct cpufreq_frequency_table *table) { return 0; }\r
+static inline int dvfs_set_depend_table(struct clk *clk, char *vd_name, struct cpufreq_frequency_table *table) {return 0;}\r
 #endif\r
 \r
-\r
 #endif\r