xref: /linux/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * omap_hwmod_2xxx_ipblock_data.c - common IP block data for OMAP2xxx
4  *
5  * Copyright (C) 2011 Nokia Corporation
6  * Paul Walmsley
7  */
8 
9 #include <linux/types.h>
10 
11 #include "omap_hwmod.h"
12 #include "omap_hwmod_common_data.h"
13 #include "cm-regbits-24xx.h"
14 #include "prm-regbits-24xx.h"
15 #include "wd_timer.h"
16 
17 /*
18  * 'dispc' class
19  * display controller
20  */
21 
22 static struct omap_hwmod_class_sysconfig omap2_dispc_sysc = {
23 	.rev_offs	= 0x0000,
24 	.sysc_offs	= 0x0010,
25 	.syss_offs	= 0x0014,
26 	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
27 			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
28 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
29 			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
30 	.sysc_fields	= &omap_hwmod_sysc_type1,
31 };
32 
33 static struct omap_hwmod_class omap2_dispc_hwmod_class = {
34 	.name	= "dispc",
35 	.sysc	= &omap2_dispc_sysc,
36 };
37 
38 /* OMAP2xxx Timer Common */
39 static struct omap_hwmod_class_sysconfig omap2xxx_timer_sysc = {
40 	.rev_offs	= 0x0000,
41 	.sysc_offs	= 0x0010,
42 	.syss_offs	= 0x0014,
43 	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
44 			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
45 			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
46 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
47 	.sysc_fields	= &omap_hwmod_sysc_type1,
48 };
49 
50 static struct omap_hwmod_class omap2xxx_timer_hwmod_class = {
51 	.name	= "timer",
52 	.sysc	= &omap2xxx_timer_sysc,
53 };
54 
55 /*
56  * 'wd_timer' class
57  * 32-bit watchdog upward counter that generates a pulse on the reset pin on
58  * overflow condition
59  */
60 
61 static struct omap_hwmod_class_sysconfig omap2xxx_wd_timer_sysc = {
62 	.rev_offs	= 0x0000,
63 	.sysc_offs	= 0x0010,
64 	.syss_offs	= 0x0014,
65 	.sysc_flags	= (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET |
66 			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
67 	.sysc_fields	= &omap_hwmod_sysc_type1,
68 };
69 
70 static struct omap_hwmod_class omap2xxx_wd_timer_hwmod_class = {
71 	.name		= "wd_timer",
72 	.sysc		= &omap2xxx_wd_timer_sysc,
73 	.pre_shutdown	= &omap2_wd_timer_disable,
74 	.reset		= &omap2_wd_timer_reset,
75 };
76 
77 /*
78  * 'gpio' class
79  * general purpose io module
80  */
81 static struct omap_hwmod_class_sysconfig omap2xxx_gpio_sysc = {
82 	.rev_offs	= 0x0000,
83 	.sysc_offs	= 0x0010,
84 	.syss_offs	= 0x0014,
85 	.sysc_flags	= (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
86 			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
87 			   SYSS_HAS_RESET_STATUS),
88 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
89 	.sysc_fields	= &omap_hwmod_sysc_type1,
90 };
91 
92 struct omap_hwmod_class omap2xxx_gpio_hwmod_class = {
93 	.name = "gpio",
94 	.sysc = &omap2xxx_gpio_sysc,
95 };
96 
97 /*
98  * 'mailbox' class
99  * mailbox module allowing communication between the on-chip processors
100  * using a queued mailbox-interrupt mechanism.
101  */
102 
103 static struct omap_hwmod_class_sysconfig omap2xxx_mailbox_sysc = {
104 	.rev_offs	= 0x000,
105 	.sysc_offs	= 0x010,
106 	.syss_offs	= 0x014,
107 	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
108 			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
109 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
110 	.sysc_fields	= &omap_hwmod_sysc_type1,
111 };
112 
113 struct omap_hwmod_class omap2xxx_mailbox_hwmod_class = {
114 	.name	= "mailbox",
115 	.sysc	= &omap2xxx_mailbox_sysc,
116 };
117 
118 /*
119  * 'mcspi' class
120  * multichannel serial port interface (mcspi) / master/slave synchronous serial
121  * bus
122  */
123 
124 static struct omap_hwmod_class_sysconfig omap2xxx_mcspi_sysc = {
125 	.rev_offs	= 0x0000,
126 	.sysc_offs	= 0x0010,
127 	.syss_offs	= 0x0014,
128 	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
129 				SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
130 				SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
131 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
132 	.sysc_fields	= &omap_hwmod_sysc_type1,
133 };
134 
135 struct omap_hwmod_class omap2xxx_mcspi_class = {
136 	.name	= "mcspi",
137 	.sysc	= &omap2xxx_mcspi_sysc,
138 };
139 
140 /*
141  * 'gpmc' class
142  * general purpose memory controller
143  */
144 
145 static struct omap_hwmod_class_sysconfig omap2xxx_gpmc_sysc = {
146 	.rev_offs	= 0x0000,
147 	.sysc_offs	= 0x0010,
148 	.syss_offs	= 0x0014,
149 	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
150 			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
151 	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
152 	.sysc_fields	= &omap_hwmod_sysc_type1,
153 };
154 
155 static struct omap_hwmod_class omap2xxx_gpmc_hwmod_class = {
156 	.name	= "gpmc",
157 	.sysc	= &omap2xxx_gpmc_sysc,
158 };
159 
160 /*
161  * IP blocks
162  */
163 
164 /* L3 */
165 struct omap_hwmod omap2xxx_l3_main_hwmod = {
166 	.name		= "l3_main",
167 	.class		= &l3_hwmod_class,
168 	.flags		= HWMOD_NO_IDLEST,
169 };
170 
171 /* L4 CORE */
172 struct omap_hwmod omap2xxx_l4_core_hwmod = {
173 	.name		= "l4_core",
174 	.class		= &l4_hwmod_class,
175 	.flags		= HWMOD_NO_IDLEST,
176 };
177 
178 /* L4 WKUP */
179 struct omap_hwmod omap2xxx_l4_wkup_hwmod = {
180 	.name		= "l4_wkup",
181 	.class		= &l4_hwmod_class,
182 	.flags		= HWMOD_NO_IDLEST,
183 };
184 
185 /* MPU */
186 struct omap_hwmod omap2xxx_mpu_hwmod = {
187 	.name		= "mpu",
188 	.class		= &mpu_hwmod_class,
189 	.main_clk	= "mpu_ck",
190 };
191 
192 /* timer3 */
193 struct omap_hwmod omap2xxx_timer3_hwmod = {
194 	.name		= "timer3",
195 	.main_clk	= "gpt3_fck",
196 	.prcm		= {
197 		.omap2 = {
198 			.module_offs = CORE_MOD,
199 			.idlest_reg_id = 1,
200 			.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,
201 		},
202 	},
203 	.class		= &omap2xxx_timer_hwmod_class,
204 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
205 };
206 
207 /* timer4 */
208 struct omap_hwmod omap2xxx_timer4_hwmod = {
209 	.name		= "timer4",
210 	.main_clk	= "gpt4_fck",
211 	.prcm		= {
212 		.omap2 = {
213 			.module_offs = CORE_MOD,
214 			.idlest_reg_id = 1,
215 			.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,
216 		},
217 	},
218 	.class		= &omap2xxx_timer_hwmod_class,
219 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
220 };
221 
222 /* timer5 */
223 struct omap_hwmod omap2xxx_timer5_hwmod = {
224 	.name		= "timer5",
225 	.main_clk	= "gpt5_fck",
226 	.prcm		= {
227 		.omap2 = {
228 			.module_offs = CORE_MOD,
229 			.idlest_reg_id = 1,
230 			.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,
231 		},
232 	},
233 	.class		= &omap2xxx_timer_hwmod_class,
234 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
235 };
236 
237 /* timer6 */
238 struct omap_hwmod omap2xxx_timer6_hwmod = {
239 	.name		= "timer6",
240 	.main_clk	= "gpt6_fck",
241 	.prcm		= {
242 		.omap2 = {
243 			.module_offs = CORE_MOD,
244 			.idlest_reg_id = 1,
245 			.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
246 		},
247 	},
248 	.class		= &omap2xxx_timer_hwmod_class,
249 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
250 };
251 
252 /* timer7 */
253 struct omap_hwmod omap2xxx_timer7_hwmod = {
254 	.name		= "timer7",
255 	.main_clk	= "gpt7_fck",
256 	.prcm		= {
257 		.omap2 = {
258 			.module_offs = CORE_MOD,
259 			.idlest_reg_id = 1,
260 			.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,
261 		},
262 	},
263 	.class		= &omap2xxx_timer_hwmod_class,
264 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
265 };
266 
267 /* timer8 */
268 struct omap_hwmod omap2xxx_timer8_hwmod = {
269 	.name		= "timer8",
270 	.main_clk	= "gpt8_fck",
271 	.prcm		= {
272 		.omap2 = {
273 			.module_offs = CORE_MOD,
274 			.idlest_reg_id = 1,
275 			.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT,
276 		},
277 	},
278 	.class		= &omap2xxx_timer_hwmod_class,
279 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
280 };
281 
282 /* timer9 */
283 struct omap_hwmod omap2xxx_timer9_hwmod = {
284 	.name		= "timer9",
285 	.main_clk	= "gpt9_fck",
286 	.prcm		= {
287 		.omap2 = {
288 			.module_offs = CORE_MOD,
289 			.idlest_reg_id = 1,
290 			.idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
291 		},
292 	},
293 	.class		= &omap2xxx_timer_hwmod_class,
294 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
295 };
296 
297 /* timer10 */
298 struct omap_hwmod omap2xxx_timer10_hwmod = {
299 	.name		= "timer10",
300 	.main_clk	= "gpt10_fck",
301 	.prcm		= {
302 		.omap2 = {
303 			.module_offs = CORE_MOD,
304 			.idlest_reg_id = 1,
305 			.idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT,
306 		},
307 	},
308 	.class		= &omap2xxx_timer_hwmod_class,
309 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
310 };
311 
312 /* timer11 */
313 struct omap_hwmod omap2xxx_timer11_hwmod = {
314 	.name		= "timer11",
315 	.main_clk	= "gpt11_fck",
316 	.prcm		= {
317 		.omap2 = {
318 			.module_offs = CORE_MOD,
319 			.idlest_reg_id = 1,
320 			.idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
321 		},
322 	},
323 	.class		= &omap2xxx_timer_hwmod_class,
324 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
325 };
326 
327 /* timer12 */
328 struct omap_hwmod omap2xxx_timer12_hwmod = {
329 	.name		= "timer12",
330 	.main_clk	= "gpt12_fck",
331 	.prcm		= {
332 		.omap2 = {
333 			.module_offs = CORE_MOD,
334 			.idlest_reg_id = 1,
335 			.idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT,
336 		},
337 	},
338 	.class		= &omap2xxx_timer_hwmod_class,
339 	.flags          = HWMOD_SET_DEFAULT_CLOCKACT,
340 };
341 
342 /* wd_timer2 */
343 struct omap_hwmod omap2xxx_wd_timer2_hwmod = {
344 	.name		= "wd_timer2",
345 	.class		= &omap2xxx_wd_timer_hwmod_class,
346 	.main_clk	= "mpu_wdt_fck",
347 	.prcm		= {
348 		.omap2 = {
349 			.module_offs = WKUP_MOD,
350 			.idlest_reg_id = 1,
351 			.idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
352 		},
353 	},
354 };
355 
356 /* UART1 */
357 
358 struct omap_hwmod omap2xxx_uart1_hwmod = {
359 	.name		= "uart1",
360 	.main_clk	= "uart1_fck",
361 	.flags		= DEBUG_OMAP2UART1_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
362 	.prcm		= {
363 		.omap2 = {
364 			.module_offs = CORE_MOD,
365 			.idlest_reg_id = 1,
366 			.idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
367 		},
368 	},
369 	.class		= &omap2_uart_class,
370 };
371 
372 /* UART2 */
373 
374 struct omap_hwmod omap2xxx_uart2_hwmod = {
375 	.name		= "uart2",
376 	.main_clk	= "uart2_fck",
377 	.flags		= DEBUG_OMAP2UART2_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
378 	.prcm		= {
379 		.omap2 = {
380 			.module_offs = CORE_MOD,
381 			.idlest_reg_id = 1,
382 			.idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
383 		},
384 	},
385 	.class		= &omap2_uart_class,
386 };
387 
388 /* UART3 */
389 
390 struct omap_hwmod omap2xxx_uart3_hwmod = {
391 	.name		= "uart3",
392 	.main_clk	= "uart3_fck",
393 	.flags		= DEBUG_OMAP2UART3_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
394 	.prcm		= {
395 		.omap2 = {
396 			.module_offs = CORE_MOD,
397 			.idlest_reg_id = 2,
398 			.idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
399 		},
400 	},
401 	.class		= &omap2_uart_class,
402 };
403 
404 /* dss */
405 
406 static struct omap_hwmod_opt_clk dss_opt_clks[] = {
407 	/*
408 	 * The DSS HW needs all DSS clocks enabled during reset. The dss_core
409 	 * driver does not use these clocks.
410 	 */
411 	{ .role = "tv_clk", .clk = "dss_54m_fck" },
412 	{ .role = "sys_clk", .clk = "dss2_fck" },
413 };
414 
415 struct omap_hwmod omap2xxx_dss_core_hwmod = {
416 	.name		= "dss_core",
417 	.class		= &omap2_dss_hwmod_class,
418 	.main_clk	= "dss1_fck", /* instead of dss_fck */
419 	.prcm		= {
420 		.omap2 = {
421 			.module_offs = CORE_MOD,
422 			.idlest_reg_id = 1,
423 		},
424 	},
425 	.opt_clks	= dss_opt_clks,
426 	.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
427 	.flags		= HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
428 };
429 
430 struct omap_hwmod omap2xxx_dss_dispc_hwmod = {
431 	.name		= "dss_dispc",
432 	.class		= &omap2_dispc_hwmod_class,
433 	.main_clk	= "dss1_fck",
434 	.prcm		= {
435 		.omap2 = {
436 			.module_offs = CORE_MOD,
437 			.idlest_reg_id = 1,
438 		},
439 	},
440 	.flags		= HWMOD_NO_IDLEST,
441 	.dev_attr	= &omap2_3_dss_dispc_dev_attr,
442 };
443 
444 static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
445 	{ .role = "ick", .clk = "dss_ick" },
446 };
447 
448 struct omap_hwmod omap2xxx_dss_rfbi_hwmod = {
449 	.name		= "dss_rfbi",
450 	.class		= &omap2_rfbi_hwmod_class,
451 	.main_clk	= "dss1_fck",
452 	.prcm		= {
453 		.omap2 = {
454 			.module_offs = CORE_MOD,
455 		},
456 	},
457 	.opt_clks	= dss_rfbi_opt_clks,
458 	.opt_clks_cnt	= ARRAY_SIZE(dss_rfbi_opt_clks),
459 	.flags		= HWMOD_NO_IDLEST,
460 };
461 
462 struct omap_hwmod omap2xxx_dss_venc_hwmod = {
463 	.name		= "dss_venc",
464 	.class		= &omap2_venc_hwmod_class,
465 	.main_clk	= "dss_54m_fck",
466 	.prcm		= {
467 		.omap2 = {
468 			.module_offs = CORE_MOD,
469 		},
470 	},
471 	.flags		= HWMOD_NO_IDLEST,
472 };
473 
474 /* gpio1 */
475 struct omap_hwmod omap2xxx_gpio1_hwmod = {
476 	.name		= "gpio1",
477 	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
478 	.main_clk	= "gpios_fck",
479 	.prcm		= {
480 		.omap2 = {
481 			.module_offs = WKUP_MOD,
482 			.idlest_reg_id = 1,
483 			.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
484 		},
485 	},
486 	.class		= &omap2xxx_gpio_hwmod_class,
487 };
488 
489 /* gpio2 */
490 struct omap_hwmod omap2xxx_gpio2_hwmod = {
491 	.name		= "gpio2",
492 	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
493 	.main_clk	= "gpios_fck",
494 	.prcm		= {
495 		.omap2 = {
496 			.module_offs = WKUP_MOD,
497 			.idlest_reg_id = 1,
498 			.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
499 		},
500 	},
501 	.class		= &omap2xxx_gpio_hwmod_class,
502 };
503 
504 /* gpio3 */
505 struct omap_hwmod omap2xxx_gpio3_hwmod = {
506 	.name		= "gpio3",
507 	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
508 	.main_clk	= "gpios_fck",
509 	.prcm		= {
510 		.omap2 = {
511 			.module_offs = WKUP_MOD,
512 			.idlest_reg_id = 1,
513 			.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
514 		},
515 	},
516 	.class		= &omap2xxx_gpio_hwmod_class,
517 };
518 
519 /* gpio4 */
520 struct omap_hwmod omap2xxx_gpio4_hwmod = {
521 	.name		= "gpio4",
522 	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
523 	.main_clk	= "gpios_fck",
524 	.prcm		= {
525 		.omap2 = {
526 			.module_offs = WKUP_MOD,
527 			.idlest_reg_id = 1,
528 			.idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
529 		},
530 	},
531 	.class		= &omap2xxx_gpio_hwmod_class,
532 };
533 
534 /* mcspi1 */
535 struct omap_hwmod omap2xxx_mcspi1_hwmod = {
536 	.name		= "mcspi1",
537 	.main_clk	= "mcspi1_fck",
538 	.prcm		= {
539 		.omap2 = {
540 			.module_offs = CORE_MOD,
541 			.idlest_reg_id = 1,
542 			.idlest_idle_bit = OMAP24XX_ST_MCSPI1_SHIFT,
543 		},
544 	},
545 	.class		= &omap2xxx_mcspi_class,
546 };
547 
548 /* mcspi2 */
549 struct omap_hwmod omap2xxx_mcspi2_hwmod = {
550 	.name		= "mcspi2",
551 	.main_clk	= "mcspi2_fck",
552 	.prcm		= {
553 		.omap2 = {
554 			.module_offs = CORE_MOD,
555 			.idlest_reg_id = 1,
556 			.idlest_idle_bit = OMAP24XX_ST_MCSPI2_SHIFT,
557 		},
558 	},
559 	.class		= &omap2xxx_mcspi_class,
560 };
561 
562 /* gpmc */
563 struct omap_hwmod omap2xxx_gpmc_hwmod = {
564 	.name		= "gpmc",
565 	.class		= &omap2xxx_gpmc_hwmod_class,
566 	.main_clk	= "gpmc_fck",
567 	/* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */
568 	.flags		= HWMOD_NO_IDLEST | DEBUG_OMAP_GPMC_HWMOD_FLAGS,
569 	.prcm		= {
570 		.omap2	= {
571 			.module_offs = CORE_MOD,
572 		},
573 	},
574 };
575 
576 /* RNG */
577 
578 static struct omap_hwmod_class_sysconfig omap2_rng_sysc = {
579 	.rev_offs	= 0x3c,
580 	.sysc_offs	= 0x40,
581 	.syss_offs	= 0x44,
582 	.sysc_flags	= (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
583 			   SYSS_HAS_RESET_STATUS),
584 	.sysc_fields	= &omap_hwmod_sysc_type1,
585 };
586 
587 static struct omap_hwmod_class omap2_rng_hwmod_class = {
588 	.name		= "rng",
589 	.sysc		= &omap2_rng_sysc,
590 };
591 
592 struct omap_hwmod omap2xxx_rng_hwmod = {
593 	.name		= "rng",
594 	.main_clk	= "l4_ck",
595 	.prcm		= {
596 		.omap2 = {
597 			.module_offs = CORE_MOD,
598 			.idlest_reg_id = 4,
599 			.idlest_idle_bit = OMAP24XX_ST_RNG_SHIFT,
600 		},
601 	},
602 	/*
603 	 * XXX The first read from the SYSSTATUS register of the RNG
604 	 * after the SYSCONFIG SOFTRESET bit is set triggers an
605 	 * imprecise external abort.  It's unclear why this happens.
606 	 * Until this is analyzed, skip the IP block reset.
607 	 */
608 	.flags		= HWMOD_INIT_NO_RESET,
609 	.class		= &omap2_rng_hwmod_class,
610 };
611 
612 /* SHAM */
613 
614 static struct omap_hwmod_class_sysconfig omap2_sham_sysc = {
615 	.rev_offs	= 0x5c,
616 	.sysc_offs	= 0x60,
617 	.syss_offs	= 0x64,
618 	.sysc_flags	= (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
619 			   SYSS_HAS_RESET_STATUS),
620 	.sysc_fields	= &omap_hwmod_sysc_type1,
621 };
622 
623 static struct omap_hwmod_class omap2xxx_sham_class = {
624 	.name	= "sham",
625 	.sysc	= &omap2_sham_sysc,
626 };
627 
628 struct omap_hwmod omap2xxx_sham_hwmod = {
629 	.name		= "sham",
630 	.main_clk	= "l4_ck",
631 	.prcm		= {
632 		.omap2 = {
633 			.module_offs = CORE_MOD,
634 			.idlest_reg_id = 4,
635 			.idlest_idle_bit = OMAP24XX_ST_SHA_SHIFT,
636 		},
637 	},
638 	.class		= &omap2xxx_sham_class,
639 };
640 
641 /* AES */
642 
643 static struct omap_hwmod_class_sysconfig omap2_aes_sysc = {
644 	.rev_offs	= 0x44,
645 	.sysc_offs	= 0x48,
646 	.syss_offs	= 0x4c,
647 	.sysc_flags	= (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
648 			   SYSS_HAS_RESET_STATUS),
649 	.sysc_fields	= &omap_hwmod_sysc_type1,
650 };
651 
652 static struct omap_hwmod_class omap2xxx_aes_class = {
653 	.name	= "aes",
654 	.sysc	= &omap2_aes_sysc,
655 };
656 
657 struct omap_hwmod omap2xxx_aes_hwmod = {
658 	.name		= "aes",
659 	.main_clk	= "l4_ck",
660 	.prcm		= {
661 		.omap2 = {
662 			.module_offs = CORE_MOD,
663 			.idlest_reg_id = 4,
664 			.idlest_idle_bit = OMAP24XX_ST_AES_SHIFT,
665 		},
666 	},
667 	.class		= &omap2xxx_aes_class,
668 };
669