rtc: tps80031: register as mfd sub device
[linux-2.6.git] / arch / arm / mach-tegra / dvfs.h
1 /*
2  *
3  * Copyright (C) 2010 Google, Inc.
4  *
5  * Author:
6  *      Colin Cross <ccross@google.com>
7  *
8  * Copyright (C) 2010-2012 NVIDIA CORPORATION. All rights reserved.
9  *
10  * This software is licensed under the terms of the GNU General Public
11  * License version 2, as published by the Free Software Foundation, and
12  * may be copied, distributed, and modified under those terms.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  */
20
21 #ifndef _TEGRA_DVFS_H_
22 #define _TEGRA_DVFS_H_
23
24 #define MAX_DVFS_FREQS  40
25 #define DVFS_RAIL_STATS_TOP_BIN 42
26
27 struct clk;
28 struct dvfs_rail;
29
30 /*
31  * dvfs_relationship between to rails, "from" and "to"
32  * when the rail changes, it will call dvfs_rail_update on the rails
33  * in the relationship_to list.
34  * when determining the voltage to set a rail to, it will consider each
35  * rail in the relationship_from list.
36  */
37 struct dvfs_relationship {
38         struct dvfs_rail *to;
39         struct dvfs_rail *from;
40         int (*solve)(struct dvfs_rail *, struct dvfs_rail *);
41
42         struct list_head to_node; /* node in relationship_to list */
43         struct list_head from_node; /* node in relationship_from list */
44         bool solved_at_nominal;
45 };
46
47 struct rail_stats {
48         ktime_t time_at_mv[DVFS_RAIL_STATS_TOP_BIN + 1];
49         ktime_t last_update;
50         int last_index;
51         bool off;
52 };
53
54 struct dvfs_rail {
55         const char *reg_id;
56         int min_millivolts;
57         int max_millivolts;
58         int nominal_millivolts;
59         int step;
60         bool jmp_to_zero;
61         bool disabled;
62         bool updating;
63         bool resolving_to;
64
65         struct list_head node;  /* node in dvfs_rail_list */
66         struct list_head dvfs;  /* list head of attached dvfs clocks */
67         struct list_head relationships_to;
68         struct list_head relationships_from;
69         struct regulator *reg;
70         int millivolts;
71         int new_millivolts;
72         bool suspended;
73         struct rail_stats stats;
74 };
75
76 struct dvfs {
77         /* Used only by tegra2_clock.c */
78         const char *clk_name;
79         int speedo_id;
80         int process_id;
81
82         /* Must be initialized before tegra_dvfs_init */
83         int freqs_mult;
84         unsigned long freqs[MAX_DVFS_FREQS];
85         unsigned long *alt_freqs;
86         const int *millivolts;
87         struct dvfs_rail *dvfs_rail;
88         bool auto_dvfs;
89
90         /* Filled in by tegra_dvfs_init */
91         int max_millivolts;
92         int num_freqs;
93
94         int cur_millivolts;
95         unsigned long cur_rate;
96         struct list_head node;
97         struct list_head debug_node;
98         struct list_head reg_node;
99 };
100
101 extern struct dvfs_rail *tegra_cpu_rail;
102
103 #ifdef CONFIG_TEGRA_SILICON_PLATFORM
104 void tegra_soc_init_dvfs(void);
105 int tegra_enable_dvfs_on_clk(struct clk *c, struct dvfs *d);
106 int dvfs_debugfs_init(struct dentry *clk_debugfs_root);
107 int tegra_dvfs_late_init(void);
108 int tegra_dvfs_init_rails(struct dvfs_rail *dvfs_rails[], int n);
109 void tegra_dvfs_add_relationships(struct dvfs_relationship *rels, int n);
110 void tegra_dvfs_rail_enable(struct dvfs_rail *rail);
111 void tegra_dvfs_rail_disable(struct dvfs_rail *rail);
112 bool tegra_dvfs_rail_updating(struct clk *clk);
113 void tegra_dvfs_rail_off(struct dvfs_rail *rail, ktime_t now);
114 void tegra_dvfs_rail_on(struct dvfs_rail *rail, ktime_t now);
115 void tegra_dvfs_rail_pause(struct dvfs_rail *rail, ktime_t delta, bool on);
116 struct dvfs_rail *tegra_dvfs_get_rail_by_name(const char *reg_id);
117 int tegra_dvfs_predict_millivolts(struct clk *c, unsigned long rate);
118 void tegra_dvfs_core_cap_enable(bool enable);
119 void tegra_dvfs_core_cap_level_set(int level);
120 int tegra_dvfs_alt_freqs_set(struct dvfs *d, unsigned long *alt_freqs);
121 int tegra_cpu_dvfs_alter(int edp_thermal_index, const cpumask_t *cpus,
122                          bool before_clk_update, int cpu_event);
123 #else
124 static inline void tegra_soc_init_dvfs(void)
125 {}
126 static inline int tegra_enable_dvfs_on_clk(struct clk *c, struct dvfs *d)
127 { return 0; }
128 static inline int dvfs_debugfs_init(struct dentry *clk_debugfs_root)
129 { return 0; }
130 static inline int tegra_dvfs_late_init(void)
131 { return 0; }
132 static inline int tegra_dvfs_init_rails(struct dvfs_rail *dvfs_rails[], int n)
133 { return 0; }
134 static inline void tegra_dvfs_add_relationships(struct dvfs_relationship *rels, int n)
135 {}
136 static inline void tegra_dvfs_rail_enable(struct dvfs_rail *rail)
137 {}
138 static inline void tegra_dvfs_rail_disable(struct dvfs_rail *rail)
139 {}
140 static inline bool tegra_dvfs_rail_updating(struct clk *clk)
141 { return false; }
142 static inline void tegra_dvfs_rail_off(struct dvfs_rail *rail, ktime_t now)
143 {}
144 static inline void tegra_dvfs_rail_on(struct dvfs_rail *rail, ktime_t now)
145 {}
146 static inline void tegra_dvfs_rail_pause(
147         struct dvfs_rail *rail, ktime_t delta, bool on)
148 {}
149 static inline struct dvfs_rail *tegra_dvfs_get_rail_by_name(const char *reg_id)
150 { return NULL; }
151 static inline int tegra_dvfs_predict_millivolts(struct clk *c, unsigned long rate)
152 { return 0; }
153 static inline void tegra_dvfs_core_cap_enable(bool enable)
154 {}
155 static inline void tegra_dvfs_core_cap_level_set(int level)
156 {}
157 static inline int tegra_dvfs_alt_freqs_set(struct dvfs *d,
158                                            unsigned long *alt_freqs)
159 { return 0; }
160 static inline int tegra_cpu_dvfs_alter(int edp_thermal_index,
161                  const cpumask_t *cpus, bool before_clk_update, int cpu_event)
162 {}
163 #endif
164
165 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
166 int tegra_dvfs_rail_disable_prepare(struct dvfs_rail *rail);
167 int tegra_dvfs_rail_post_enable(struct dvfs_rail *rail);
168 void tegra_dvfs_age_cpu(int cur_linear_age);
169 #else
170 static inline int tegra_dvfs_rail_disable_prepare(struct dvfs_rail *rail)
171 { return 0; }
172 static inline int tegra_dvfs_rail_post_enable(struct dvfs_rail *rail)
173 { return 0; }
174 static inline void tegra_dvfs_age_cpu(int cur_linear_age)
175 { return; }
176 #endif
177
178 #endif