ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / include / mach / edp.h
1 /*
2  * arch/arm/mach-tegra/include/mach/edp.h
3  *
4  * Copyright (c) 2011-2013, NVIDIA CORPORATION. All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifndef __MACH_EDP_H
20 #define __MACH_EDP_H
21
22 #include <linux/debugfs.h>
23 #include <linux/edp.h>
24 #include <linux/thermal.h>
25 #include <linux/platform_data/tegra_edp.h>
26 #include <linux/platform_data/thermal_sensors.h>
27
28 struct tegra_edp_vdd_cpu_entry {
29         char speedo_id;
30         char regulator_100mA;
31         char temperature;
32         char freq_limits[4];
33 };
34
35 struct tegra_edp_limits {
36         int temperature;
37         unsigned int freq_limits[4];
38 };
39
40 struct tegra_edp_gpu_limits {
41         int temperature;
42         unsigned int freq_limits;
43 };
44
45 struct tegra_edp_voltage_temp_constraint {
46         int temperature;
47         unsigned int voltage_limit_mV;
48 };
49
50 struct tegra_edp_maximum_current_constraint {
51         unsigned int max_cur;
52         unsigned int max_temp;
53         unsigned int max_freq[4]; /* KHz */
54 };
55
56 struct tegra_edp_cpu_leakage_params {
57         int cpu_speedo_id;
58
59         unsigned int temp_scaled; /* 1x for T114, 10x for T148 */
60
61         unsigned int dyn_scaled;
62         int dyn_consts_n[4];     /* pre-multiplied by 'scaled */
63
64         unsigned int consts_scaled;
65         int leakage_consts_n[4];         /* pre-multiplied by 'scaled */
66
67         unsigned int ijk_scaled;
68         int leakage_consts_ijk[4][4][4]; /* pre-multiplied by 'scaled */
69         unsigned int leakage_min;        /* minimum leakage current */
70
71         unsigned int safety_cap[4];
72         struct tegra_edp_maximum_current_constraint max_current_cap[9];
73         struct tegra_edp_voltage_temp_constraint volt_temp_cap;
74 };
75
76 struct tegra_edp_gpu_leakage_params {
77         unsigned int temp_scaled;
78
79         unsigned int dyn_scaled;
80         int dyn_consts_n;        /* pre-multiplied by 'scaled */
81
82         unsigned int consts_scaled;
83         int leakage_consts_n;    /* pre-multiplied by 'scaled */
84
85         unsigned int ijk_scaled;
86         int leakage_consts_ijk[4][4][4]; /* pre-multiplied by 'scaled */
87         unsigned int leakage_min;        /* minimum leakage current */
88
89 };
90
91 struct tegra_edp_freq_voltage_table {
92         unsigned int freq;
93         int voltage_mV;
94 };
95
96 enum tegra_core_edp_profiles {
97         CORE_EDP_PROFILE_FAVOR_EMC = 0,
98         CORE_EDP_PROFILE_BALANCED,
99         CORE_EDP_PROFILE_FAVOR_GPU,
100
101         CORE_EDP_PROFILES_NUM,
102 };
103
104 struct tegra_core_edp_limits {
105         int sku;
106         struct clk **cap_clocks;
107         int cap_clocks_num;
108         int *temperatures;
109         int temperature_ranges;
110         int core_modules_states;
111         unsigned long *cap_rates_scpu_on;
112         unsigned long *cap_rates_scpu_off;
113 };
114
115 #ifdef CONFIG_TEGRA_EDP_LIMITS
116 struct thermal_cooling_device *edp_cooling_device_create(void *v);
117 void tegra_init_cpu_edp_limits(unsigned int regulator_mA);
118 void tegra_recalculate_cpu_edp_limits(void);
119 void tegra_get_cpu_edp_limits(const struct tegra_edp_limits **limits,
120                               int *size);
121 unsigned int tegra_get_edp_limit(int *get_edp_thermal_index);
122 void tegra_init_cpu_reg_mode_limits(unsigned int regulator_mA,
123                                     unsigned int mode);
124 void tegra_get_cpu_reg_mode_limits(const struct tegra_edp_limits **limits,
125                                    int *size, unsigned int mode);
126 void tegra_get_system_edp_limits(const unsigned int **limits);
127 int tegra_system_edp_alarm(bool alarm);
128 void tegra_platform_edp_init(struct thermal_trip_info *trips,
129                                         int *num_trips, int margin);
130 struct tegra_system_edp_entry *tegra_get_system_edp_entries(int *size);
131 unsigned int tegra_edp_find_maxf(int volt);
132 #else
133 static inline struct thermal_cooling_device *edp_cooling_device_create(
134         int index)
135 { return NULL; }
136 static inline void tegra_init_cpu_edp_limits(int regulator_mA)
137 {}
138 static inline void tegra_recalculate_cpu_edp_limits(void)
139 {}
140 static inline void tegra_get_cpu_edp_limits(struct tegra_edp_limits **limits,
141                                             int *size)
142 {}
143 static inline void tegra_init_cpu_reg_mode_limits(unsigned int regulator_mA,
144                                                   unsigned int mode)
145 {}
146 static inline void tegra_get_cpu_reg_mode_limits(
147         const struct tegra_edp_limits **limits, int *size, unsigned int mode)
148 {}
149 static inline unsigned int tegra_get_edp_limit(int *get_edp_thermal_index)
150 { return -1; }
151 static inline void tegra_get_system_edp_limits(unsigned int **limits)
152 {}
153 static inline int tegra_system_edp_alarm(bool alarm)
154 { return -1; }
155 static inline void tegra_platform_edp_init(struct thermal_trip_info *trips,
156                                            int *num_trips, int margin)
157 {}
158 static inline struct tegra_system_edp_entry
159                 *tegra_get_system_edp_entries(int *size) { return NULL; }
160 static inline unsigned int tegra_edp_find_maxf(int volt)
161 { return -1; }
162 #endif
163
164 #ifdef CONFIG_TEGRA_CORE_EDP_LIMITS
165 void tegra_init_core_edp_limits(unsigned int regulator_mA);
166 int tegra_core_edp_debugfs_init(struct dentry *edp_dir);
167 int tegra_core_edp_cpu_state_update(bool scpu_state);
168 struct tegra_cooling_device *tegra_core_edp_get_cdev(void);
169 #else
170 static inline void tegra_init_core_edp_limits(unsigned int regulator_mA)
171 {}
172 static inline int tegra_core_edp_debugfs_init(struct dentry *edp_dir)
173 { return 0; }
174 static inline int tegra_core_edp_cpu_state_update(bool scpu_state)
175 { return 0; }
176 static inline struct tegra_cooling_device *tegra_core_edp_get_cdev(void)
177 { return NULL; }
178 #endif
179
180 #ifdef CONFIG_TEGRA_GPU_EDP
181 void tegra_init_gpu_edp_limits(unsigned int regulator_mA);
182 void tegra_platform_gpu_edp_init(struct thermal_trip_info *trips,
183                                         int *num_trips, int margin);
184 struct tegra_edp_gpu_leakage_params *tegra12x_get_gpu_leakage_params(void);
185 #else
186 static inline void tegra_platform_gpu_edp_init(struct thermal_trip_info *trips,
187                                         int *num_trips, int margin)
188 {}
189 static inline void tegra_init_gpu_edp_limits(unsigned int regulator_mA)
190 {}
191 static inline struct tegra_edp_gpu_leakage_params
192                                         *tegra12x_get_gpu_leakage_params(void)
193 { return NULL; }
194 #endif
195
196
197 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
198 static inline void tegra_edp_throttle_cpu_now(u8 factor)
199 {}
200 #else
201 void tegra_edp_throttle_cpu_now(u8 factor);
202 #endif
203
204 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
205 struct tegra_edp_vdd_cpu_entry *tegra3x_get_vdd_cpu_map(int *sz);
206 struct tegra_system_edp_entry *tegra3x_get_system_edp_map(int *sz);
207 #else
208 static inline struct tegra_edp_vdd_cpu_entry *tegra3x_get_vdd_cpu_map(int *sz)
209 { return NULL; }
210 static inline struct tegra_system_edp_entry *tegra3x_get_system_edp_map(int *sz)
211 { return NULL; }
212 #endif
213
214 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
215 int tegra11x_select_core_edp_table(unsigned int regulator_mA,
216                                    struct tegra_core_edp_limits *limits);
217 struct tegra_edp_cpu_leakage_params *tegra11x_get_leakage_params(int index,
218                                                         unsigned int *sz);
219 #else
220 static inline int tegra11x_select_core_edp_table(
221         unsigned int regulator_mA, struct tegra_core_edp_limits *limits)
222 { return -ENOSYS; }
223 static inline struct tegra_edp_cpu_leakage_params *tegra11x_get_leakage_params
224 (int index, unsigned int *sz) { return NULL; }
225 #endif
226
227 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
228 int tegra14x_select_core_edp_table(unsigned int regulator_mA,
229                                    struct tegra_core_edp_limits *limits);
230 struct tegra_edp_cpu_leakage_params *tegra14x_get_leakage_params(int index,
231                                                         unsigned int *sz);
232 #else
233 static inline int tegra14x_select_core_edp_table(
234         unsigned int regulator_mA, struct tegra_core_edp_limits *limits)
235 { return -ENOSYS; }
236 static inline struct tegra_edp_cpu_leakage_params *tegra14x_get_leakage_params
237 (int index, unsigned int *sz) { return NULL; }
238 #endif
239
240 #ifdef CONFIG_ARCH_TEGRA_12x_SOC
241 struct tegra_edp_cpu_leakage_params *tegra12x_get_leakage_params(int index,
242                                                         unsigned int *sz);
243 #else
244 static inline struct tegra_edp_cpu_leakage_params *tegra12x_get_leakage_params
245 (int index, unsigned int *sz) { return NULL; }
246 #endif
247
248 #ifdef CONFIG_ARCH_TEGRA_12x_SOC
249 #define td580d_sysedp_corecap_sz        29
250 #define td570d_sysedp_corecap_sz        29
251 #define td575d_sysedp_corecap_sz        29
252 #define cd570m_sysedp_corecap_sz        29
253 extern struct tegra_sysedp_corecap td580d_sysedp_corecap[td580d_sysedp_corecap_sz];
254 extern struct tegra_sysedp_corecap td570d_sysedp_corecap[td570d_sysedp_corecap_sz];
255 extern struct tegra_sysedp_corecap td575d_sysedp_corecap[td575d_sysedp_corecap_sz];
256 extern struct tegra_sysedp_corecap cd570m_sysedp_corecap[cd570m_sysedp_corecap_sz];
257 #endif
258 #endif  /* __MACH_EDP_H */