ARM: tegra: power: Add dynamic CPU regulator mode control
[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_voltage_temp_constraint {
41         int temperature;
42         unsigned int voltage_limit_mV;
43 };
44
45 struct tegra_edp_maximum_current_constraint {
46         unsigned int max_cur;
47         unsigned int max_temp;
48         unsigned int max_freq[4]; /* KHz */
49 };
50
51 struct tegra_edp_cpu_leakage_params {
52         int cpu_speedo_id;
53
54         unsigned int temp_scaled; /* 1x for T114, 10x for T148 */
55
56         unsigned int dyn_scaled;
57         int dyn_consts_n[4];     /* pre-multiplied by 'scaled */
58
59         unsigned int consts_scaled;
60         int leakage_consts_n[4];         /* pre-multiplied by 'scaled */
61
62         unsigned int ijk_scaled;
63         int leakage_consts_ijk[4][4][4]; /* pre-multiplied by 'scaled */
64         unsigned int leakage_min;        /* minimum leakage current */
65
66         unsigned int safety_cap[4];
67         struct tegra_edp_maximum_current_constraint max_current_cap[9];
68         struct tegra_edp_voltage_temp_constraint volt_temp_cap;
69 };
70
71 struct tegra_edp_freq_voltage_table {
72         unsigned int freq;
73         int voltage_mV;
74 };
75
76 enum tegra_core_edp_profiles {
77         CORE_EDP_PROFILE_FAVOR_EMC = 0,
78         CORE_EDP_PROFILE_BALANCED,
79         CORE_EDP_PROFILE_FAVOR_GPU,
80
81         CORE_EDP_PROFILES_NUM,
82 };
83
84 struct tegra_core_edp_limits {
85         int sku;
86         struct clk **cap_clocks;
87         int cap_clocks_num;
88         int *temperatures;
89         int temperature_ranges;
90         int core_modules_states;
91         unsigned long *cap_rates_scpu_on;
92         unsigned long *cap_rates_scpu_off;
93 };
94
95 #ifdef CONFIG_TEGRA_EDP_LIMITS
96 struct thermal_cooling_device *edp_cooling_device_create(void *v);
97 void tegra_init_cpu_edp_limits(unsigned int regulator_mA);
98 void tegra_recalculate_cpu_edp_limits(void);
99 void tegra_get_cpu_edp_limits(const struct tegra_edp_limits **limits,
100                               int *size);
101 unsigned int tegra_get_edp_limit(int *get_edp_thermal_index);
102 void tegra_init_cpu_reg_mode_limits(unsigned int regulator_mA,
103                                     unsigned int mode);
104 void tegra_get_cpu_reg_mode_limits(const struct tegra_edp_limits **limits,
105                                    int *size, unsigned int mode);
106 void tegra_get_system_edp_limits(const unsigned int **limits);
107 int tegra_system_edp_alarm(bool alarm);
108 void tegra_platform_edp_init(struct thermal_trip_info *trips,
109                                         int *num_trips, int margin);
110 struct tegra_system_edp_entry *tegra_get_system_edp_entries(int *size);
111 unsigned int tegra_edp_find_maxf(int volt);
112 #else
113 static inline struct thermal_cooling_device *edp_cooling_device_create(
114         int index)
115 { return NULL; }
116 static inline void tegra_init_cpu_edp_limits(int regulator_mA)
117 {}
118 static inline void tegra_recalculate_cpu_edp_limits(void)
119 {}
120 static inline void tegra_get_cpu_edp_limits(struct tegra_edp_limits **limits,
121                                             int *size)
122 {}
123 static inline void tegra_init_cpu_reg_mode_limits(unsigned int regulator_mA,
124                                                   unsigned int mode)
125 {}
126 static inline void tegra_get_cpu_reg_mode_limits(
127         const struct tegra_edp_limits **limits, int *size, unsigned int mode)
128 {}
129 static inline unsigned int tegra_get_edp_limit(int *get_edp_thermal_index)
130 { return -1; }
131 static inline void tegra_get_system_edp_limits(unsigned int **limits)
132 {}
133 static inline int tegra_system_edp_alarm(bool alarm)
134 { return -1; }
135 static inline void tegra_platform_edp_init(struct thermal_trip_info *trips,
136                                            int *num_trips, int margin)
137 {}
138 static inline struct tegra_system_edp_entry
139                 *tegra_get_system_edp_entries(int *size) { return NULL; }
140 static inline unsigned int tegra_edp_find_maxf(int volt)
141 { return -1; }
142 #endif
143
144 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
145 static inline void tegra_edp_throttle_cpu_now(u8 factor)
146 {}
147 #else
148 void tegra_edp_throttle_cpu_now(u8 factor);
149 #endif
150
151 #ifdef CONFIG_TEGRA_CORE_EDP_LIMITS
152 void tegra_init_core_edp_limits(unsigned int regulator_mA);
153 int tegra_core_edp_debugfs_init(struct dentry *edp_dir);
154 int tegra_core_edp_cpu_state_update(bool scpu_state);
155 struct tegra_cooling_device *tegra_core_edp_get_cdev(void);
156 #else
157 static inline void tegra_init_core_edp_limits(unsigned int regulator_mA)
158 {}
159 static inline int tegra_core_edp_debugfs_init(struct dentry *edp_dir)
160 { return 0; }
161 static inline int tegra_core_edp_cpu_state_update(bool scpu_state)
162 { return 0; }
163 static inline struct tegra_cooling_device *tegra_core_edp_get_cdev(void)
164 { return NULL; }
165 #endif
166
167 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
168 struct tegra_edp_vdd_cpu_entry *tegra3x_get_vdd_cpu_map(int *sz);
169 struct tegra_system_edp_entry *tegra3x_get_system_edp_map(int *sz);
170 #else
171 static inline struct tegra_edp_vdd_cpu_entry *tegra3x_get_vdd_cpu_map(int *sz)
172 { return NULL; }
173 static inline struct tegra_system_edp_entry *tegra3x_get_system_edp_map(int *sz)
174 { return NULL; }
175 #endif
176
177 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
178 int tegra11x_select_core_edp_table(unsigned int regulator_mA,
179                                    struct tegra_core_edp_limits *limits);
180 struct tegra_edp_cpu_leakage_params *tegra11x_get_leakage_params(int index,
181                                                         unsigned int *sz);
182 #else
183 static inline int tegra11x_select_core_edp_table(
184         unsigned int regulator_mA, struct tegra_core_edp_limits *limits)
185 { return -ENOSYS; }
186 static inline struct tegra_edp_cpu_leakage_params *tegra11x_get_leakage_params
187 (int index, unsigned int *sz) { return NULL; }
188 #endif
189
190 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
191 int tegra14x_select_core_edp_table(unsigned int regulator_mA,
192                                    struct tegra_core_edp_limits *limits);
193 struct tegra_edp_cpu_leakage_params *tegra14x_get_leakage_params(int index,
194                                                         unsigned int *sz);
195 #else
196 static inline int tegra14x_select_core_edp_table(
197         unsigned int regulator_mA, struct tegra_core_edp_limits *limits)
198 { return -ENOSYS; }
199 static inline struct tegra_edp_cpu_leakage_params *tegra14x_get_leakage_params
200 (int index, unsigned int *sz) { return NULL; }
201 #endif
202
203 #ifdef CONFIG_ARCH_TEGRA_12x_SOC
204 struct tegra_edp_cpu_leakage_params *tegra12x_get_leakage_params(int index,
205                                                         unsigned int *sz);
206 #else
207 static inline struct tegra_edp_cpu_leakage_params *tegra12x_get_leakage_params
208 (int index, unsigned int *sz) { return NULL; }
209 #endif
210
211 #endif  /* __MACH_EDP_H */