arm: tegra: la: la and ptsa updates for t14x.
[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.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20
21 #ifndef __MACH_EDP_H
22 #define __MACH_EDP_H
23
24 #include <linux/debugfs.h>
25 #include <linux/edp.h>
26 #include <linux/thermal.h>
27 #include <linux/platform_data/thermal_sensors.h>
28
29 struct tegra_edp_vdd_cpu_entry {
30         char speedo_id;
31         char regulator_100mA;
32         char temperature;
33         char freq_limits[4];
34 };
35
36 struct tegra_edp_limits {
37         int temperature;
38         unsigned int freq_limits[4];
39 };
40
41 struct tegra_system_edp_entry {
42         char speedo_id;
43         char power_limit_100mW;
44         unsigned int freq_limits[4];
45 };
46
47 struct tegra_edp_cpu_leakage_params {
48         int cpu_speedo_id;
49         int dyn_consts_n[4];     /* pre-multiplied by 1,000,000 */
50         int leakage_consts_n[4];         /* pre-multiplied by 1,000,000 */
51         int leakage_consts_ijk[4][4][4]; /* pre-multiplied by 100,000 */
52         unsigned int safety_cap[4];
53 };
54
55 struct tegra_edp_freq_voltage_table {
56         unsigned int freq;
57         int voltage_mV;
58 };
59
60 enum tegra_core_edp_profiles {
61         CORE_EDP_PROFILE_FAVOR_EMC = 0,
62         CORE_EDP_PROFILE_BALANCED,
63         CORE_EDP_PROFILE_FAVOR_GPU,
64
65         CORE_EDP_PROFILES_NUM,
66 };
67
68 struct tegra_core_edp_limits {
69         int sku;
70         struct clk **cap_clocks;
71         int cap_clocks_num;
72         int *temperatures;
73         int temperature_ranges;
74         int core_modules_states;
75         unsigned long *cap_rates_scpu_on;
76         unsigned long *cap_rates_scpu_off;
77 };
78
79 #ifdef CONFIG_TEGRA_EDP_LIMITS
80 struct thermal_cooling_device *edp_cooling_device_create(void *v);
81 void tegra_init_cpu_edp_limits(unsigned int regulator_mA);
82 void tegra_recalculate_cpu_edp_limits(void);
83 void tegra_init_system_edp_limits(unsigned int power_limit_mW);
84 void tegra_get_cpu_edp_limits(const struct tegra_edp_limits **limits, int *size);
85 unsigned int tegra_get_edp_limit(int *get_edp_thermal_index);
86 void tegra_get_system_edp_limits(const unsigned int **limits);
87 int tegra_system_edp_alarm(bool alarm);
88 void tegra_platform_edp_init(struct thermal_trip_info *trips,
89                                         int *num_trips, int margin);
90 struct tegra_system_edp_entry *tegra_get_system_edp_entries(int *size);
91 #else
92 static inline struct thermal_cooling_device *edp_cooling_device_create(
93         int index)
94 { return NULL; }
95 static inline void tegra_init_cpu_edp_limits(int regulator_mA)
96 {}
97 static inline void tegra_recalculate_cpu_edp_limits(void)
98 {}
99 static inline void tegra_init_system_edp_limits(int power_limit_mW)
100 {}
101 static inline void tegra_get_cpu_edp_limits(struct tegra_edp_limits **limits,
102                                             int *size)
103 {}
104 static inline unsigned int tegra_get_edp_limit(int *get_edp_thermal_index)
105 { return -1; }
106 static inline void tegra_get_system_edp_limits(unsigned int **limits)
107 {}
108 static inline int tegra_system_edp_alarm(bool alarm)
109 { return -1; }
110 static inline void tegra_platform_edp_init(struct thermal_trip_info *trips,
111                                            int *num_trips, int margin)
112 {}
113 static inline struct tegra_system_edp_entry
114                 *tegra_get_system_edp_entries(int *size) { return NULL; }
115 #endif
116
117 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
118 static inline void tegra_edp_throttle_cpu_now(u8 factor)
119 {}
120 #else
121 void tegra_edp_throttle_cpu_now(u8 factor);
122 #endif
123
124 #ifdef CONFIG_TEGRA_CORE_EDP_LIMITS
125 void tegra_init_core_edp_limits(unsigned int regulator_mA);
126 int tegra_core_edp_debugfs_init(struct dentry *edp_dir);
127 int tegra_core_edp_cpu_state_update(bool scpu_state);
128 struct tegra_cooling_device *tegra_core_edp_get_cdev(void);
129 #else
130 static inline void tegra_init_core_edp_limits(unsigned int regulator_mA)
131 {}
132 static inline int tegra_core_edp_debugfs_init(struct dentry *edp_dir)
133 { return 0; }
134 static inline int tegra_core_edp_cpu_state_update(bool scpu_state)
135 { return 0; }
136 static inline struct tegra_cooling_device *tegra_core_edp_get_cdev(void)
137 { return NULL; }
138 #endif
139
140 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
141 int tegra11x_select_core_edp_table(unsigned int regulator_mA,
142                                    struct tegra_core_edp_limits *limits);
143 #else
144 static inline int tegra11x_select_core_edp_table(
145         unsigned int regulator_mA, struct tegra_core_edp_limits *limits)
146 { return -ENOSYS; }
147 #endif
148
149 #endif  /* __MACH_EDP_H */