1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * OMAP4 Power domains framework
4 *
5 * Copyright (C) 2009-2011 Texas Instruments, Inc.
6 * Copyright (C) 2009-2011 Nokia Corporation
7 *
8 * Abhijit Pagare (abhijitpagare@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 * Paul Walmsley (paul@pwsan.com)
11 *
12 * This file is automatically generated from the OMAP hardware databases.
13 * We respectfully ask that any modifications to this file be coordinated
14 * with the public linux-omap@vger.kernel.org mailing list and the
15 * authors above to ensure that the autogeneration scripts are kept
16 * up-to-date with the file contents.
17 */
18
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21
22 #include "powerdomain.h"
23
24 #include "prcm-common.h"
25 #include "prcm44xx.h"
26 #include "prm-regbits-44xx.h"
27 #include "prm44xx.h"
28 #include "prcm_mpu44xx.h"
29
30 /* core_44xx_pwrdm: CORE power domain */
31 static struct powerdomain core_44xx_pwrdm = {
32 .name = "core_pwrdm",
33 .voltdm = { .name = "core" },
34 .prcm_offs = OMAP4430_PRM_CORE_INST,
35 .prcm_partition = OMAP4430_PRM_PARTITION,
36 .pwrsts = PWRSTS_RET_ON,
37 .pwrsts_logic_ret = PWRSTS_OFF_RET,
38 .banks = 5,
39 .pwrsts_mem_ret = {
40 [0] = PWRSTS_OFF, /* core_nret_bank */
41 [1] = PWRSTS_RET, /* core_ocmram */
42 [2] = PWRSTS_RET, /* core_other_bank */
43 [3] = PWRSTS_OFF_RET, /* ducati_l2ram */
44 [4] = PWRSTS_OFF_RET, /* ducati_unicache */
45 },
46 .pwrsts_mem_on = {
47 [0] = PWRSTS_ON, /* core_nret_bank */
48 [1] = PWRSTS_ON, /* core_ocmram */
49 [2] = PWRSTS_ON, /* core_other_bank */
50 [3] = PWRSTS_ON, /* ducati_l2ram */
51 [4] = PWRSTS_ON, /* ducati_unicache */
52 },
53 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
54 };
55
56 /* gfx_44xx_pwrdm: 3D accelerator power domain */
57 static struct powerdomain gfx_44xx_pwrdm = {
58 .name = "gfx_pwrdm",
59 .voltdm = { .name = "core" },
60 .prcm_offs = OMAP4430_PRM_GFX_INST,
61 .prcm_partition = OMAP4430_PRM_PARTITION,
62 .pwrsts = PWRSTS_OFF_ON,
63 .banks = 1,
64 .pwrsts_mem_ret = {
65 [0] = PWRSTS_OFF, /* gfx_mem */
66 },
67 .pwrsts_mem_on = {
68 [0] = PWRSTS_ON, /* gfx_mem */
69 },
70 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
71 };
72
73 /* abe_44xx_pwrdm: Audio back end power domain */
74 static struct powerdomain abe_44xx_pwrdm = {
75 .name = "abe_pwrdm",
76 .voltdm = { .name = "iva" },
77 .prcm_offs = OMAP4430_PRM_ABE_INST,
78 .prcm_partition = OMAP4430_PRM_PARTITION,
79 .pwrsts = PWRSTS_OFF_RET_ON,
80 .pwrsts_logic_ret = PWRSTS_OFF,
81 .banks = 2,
82 .pwrsts_mem_ret = {
83 [0] = PWRSTS_RET, /* aessmem */
84 [1] = PWRSTS_OFF, /* periphmem */
85 },
86 .pwrsts_mem_on = {
87 [0] = PWRSTS_ON, /* aessmem */
88 [1] = PWRSTS_ON, /* periphmem */
89 },
90 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
91 };
92
93 /* dss_44xx_pwrdm: Display subsystem power domain */
94 static struct powerdomain dss_44xx_pwrdm = {
95 .name = "dss_pwrdm",
96 .voltdm = { .name = "core" },
97 .prcm_offs = OMAP4430_PRM_DSS_INST,
98 .prcm_partition = OMAP4430_PRM_PARTITION,
99 .pwrsts = PWRSTS_OFF_RET_ON,
100 .pwrsts_logic_ret = PWRSTS_OFF,
101 .banks = 1,
102 .pwrsts_mem_ret = {
103 [0] = PWRSTS_OFF, /* dss_mem */
104 },
105 .pwrsts_mem_on = {
106 [0] = PWRSTS_ON, /* dss_mem */
107 },
108 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
109 };
110
111 /* tesla_44xx_pwrdm: Tesla processor power domain */
112 static struct powerdomain tesla_44xx_pwrdm = {
113 .name = "tesla_pwrdm",
114 .voltdm = { .name = "iva" },
115 .prcm_offs = OMAP4430_PRM_TESLA_INST,
116 .prcm_partition = OMAP4430_PRM_PARTITION,
117 .pwrsts = PWRSTS_OFF_RET_ON,
118 .pwrsts_logic_ret = PWRSTS_OFF_RET,
119 .banks = 3,
120 .pwrsts_mem_ret = {
121 [0] = PWRSTS_RET, /* tesla_edma */
122 [1] = PWRSTS_OFF_RET, /* tesla_l1 */
123 [2] = PWRSTS_OFF_RET, /* tesla_l2 */
124 },
125 .pwrsts_mem_on = {
126 [0] = PWRSTS_ON, /* tesla_edma */
127 [1] = PWRSTS_ON, /* tesla_l1 */
128 [2] = PWRSTS_ON, /* tesla_l2 */
129 },
130 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
131 };
132
133 /* wkup_44xx_pwrdm: Wake-up power domain */
134 static struct powerdomain wkup_44xx_pwrdm = {
135 .name = "wkup_pwrdm",
136 .voltdm = { .name = "wakeup" },
137 .prcm_offs = OMAP4430_PRM_WKUP_INST,
138 .prcm_partition = OMAP4430_PRM_PARTITION,
139 .pwrsts = PWRSTS_ON,
140 .banks = 1,
141 .pwrsts_mem_ret = {
142 [0] = PWRSTS_OFF, /* wkup_bank */
143 },
144 .pwrsts_mem_on = {
145 [0] = PWRSTS_ON, /* wkup_bank */
146 },
147 };
148
149 /* cpu0_44xx_pwrdm: MPU0 processor and Neon coprocessor power domain */
150 static struct powerdomain cpu0_44xx_pwrdm = {
151 .name = "cpu0_pwrdm",
152 .voltdm = { .name = "mpu" },
153 .prcm_offs = OMAP4430_PRCM_MPU_CPU0_INST,
154 .prcm_partition = OMAP4430_PRCM_MPU_PARTITION,
155 .pwrsts = PWRSTS_OFF_RET_ON,
156 .pwrsts_logic_ret = PWRSTS_OFF_RET,
157 .banks = 1,
158 .pwrsts_mem_ret = {
159 [0] = PWRSTS_OFF_RET, /* cpu0_l1 */
160 },
161 .pwrsts_mem_on = {
162 [0] = PWRSTS_ON, /* cpu0_l1 */
163 },
164 };
165
166 /* cpu1_44xx_pwrdm: MPU1 processor and Neon coprocessor power domain */
167 static struct powerdomain cpu1_44xx_pwrdm = {
168 .name = "cpu1_pwrdm",
169 .voltdm = { .name = "mpu" },
170 .prcm_offs = OMAP4430_PRCM_MPU_CPU1_INST,
171 .prcm_partition = OMAP4430_PRCM_MPU_PARTITION,
172 .pwrsts = PWRSTS_OFF_RET_ON,
173 .pwrsts_logic_ret = PWRSTS_OFF_RET,
174 .banks = 1,
175 .pwrsts_mem_ret = {
176 [0] = PWRSTS_OFF_RET, /* cpu1_l1 */
177 },
178 .pwrsts_mem_on = {
179 [0] = PWRSTS_ON, /* cpu1_l1 */
180 },
181 };
182
183 /* emu_44xx_pwrdm: Emulation power domain */
184 static struct powerdomain emu_44xx_pwrdm = {
185 .name = "emu_pwrdm",
186 .voltdm = { .name = "wakeup" },
187 .prcm_offs = OMAP4430_PRM_EMU_INST,
188 .prcm_partition = OMAP4430_PRM_PARTITION,
189 .pwrsts = PWRSTS_OFF_ON,
190 .banks = 1,
191 .pwrsts_mem_ret = {
192 [0] = PWRSTS_OFF, /* emu_bank */
193 },
194 .pwrsts_mem_on = {
195 [0] = PWRSTS_ON, /* emu_bank */
196 },
197 };
198
199 /* mpu_44xx_pwrdm: Modena processor and the Neon coprocessor power domain */
200 static struct powerdomain mpu_44xx_pwrdm = {
201 .name = "mpu_pwrdm",
202 .voltdm = { .name = "mpu" },
203 .prcm_offs = OMAP4430_PRM_MPU_INST,
204 .prcm_partition = OMAP4430_PRM_PARTITION,
205 .pwrsts = PWRSTS_RET_ON,
206 .pwrsts_logic_ret = PWRSTS_OFF_RET,
207 .banks = 3,
208 .pwrsts_mem_ret = {
209 [0] = PWRSTS_OFF_RET, /* mpu_l1 */
210 [1] = PWRSTS_OFF_RET, /* mpu_l2 */
211 [2] = PWRSTS_RET, /* mpu_ram */
212 },
213 .pwrsts_mem_on = {
214 [0] = PWRSTS_ON, /* mpu_l1 */
215 [1] = PWRSTS_ON, /* mpu_l2 */
216 [2] = PWRSTS_ON, /* mpu_ram */
217 },
218 };
219
220 /* ivahd_44xx_pwrdm: IVA-HD power domain */
221 static struct powerdomain ivahd_44xx_pwrdm = {
222 .name = "ivahd_pwrdm",
223 .voltdm = { .name = "iva" },
224 .prcm_offs = OMAP4430_PRM_IVAHD_INST,
225 .prcm_partition = OMAP4430_PRM_PARTITION,
226 .pwrsts = PWRSTS_OFF_RET_ON,
227 .pwrsts_logic_ret = PWRSTS_OFF,
228 .banks = 4,
229 .pwrsts_mem_ret = {
230 [0] = PWRSTS_OFF, /* hwa_mem */
231 [1] = PWRSTS_OFF_RET, /* sl2_mem */
232 [2] = PWRSTS_OFF_RET, /* tcm1_mem */
233 [3] = PWRSTS_OFF_RET, /* tcm2_mem */
234 },
235 .pwrsts_mem_on = {
236 [0] = PWRSTS_ON, /* hwa_mem */
237 [1] = PWRSTS_ON, /* sl2_mem */
238 [2] = PWRSTS_ON, /* tcm1_mem */
239 [3] = PWRSTS_ON, /* tcm2_mem */
240 },
241 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
242 };
243
244 /* cam_44xx_pwrdm: Camera subsystem power domain */
245 static struct powerdomain cam_44xx_pwrdm = {
246 .name = "cam_pwrdm",
247 .voltdm = { .name = "core" },
248 .prcm_offs = OMAP4430_PRM_CAM_INST,
249 .prcm_partition = OMAP4430_PRM_PARTITION,
250 .pwrsts = PWRSTS_OFF_ON,
251 .banks = 1,
252 .pwrsts_mem_ret = {
253 [0] = PWRSTS_OFF, /* cam_mem */
254 },
255 .pwrsts_mem_on = {
256 [0] = PWRSTS_ON, /* cam_mem */
257 },
258 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
259 };
260
261 /* l3init_44xx_pwrdm: L3 initators pheripherals power domain */
262 static struct powerdomain l3init_44xx_pwrdm = {
263 .name = "l3init_pwrdm",
264 .voltdm = { .name = "core" },
265 .prcm_offs = OMAP4430_PRM_L3INIT_INST,
266 .prcm_partition = OMAP4430_PRM_PARTITION,
267 .pwrsts = PWRSTS_RET_ON,
268 .pwrsts_logic_ret = PWRSTS_OFF_RET,
269 .banks = 1,
270 .pwrsts_mem_ret = {
271 [0] = PWRSTS_OFF, /* l3init_bank1 */
272 },
273 .pwrsts_mem_on = {
274 [0] = PWRSTS_ON, /* l3init_bank1 */
275 },
276 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
277 };
278
279 /* l4per_44xx_pwrdm: Target peripherals power domain */
280 static struct powerdomain l4per_44xx_pwrdm = {
281 .name = "l4per_pwrdm",
282 .voltdm = { .name = "core" },
283 .prcm_offs = OMAP4430_PRM_L4PER_INST,
284 .prcm_partition = OMAP4430_PRM_PARTITION,
285 .pwrsts = PWRSTS_RET_ON,
286 .pwrsts_logic_ret = PWRSTS_OFF_RET,
287 .banks = 2,
288 .pwrsts_mem_ret = {
289 [0] = PWRSTS_OFF, /* nonretained_bank */
290 [1] = PWRSTS_RET, /* retained_bank */
291 },
292 .pwrsts_mem_on = {
293 [0] = PWRSTS_ON, /* nonretained_bank */
294 [1] = PWRSTS_ON, /* retained_bank */
295 },
296 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
297 };
298
299 /*
300 * always_on_core_44xx_pwrdm: Always ON logic that sits in VDD_CORE voltage
301 * domain
302 */
303 static struct powerdomain always_on_core_44xx_pwrdm = {
304 .name = "always_on_core_pwrdm",
305 .voltdm = { .name = "core" },
306 .prcm_offs = OMAP4430_PRM_ALWAYS_ON_INST,
307 .prcm_partition = OMAP4430_PRM_PARTITION,
308 .pwrsts = PWRSTS_ON,
309 };
310
311 /* cefuse_44xx_pwrdm: Customer efuse controller power domain */
312 static struct powerdomain cefuse_44xx_pwrdm = {
313 .name = "cefuse_pwrdm",
314 .voltdm = { .name = "core" },
315 .prcm_offs = OMAP4430_PRM_CEFUSE_INST,
316 .prcm_partition = OMAP4430_PRM_PARTITION,
317 .pwrsts = PWRSTS_OFF_ON,
318 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
319 };
320
321 /*
322 * The following power domains are not under SW control
323 *
324 * always_on_iva
325 * always_on_mpu
326 * stdefuse
327 */
328
329 /* As powerdomains are added or removed above, this list must also be changed */
330 static struct powerdomain *powerdomains_omap44xx[] __initdata = {
331 &core_44xx_pwrdm,
332 &gfx_44xx_pwrdm,
333 &abe_44xx_pwrdm,
334 &dss_44xx_pwrdm,
335 &tesla_44xx_pwrdm,
336 &wkup_44xx_pwrdm,
337 &cpu0_44xx_pwrdm,
338 &cpu1_44xx_pwrdm,
339 &emu_44xx_pwrdm,
340 &mpu_44xx_pwrdm,
341 &ivahd_44xx_pwrdm,
342 &cam_44xx_pwrdm,
343 &l3init_44xx_pwrdm,
344 &l4per_44xx_pwrdm,
345 &always_on_core_44xx_pwrdm,
346 &cefuse_44xx_pwrdm,
347 NULL
348 };
349
omap44xx_powerdomains_init(void)350 void __init omap44xx_powerdomains_init(void)
351 {
352 pwrdm_register_platform_funcs(&omap4_pwrdm_operations);
353 pwrdm_register_pwrdms(powerdomains_omap44xx);
354 pwrdm_complete_init();
355 }
356