1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (c) 2010 Google, Inc |
4 | * Copyright (c) 2014 NVIDIA Corporation |
5 | * |
6 | * Author: |
7 | * Colin Cross <ccross@google.com> |
8 | */ |
9 | |
10 | #ifndef __SOC_TEGRA_PMC_H__ |
11 | #define __SOC_TEGRA_PMC_H__ |
12 | |
13 | #include <linux/reboot.h> |
14 | |
15 | #include <soc/tegra/pm.h> |
16 | |
17 | struct clk; |
18 | struct reset_control; |
19 | |
20 | bool tegra_pmc_cpu_is_powered(unsigned int cpuid); |
21 | int tegra_pmc_cpu_power_on(unsigned int cpuid); |
22 | int tegra_pmc_cpu_remove_clamping(unsigned int cpuid); |
23 | |
24 | /* |
25 | * powergate and I/O rail APIs |
26 | */ |
27 | |
28 | #define TEGRA_POWERGATE_CPU 0 |
29 | #define TEGRA_POWERGATE_3D 1 |
30 | #define TEGRA_POWERGATE_VENC 2 |
31 | #define TEGRA_POWERGATE_PCIE 3 |
32 | #define TEGRA_POWERGATE_VDEC 4 |
33 | #define TEGRA_POWERGATE_L2 5 |
34 | #define TEGRA_POWERGATE_MPE 6 |
35 | #define TEGRA_POWERGATE_HEG 7 |
36 | #define TEGRA_POWERGATE_SATA 8 |
37 | #define TEGRA_POWERGATE_CPU1 9 |
38 | #define TEGRA_POWERGATE_CPU2 10 |
39 | #define TEGRA_POWERGATE_CPU3 11 |
40 | #define TEGRA_POWERGATE_CELP 12 |
41 | #define TEGRA_POWERGATE_3D1 13 |
42 | #define TEGRA_POWERGATE_CPU0 14 |
43 | #define TEGRA_POWERGATE_C0NC 15 |
44 | #define TEGRA_POWERGATE_C1NC 16 |
45 | #define TEGRA_POWERGATE_SOR 17 |
46 | #define TEGRA_POWERGATE_DIS 18 |
47 | #define TEGRA_POWERGATE_DISB 19 |
48 | #define TEGRA_POWERGATE_XUSBA 20 |
49 | #define TEGRA_POWERGATE_XUSBB 21 |
50 | #define TEGRA_POWERGATE_XUSBC 22 |
51 | #define TEGRA_POWERGATE_VIC 23 |
52 | #define TEGRA_POWERGATE_IRAM 24 |
53 | #define TEGRA_POWERGATE_NVDEC 25 |
54 | #define TEGRA_POWERGATE_NVJPG 26 |
55 | #define TEGRA_POWERGATE_AUD 27 |
56 | #define TEGRA_POWERGATE_DFD 28 |
57 | #define TEGRA_POWERGATE_VE2 29 |
58 | #define TEGRA_POWERGATE_MAX TEGRA_POWERGATE_VE2 |
59 | |
60 | #define TEGRA_POWERGATE_3D0 TEGRA_POWERGATE_3D |
61 | |
62 | /** |
63 | * enum tegra_io_pad - I/O pad group identifier |
64 | * |
65 | * I/O pins on Tegra SoCs are grouped into so-called I/O pads. Each such pad |
66 | * can be used to control the common voltage signal level and power state of |
67 | * the pins of the given pad. |
68 | */ |
69 | enum tegra_io_pad { |
70 | TEGRA_IO_PAD_AUDIO, |
71 | TEGRA_IO_PAD_AUDIO_HV, |
72 | TEGRA_IO_PAD_BB, |
73 | TEGRA_IO_PAD_CAM, |
74 | TEGRA_IO_PAD_COMP, |
75 | TEGRA_IO_PAD_CONN, |
76 | TEGRA_IO_PAD_CSIA, |
77 | TEGRA_IO_PAD_CSIB, |
78 | TEGRA_IO_PAD_CSIC, |
79 | TEGRA_IO_PAD_CSID, |
80 | TEGRA_IO_PAD_CSIE, |
81 | TEGRA_IO_PAD_CSIF, |
82 | TEGRA_IO_PAD_CSIG, |
83 | TEGRA_IO_PAD_CSIH, |
84 | TEGRA_IO_PAD_DAP3, |
85 | TEGRA_IO_PAD_DAP5, |
86 | TEGRA_IO_PAD_DBG, |
87 | TEGRA_IO_PAD_DEBUG_NONAO, |
88 | TEGRA_IO_PAD_DMIC, |
89 | TEGRA_IO_PAD_DMIC_HV, |
90 | TEGRA_IO_PAD_DP, |
91 | TEGRA_IO_PAD_DSI, |
92 | TEGRA_IO_PAD_DSIB, |
93 | TEGRA_IO_PAD_DSIC, |
94 | TEGRA_IO_PAD_DSID, |
95 | TEGRA_IO_PAD_EDP, |
96 | TEGRA_IO_PAD_EMMC, |
97 | TEGRA_IO_PAD_EMMC2, |
98 | TEGRA_IO_PAD_EQOS, |
99 | TEGRA_IO_PAD_GPIO, |
100 | TEGRA_IO_PAD_GP_PWM2, |
101 | TEGRA_IO_PAD_GP_PWM3, |
102 | TEGRA_IO_PAD_HDMI, |
103 | TEGRA_IO_PAD_HDMI_DP0, |
104 | TEGRA_IO_PAD_HDMI_DP1, |
105 | TEGRA_IO_PAD_HDMI_DP2, |
106 | TEGRA_IO_PAD_HDMI_DP3, |
107 | TEGRA_IO_PAD_HSIC, |
108 | TEGRA_IO_PAD_HV, |
109 | TEGRA_IO_PAD_LVDS, |
110 | TEGRA_IO_PAD_MIPI_BIAS, |
111 | TEGRA_IO_PAD_NAND, |
112 | TEGRA_IO_PAD_PEX_BIAS, |
113 | TEGRA_IO_PAD_PEX_CLK_BIAS, |
114 | TEGRA_IO_PAD_PEX_CLK1, |
115 | TEGRA_IO_PAD_PEX_CLK2, |
116 | TEGRA_IO_PAD_PEX_CLK3, |
117 | TEGRA_IO_PAD_PEX_CLK_2_BIAS, |
118 | TEGRA_IO_PAD_PEX_CLK_2, |
119 | TEGRA_IO_PAD_PEX_CNTRL, |
120 | TEGRA_IO_PAD_PEX_CTL2, |
121 | TEGRA_IO_PAD_PEX_L0_RST, |
122 | TEGRA_IO_PAD_PEX_L1_RST, |
123 | TEGRA_IO_PAD_PEX_L5_RST, |
124 | TEGRA_IO_PAD_PWR_CTL, |
125 | TEGRA_IO_PAD_SDMMC1, |
126 | TEGRA_IO_PAD_SDMMC1_HV, |
127 | TEGRA_IO_PAD_SDMMC2, |
128 | TEGRA_IO_PAD_SDMMC2_HV, |
129 | TEGRA_IO_PAD_SDMMC3, |
130 | TEGRA_IO_PAD_SDMMC3_HV, |
131 | TEGRA_IO_PAD_SDMMC4, |
132 | TEGRA_IO_PAD_SOC_GPIO10, |
133 | TEGRA_IO_PAD_SOC_GPIO12, |
134 | TEGRA_IO_PAD_SOC_GPIO13, |
135 | TEGRA_IO_PAD_SOC_GPIO53, |
136 | TEGRA_IO_PAD_SPI, |
137 | TEGRA_IO_PAD_SPI_HV, |
138 | TEGRA_IO_PAD_SYS_DDC, |
139 | TEGRA_IO_PAD_UART, |
140 | TEGRA_IO_PAD_UART4, |
141 | TEGRA_IO_PAD_UART5, |
142 | TEGRA_IO_PAD_UFS, |
143 | TEGRA_IO_PAD_USB0, |
144 | TEGRA_IO_PAD_USB1, |
145 | TEGRA_IO_PAD_USB2, |
146 | TEGRA_IO_PAD_USB3, |
147 | TEGRA_IO_PAD_USB_BIAS, |
148 | TEGRA_IO_PAD_AO_HV, |
149 | }; |
150 | |
151 | /* deprecated, use TEGRA_IO_PAD_{HDMI,LVDS} instead */ |
152 | #define TEGRA_IO_RAIL_HDMI TEGRA_IO_PAD_HDMI |
153 | #define TEGRA_IO_RAIL_LVDS TEGRA_IO_PAD_LVDS |
154 | |
155 | #ifdef CONFIG_SOC_TEGRA_PMC |
156 | int tegra_powergate_power_on(unsigned int id); |
157 | int tegra_powergate_power_off(unsigned int id); |
158 | int tegra_powergate_remove_clamping(unsigned int id); |
159 | |
160 | /* Must be called with clk disabled, and returns with clk enabled */ |
161 | int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk, |
162 | struct reset_control *rst); |
163 | |
164 | int tegra_io_pad_power_enable(enum tegra_io_pad id); |
165 | int tegra_io_pad_power_disable(enum tegra_io_pad id); |
166 | |
167 | /* deprecated, use tegra_io_pad_power_{enable,disable}() instead */ |
168 | int tegra_io_rail_power_on(unsigned int id); |
169 | int tegra_io_rail_power_off(unsigned int id); |
170 | |
171 | void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode); |
172 | void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode); |
173 | |
174 | bool tegra_pmc_core_domain_state_synced(void); |
175 | |
176 | #else |
177 | static inline int tegra_powergate_power_on(unsigned int id) |
178 | { |
179 | return -ENOSYS; |
180 | } |
181 | |
182 | static inline int tegra_powergate_power_off(unsigned int id) |
183 | { |
184 | return -ENOSYS; |
185 | } |
186 | |
187 | static inline int tegra_powergate_remove_clamping(unsigned int id) |
188 | { |
189 | return -ENOSYS; |
190 | } |
191 | |
192 | static inline int tegra_powergate_sequence_power_up(unsigned int id, |
193 | struct clk *clk, |
194 | struct reset_control *rst) |
195 | { |
196 | return -ENOSYS; |
197 | } |
198 | |
199 | static inline int tegra_io_pad_power_enable(enum tegra_io_pad id) |
200 | { |
201 | return -ENOSYS; |
202 | } |
203 | |
204 | static inline int tegra_io_pad_power_disable(enum tegra_io_pad id) |
205 | { |
206 | return -ENOSYS; |
207 | } |
208 | |
209 | static inline int tegra_io_pad_get_voltage(enum tegra_io_pad id) |
210 | { |
211 | return -ENOSYS; |
212 | } |
213 | |
214 | static inline int tegra_io_rail_power_on(unsigned int id) |
215 | { |
216 | return -ENOSYS; |
217 | } |
218 | |
219 | static inline int tegra_io_rail_power_off(unsigned int id) |
220 | { |
221 | return -ENOSYS; |
222 | } |
223 | |
224 | static inline void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode) |
225 | { |
226 | } |
227 | |
228 | static inline void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode) |
229 | { |
230 | } |
231 | |
232 | static inline bool tegra_pmc_core_domain_state_synced(void) |
233 | { |
234 | return false; |
235 | } |
236 | |
237 | #endif /* CONFIG_SOC_TEGRA_PMC */ |
238 | |
239 | #if defined(CONFIG_SOC_TEGRA_PMC) && defined(CONFIG_PM_SLEEP) |
240 | enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void); |
241 | #else |
242 | static inline enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void) |
243 | { |
244 | return TEGRA_SUSPEND_NONE; |
245 | } |
246 | #endif |
247 | |
248 | #endif /* __SOC_TEGRA_PMC_H__ */ |
249 | |