treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / arch / arm / mach-omap2 / omap_hwmod_54xx_data.c
blobcc5ad6acab1d9524c14041c9fefb74b5f56b3be7
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Hardware modules present on the OMAP54xx chips
5 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
7 * Paul Walmsley
8 * Benoit Cousson
10 * This file is automatically generated from the OMAP hardware databases.
11 * We respectfully ask that any modifications to this file be coordinated
12 * with the public linux-omap@vger.kernel.org mailing list and the
13 * authors above to ensure that the autogeneration scripts are kept
14 * up-to-date with the file contents.
17 #include <linux/io.h>
18 #include <linux/power/smartreflex.h>
20 #include <linux/omap-dma.h>
22 #include "omap_hwmod.h"
23 #include "omap_hwmod_common_data.h"
24 #include "cm1_54xx.h"
25 #include "cm2_54xx.h"
26 #include "prm54xx.h"
28 /* Base offset for all OMAP5 interrupts external to MPUSS */
29 #define OMAP54XX_IRQ_GIC_START 32
31 /* Base offset for all OMAP5 dma requests */
32 #define OMAP54XX_DMA_REQ_START 1
36 * IP blocks
40 * 'dmm' class
41 * instance(s): dmm
43 static struct omap_hwmod_class omap54xx_dmm_hwmod_class = {
44 .name = "dmm",
47 /* dmm */
48 static struct omap_hwmod omap54xx_dmm_hwmod = {
49 .name = "dmm",
50 .class = &omap54xx_dmm_hwmod_class,
51 .clkdm_name = "emif_clkdm",
52 .prcm = {
53 .omap4 = {
54 .clkctrl_offs = OMAP54XX_CM_EMIF_DMM_CLKCTRL_OFFSET,
55 .context_offs = OMAP54XX_RM_EMIF_DMM_CONTEXT_OFFSET,
61 * 'l3' class
62 * instance(s): l3_instr, l3_main_1, l3_main_2, l3_main_3
64 static struct omap_hwmod_class omap54xx_l3_hwmod_class = {
65 .name = "l3",
68 /* l3_instr */
69 static struct omap_hwmod omap54xx_l3_instr_hwmod = {
70 .name = "l3_instr",
71 .class = &omap54xx_l3_hwmod_class,
72 .clkdm_name = "l3instr_clkdm",
73 .prcm = {
74 .omap4 = {
75 .clkctrl_offs = OMAP54XX_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET,
76 .context_offs = OMAP54XX_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET,
77 .modulemode = MODULEMODE_HWCTRL,
82 /* l3_main_1 */
83 static struct omap_hwmod omap54xx_l3_main_1_hwmod = {
84 .name = "l3_main_1",
85 .class = &omap54xx_l3_hwmod_class,
86 .clkdm_name = "l3main1_clkdm",
87 .prcm = {
88 .omap4 = {
89 .clkctrl_offs = OMAP54XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL_OFFSET,
90 .context_offs = OMAP54XX_RM_L3MAIN1_L3_MAIN_1_CONTEXT_OFFSET,
95 /* l3_main_2 */
96 static struct omap_hwmod omap54xx_l3_main_2_hwmod = {
97 .name = "l3_main_2",
98 .class = &omap54xx_l3_hwmod_class,
99 .clkdm_name = "l3main2_clkdm",
100 .prcm = {
101 .omap4 = {
102 .clkctrl_offs = OMAP54XX_CM_L3MAIN2_L3_MAIN_2_CLKCTRL_OFFSET,
103 .context_offs = OMAP54XX_RM_L3MAIN2_L3_MAIN_2_CONTEXT_OFFSET,
108 /* l3_main_3 */
109 static struct omap_hwmod omap54xx_l3_main_3_hwmod = {
110 .name = "l3_main_3",
111 .class = &omap54xx_l3_hwmod_class,
112 .clkdm_name = "l3instr_clkdm",
113 .prcm = {
114 .omap4 = {
115 .clkctrl_offs = OMAP54XX_CM_L3INSTR_L3_MAIN_3_CLKCTRL_OFFSET,
116 .context_offs = OMAP54XX_RM_L3INSTR_L3_MAIN_3_CONTEXT_OFFSET,
117 .modulemode = MODULEMODE_HWCTRL,
123 * 'l4' class
124 * instance(s): l4_abe, l4_cfg, l4_per, l4_wkup
126 static struct omap_hwmod_class omap54xx_l4_hwmod_class = {
127 .name = "l4",
130 /* l4_abe */
131 static struct omap_hwmod omap54xx_l4_abe_hwmod = {
132 .name = "l4_abe",
133 .class = &omap54xx_l4_hwmod_class,
134 .clkdm_name = "abe_clkdm",
135 .prcm = {
136 .omap4 = {
137 .clkctrl_offs = OMAP54XX_CM_ABE_L4_ABE_CLKCTRL_OFFSET,
138 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
143 /* l4_cfg */
144 static struct omap_hwmod omap54xx_l4_cfg_hwmod = {
145 .name = "l4_cfg",
146 .class = &omap54xx_l4_hwmod_class,
147 .clkdm_name = "l4cfg_clkdm",
148 .prcm = {
149 .omap4 = {
150 .clkctrl_offs = OMAP54XX_CM_L4CFG_L4_CFG_CLKCTRL_OFFSET,
151 .context_offs = OMAP54XX_RM_L4CFG_L4_CFG_CONTEXT_OFFSET,
156 /* l4_per */
157 static struct omap_hwmod omap54xx_l4_per_hwmod = {
158 .name = "l4_per",
159 .class = &omap54xx_l4_hwmod_class,
160 .clkdm_name = "l4per_clkdm",
161 .prcm = {
162 .omap4 = {
163 .clkctrl_offs = OMAP54XX_CM_L4PER_L4_PER_CLKCTRL_OFFSET,
164 .context_offs = OMAP54XX_RM_L4PER_L4_PER_CONTEXT_OFFSET,
169 /* l4_wkup */
170 static struct omap_hwmod omap54xx_l4_wkup_hwmod = {
171 .name = "l4_wkup",
172 .class = &omap54xx_l4_hwmod_class,
173 .clkdm_name = "wkupaon_clkdm",
174 .prcm = {
175 .omap4 = {
176 .clkctrl_offs = OMAP54XX_CM_WKUPAON_L4_WKUP_CLKCTRL_OFFSET,
177 .context_offs = OMAP54XX_RM_WKUPAON_L4_WKUP_CONTEXT_OFFSET,
183 * 'mpu_bus' class
184 * instance(s): mpu_private
186 static struct omap_hwmod_class omap54xx_mpu_bus_hwmod_class = {
187 .name = "mpu_bus",
190 /* mpu_private */
191 static struct omap_hwmod omap54xx_mpu_private_hwmod = {
192 .name = "mpu_private",
193 .class = &omap54xx_mpu_bus_hwmod_class,
194 .clkdm_name = "mpu_clkdm",
195 .prcm = {
196 .omap4 = {
197 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
203 * 'counter' class
204 * 32-bit ordinary counter, clocked by the falling edge of the 32 khz clock
207 static struct omap_hwmod_class_sysconfig omap54xx_counter_sysc = {
208 .rev_offs = 0x0000,
209 .sysc_offs = 0x0010,
210 .sysc_flags = SYSC_HAS_SIDLEMODE,
211 .idlemodes = (SIDLE_FORCE | SIDLE_NO),
212 .sysc_fields = &omap_hwmod_sysc_type1,
215 static struct omap_hwmod_class omap54xx_counter_hwmod_class = {
216 .name = "counter",
217 .sysc = &omap54xx_counter_sysc,
220 /* counter_32k */
221 static struct omap_hwmod omap54xx_counter_32k_hwmod = {
222 .name = "counter_32k",
223 .class = &omap54xx_counter_hwmod_class,
224 .clkdm_name = "wkupaon_clkdm",
225 .flags = HWMOD_SWSUP_SIDLE,
226 .main_clk = "wkupaon_iclk_mux",
227 .prcm = {
228 .omap4 = {
229 .clkctrl_offs = OMAP54XX_CM_WKUPAON_COUNTER_32K_CLKCTRL_OFFSET,
230 .context_offs = OMAP54XX_RM_WKUPAON_COUNTER_32K_CONTEXT_OFFSET,
236 * 'dma' class
237 * dma controller for data exchange between memory to memory (i.e. internal or
238 * external memory) and gp peripherals to memory or memory to gp peripherals
241 static struct omap_hwmod_class_sysconfig omap54xx_dma_sysc = {
242 .rev_offs = 0x0000,
243 .sysc_offs = 0x002c,
244 .syss_offs = 0x0028,
245 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
246 SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
247 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
248 SYSS_HAS_RESET_STATUS),
249 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
250 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
251 .sysc_fields = &omap_hwmod_sysc_type1,
254 static struct omap_hwmod_class omap54xx_dma_hwmod_class = {
255 .name = "dma",
256 .sysc = &omap54xx_dma_sysc,
259 /* dma dev_attr */
260 static struct omap_dma_dev_attr dma_dev_attr = {
261 .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
262 IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
263 .lch_count = 32,
266 /* dma_system */
267 static struct omap_hwmod omap54xx_dma_system_hwmod = {
268 .name = "dma_system",
269 .class = &omap54xx_dma_hwmod_class,
270 .clkdm_name = "dma_clkdm",
271 .main_clk = "l3_iclk_div",
272 .prcm = {
273 .omap4 = {
274 .clkctrl_offs = OMAP54XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET,
275 .context_offs = OMAP54XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET,
278 .dev_attr = &dma_dev_attr,
282 * 'dmic' class
283 * digital microphone controller
286 static struct omap_hwmod_class_sysconfig omap54xx_dmic_sysc = {
287 .rev_offs = 0x0000,
288 .sysc_offs = 0x0010,
289 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
290 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
291 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
292 SIDLE_SMART_WKUP),
293 .sysc_fields = &omap_hwmod_sysc_type2,
296 static struct omap_hwmod_class omap54xx_dmic_hwmod_class = {
297 .name = "dmic",
298 .sysc = &omap54xx_dmic_sysc,
301 /* dmic */
302 static struct omap_hwmod omap54xx_dmic_hwmod = {
303 .name = "dmic",
304 .class = &omap54xx_dmic_hwmod_class,
305 .clkdm_name = "abe_clkdm",
306 .main_clk = "dmic_gfclk",
307 .prcm = {
308 .omap4 = {
309 .clkctrl_offs = OMAP54XX_CM_ABE_DMIC_CLKCTRL_OFFSET,
310 .context_offs = OMAP54XX_RM_ABE_DMIC_CONTEXT_OFFSET,
311 .modulemode = MODULEMODE_SWCTRL,
317 * 'dss' class
318 * display sub-system
320 static struct omap_hwmod_class_sysconfig omap54xx_dss_sysc = {
321 .rev_offs = 0x0000,
322 .syss_offs = 0x0014,
323 .sysc_flags = SYSS_HAS_RESET_STATUS,
326 static struct omap_hwmod_class omap54xx_dss_hwmod_class = {
327 .name = "dss",
328 .sysc = &omap54xx_dss_sysc,
329 .reset = omap_dss_reset,
332 /* dss */
333 static struct omap_hwmod_opt_clk dss_opt_clks[] = {
334 { .role = "32khz_clk", .clk = "dss_32khz_clk" },
335 { .role = "sys_clk", .clk = "dss_sys_clk" },
336 { .role = "hdmi_clk", .clk = "dss_48mhz_clk" },
339 static struct omap_hwmod omap54xx_dss_hwmod = {
340 .name = "dss_core",
341 .class = &omap54xx_dss_hwmod_class,
342 .clkdm_name = "dss_clkdm",
343 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
344 .main_clk = "dss_dss_clk",
345 .prcm = {
346 .omap4 = {
347 .clkctrl_offs = OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET,
348 .context_offs = OMAP54XX_RM_DSS_DSS_CONTEXT_OFFSET,
349 .modulemode = MODULEMODE_SWCTRL,
352 .opt_clks = dss_opt_clks,
353 .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
357 * 'dispc' class
358 * display controller
361 static struct omap_hwmod_class_sysconfig omap54xx_dispc_sysc = {
362 .rev_offs = 0x0000,
363 .sysc_offs = 0x0010,
364 .syss_offs = 0x0014,
365 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
366 SYSC_HAS_ENAWAKEUP | SYSC_HAS_MIDLEMODE |
367 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
368 SYSS_HAS_RESET_STATUS),
369 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
370 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
371 .sysc_fields = &omap_hwmod_sysc_type1,
374 static struct omap_hwmod_class omap54xx_dispc_hwmod_class = {
375 .name = "dispc",
376 .sysc = &omap54xx_dispc_sysc,
379 /* dss_dispc */
380 static struct omap_hwmod_opt_clk dss_dispc_opt_clks[] = {
381 { .role = "sys_clk", .clk = "dss_sys_clk" },
384 /* dss_dispc dev_attr */
385 static struct omap_dss_dispc_dev_attr dss_dispc_dev_attr = {
386 .has_framedonetv_irq = 1,
387 .manager_count = 4,
390 static struct omap_hwmod omap54xx_dss_dispc_hwmod = {
391 .name = "dss_dispc",
392 .class = &omap54xx_dispc_hwmod_class,
393 .clkdm_name = "dss_clkdm",
394 .main_clk = "dss_dss_clk",
395 .prcm = {
396 .omap4 = {
397 .clkctrl_offs = OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET,
398 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
401 .opt_clks = dss_dispc_opt_clks,
402 .opt_clks_cnt = ARRAY_SIZE(dss_dispc_opt_clks),
403 .dev_attr = &dss_dispc_dev_attr,
404 .parent_hwmod = &omap54xx_dss_hwmod,
408 * 'dsi1' class
409 * display serial interface controller
412 static struct omap_hwmod_class_sysconfig omap54xx_dsi1_sysc = {
413 .rev_offs = 0x0000,
414 .sysc_offs = 0x0010,
415 .syss_offs = 0x0014,
416 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
417 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
418 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
419 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
420 .sysc_fields = &omap_hwmod_sysc_type1,
423 static struct omap_hwmod_class omap54xx_dsi1_hwmod_class = {
424 .name = "dsi1",
425 .sysc = &omap54xx_dsi1_sysc,
428 /* dss_dsi1_a */
429 static struct omap_hwmod_opt_clk dss_dsi1_a_opt_clks[] = {
430 { .role = "sys_clk", .clk = "dss_sys_clk" },
433 static struct omap_hwmod omap54xx_dss_dsi1_a_hwmod = {
434 .name = "dss_dsi1",
435 .class = &omap54xx_dsi1_hwmod_class,
436 .clkdm_name = "dss_clkdm",
437 .main_clk = "dss_dss_clk",
438 .prcm = {
439 .omap4 = {
440 .clkctrl_offs = OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET,
441 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
444 .opt_clks = dss_dsi1_a_opt_clks,
445 .opt_clks_cnt = ARRAY_SIZE(dss_dsi1_a_opt_clks),
446 .parent_hwmod = &omap54xx_dss_hwmod,
449 /* dss_dsi1_c */
450 static struct omap_hwmod_opt_clk dss_dsi1_c_opt_clks[] = {
451 { .role = "sys_clk", .clk = "dss_sys_clk" },
454 static struct omap_hwmod omap54xx_dss_dsi1_c_hwmod = {
455 .name = "dss_dsi2",
456 .class = &omap54xx_dsi1_hwmod_class,
457 .clkdm_name = "dss_clkdm",
458 .main_clk = "dss_dss_clk",
459 .prcm = {
460 .omap4 = {
461 .clkctrl_offs = OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET,
462 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
465 .opt_clks = dss_dsi1_c_opt_clks,
466 .opt_clks_cnt = ARRAY_SIZE(dss_dsi1_c_opt_clks),
467 .parent_hwmod = &omap54xx_dss_hwmod,
471 * 'hdmi' class
472 * hdmi controller
475 static struct omap_hwmod_class_sysconfig omap54xx_hdmi_sysc = {
476 .rev_offs = 0x0000,
477 .sysc_offs = 0x0010,
478 .sysc_flags = (SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
479 SYSC_HAS_SOFTRESET),
480 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
481 SIDLE_SMART_WKUP),
482 .sysc_fields = &omap_hwmod_sysc_type2,
485 static struct omap_hwmod_class omap54xx_hdmi_hwmod_class = {
486 .name = "hdmi",
487 .sysc = &omap54xx_hdmi_sysc,
490 static struct omap_hwmod_opt_clk dss_hdmi_opt_clks[] = {
491 { .role = "sys_clk", .clk = "dss_sys_clk" },
494 static struct omap_hwmod omap54xx_dss_hdmi_hwmod = {
495 .name = "dss_hdmi",
496 .class = &omap54xx_hdmi_hwmod_class,
497 .clkdm_name = "dss_clkdm",
498 .main_clk = "dss_48mhz_clk",
499 .prcm = {
500 .omap4 = {
501 .clkctrl_offs = OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET,
502 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
505 .opt_clks = dss_hdmi_opt_clks,
506 .opt_clks_cnt = ARRAY_SIZE(dss_hdmi_opt_clks),
507 .parent_hwmod = &omap54xx_dss_hwmod,
511 * 'rfbi' class
512 * remote frame buffer interface
515 static struct omap_hwmod_class_sysconfig omap54xx_rfbi_sysc = {
516 .rev_offs = 0x0000,
517 .sysc_offs = 0x0010,
518 .syss_offs = 0x0014,
519 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
520 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
521 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
522 .sysc_fields = &omap_hwmod_sysc_type1,
525 static struct omap_hwmod_class omap54xx_rfbi_hwmod_class = {
526 .name = "rfbi",
527 .sysc = &omap54xx_rfbi_sysc,
530 /* dss_rfbi */
531 static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
532 { .role = "ick", .clk = "l3_iclk_div" },
535 static struct omap_hwmod omap54xx_dss_rfbi_hwmod = {
536 .name = "dss_rfbi",
537 .class = &omap54xx_rfbi_hwmod_class,
538 .clkdm_name = "dss_clkdm",
539 .prcm = {
540 .omap4 = {
541 .clkctrl_offs = OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET,
542 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
545 .opt_clks = dss_rfbi_opt_clks,
546 .opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
547 .parent_hwmod = &omap54xx_dss_hwmod,
551 * 'emif' class
552 * external memory interface no1 (wrapper)
555 static struct omap_hwmod_class_sysconfig omap54xx_emif_sysc = {
556 .rev_offs = 0x0000,
559 static struct omap_hwmod_class omap54xx_emif_hwmod_class = {
560 .name = "emif",
561 .sysc = &omap54xx_emif_sysc,
564 /* emif1 */
565 static struct omap_hwmod omap54xx_emif1_hwmod = {
566 .name = "emif1",
567 .class = &omap54xx_emif_hwmod_class,
568 .clkdm_name = "emif_clkdm",
569 .flags = HWMOD_INIT_NO_IDLE,
570 .main_clk = "dpll_core_h11x2_ck",
571 .prcm = {
572 .omap4 = {
573 .clkctrl_offs = OMAP54XX_CM_EMIF_EMIF1_CLKCTRL_OFFSET,
574 .context_offs = OMAP54XX_RM_EMIF_EMIF1_CONTEXT_OFFSET,
575 .modulemode = MODULEMODE_HWCTRL,
580 /* emif2 */
581 static struct omap_hwmod omap54xx_emif2_hwmod = {
582 .name = "emif2",
583 .class = &omap54xx_emif_hwmod_class,
584 .clkdm_name = "emif_clkdm",
585 .flags = HWMOD_INIT_NO_IDLE,
586 .main_clk = "dpll_core_h11x2_ck",
587 .prcm = {
588 .omap4 = {
589 .clkctrl_offs = OMAP54XX_CM_EMIF_EMIF2_CLKCTRL_OFFSET,
590 .context_offs = OMAP54XX_RM_EMIF_EMIF2_CONTEXT_OFFSET,
591 .modulemode = MODULEMODE_HWCTRL,
597 * 'kbd' class
598 * keyboard controller
601 static struct omap_hwmod_class_sysconfig omap54xx_kbd_sysc = {
602 .rev_offs = 0x0000,
603 .sysc_offs = 0x0010,
604 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SIDLEMODE |
605 SYSC_HAS_SOFTRESET),
606 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
607 .sysc_fields = &omap_hwmod_sysc_type1,
610 static struct omap_hwmod_class omap54xx_kbd_hwmod_class = {
611 .name = "kbd",
612 .sysc = &omap54xx_kbd_sysc,
615 /* kbd */
616 static struct omap_hwmod omap54xx_kbd_hwmod = {
617 .name = "kbd",
618 .class = &omap54xx_kbd_hwmod_class,
619 .clkdm_name = "wkupaon_clkdm",
620 .main_clk = "sys_32k_ck",
621 .prcm = {
622 .omap4 = {
623 .clkctrl_offs = OMAP54XX_CM_WKUPAON_KBD_CLKCTRL_OFFSET,
624 .context_offs = OMAP54XX_RM_WKUPAON_KBD_CONTEXT_OFFSET,
625 .modulemode = MODULEMODE_SWCTRL,
631 * 'mcpdm' class
632 * multi channel pdm controller (proprietary interface with phoenix power
633 * ic)
636 static struct omap_hwmod_class_sysconfig omap54xx_mcpdm_sysc = {
637 .rev_offs = 0x0000,
638 .sysc_offs = 0x0010,
639 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
640 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
641 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
642 SIDLE_SMART_WKUP),
643 .sysc_fields = &omap_hwmod_sysc_type2,
646 static struct omap_hwmod_class omap54xx_mcpdm_hwmod_class = {
647 .name = "mcpdm",
648 .sysc = &omap54xx_mcpdm_sysc,
651 /* mcpdm */
652 static struct omap_hwmod omap54xx_mcpdm_hwmod = {
653 .name = "mcpdm",
654 .class = &omap54xx_mcpdm_hwmod_class,
655 .clkdm_name = "abe_clkdm",
657 * It's suspected that the McPDM requires an off-chip main
658 * functional clock, controlled via I2C. This IP block is
659 * currently reset very early during boot, before I2C is
660 * available, so it doesn't seem that we have any choice in
661 * the kernel other than to avoid resetting it. XXX This is
662 * really a hardware issue workaround: every IP block should
663 * be able to source its main functional clock from either
664 * on-chip or off-chip sources. McPDM seems to be the only
665 * current exception.
668 .flags = HWMOD_EXT_OPT_MAIN_CLK | HWMOD_SWSUP_SIDLE,
669 .main_clk = "pad_clks_ck",
670 .prcm = {
671 .omap4 = {
672 .clkctrl_offs = OMAP54XX_CM_ABE_MCPDM_CLKCTRL_OFFSET,
673 .context_offs = OMAP54XX_RM_ABE_MCPDM_CONTEXT_OFFSET,
674 .modulemode = MODULEMODE_SWCTRL,
681 * 'mmu' class
682 * The memory management unit performs virtual to physical address translation
683 * for its requestors.
686 static struct omap_hwmod_class_sysconfig omap54xx_mmu_sysc = {
687 .rev_offs = 0x0000,
688 .sysc_offs = 0x0010,
689 .syss_offs = 0x0014,
690 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
691 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
692 SYSS_HAS_RESET_STATUS),
693 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
694 .sysc_fields = &omap_hwmod_sysc_type1,
697 static struct omap_hwmod_class omap54xx_mmu_hwmod_class = {
698 .name = "mmu",
699 .sysc = &omap54xx_mmu_sysc,
702 static struct omap_hwmod_rst_info omap54xx_mmu_dsp_resets[] = {
703 { .name = "mmu_cache", .rst_shift = 1 },
706 static struct omap_hwmod omap54xx_mmu_dsp_hwmod = {
707 .name = "mmu_dsp",
708 .class = &omap54xx_mmu_hwmod_class,
709 .clkdm_name = "dsp_clkdm",
710 .rst_lines = omap54xx_mmu_dsp_resets,
711 .rst_lines_cnt = ARRAY_SIZE(omap54xx_mmu_dsp_resets),
712 .main_clk = "dpll_iva_h11x2_ck",
713 .prcm = {
714 .omap4 = {
715 .clkctrl_offs = OMAP54XX_CM_DSP_DSP_CLKCTRL_OFFSET,
716 .rstctrl_offs = OMAP54XX_RM_DSP_RSTCTRL_OFFSET,
717 .context_offs = OMAP54XX_RM_DSP_DSP_CONTEXT_OFFSET,
718 .modulemode = MODULEMODE_HWCTRL,
723 /* mmu ipu */
724 static struct omap_hwmod_rst_info omap54xx_mmu_ipu_resets[] = {
725 { .name = "mmu_cache", .rst_shift = 2 },
728 static struct omap_hwmod omap54xx_mmu_ipu_hwmod = {
729 .name = "mmu_ipu",
730 .class = &omap54xx_mmu_hwmod_class,
731 .clkdm_name = "ipu_clkdm",
732 .rst_lines = omap54xx_mmu_ipu_resets,
733 .rst_lines_cnt = ARRAY_SIZE(omap54xx_mmu_ipu_resets),
734 .main_clk = "dpll_core_h22x2_ck",
735 .prcm = {
736 .omap4 = {
737 .clkctrl_offs = OMAP54XX_CM_IPU_IPU_CLKCTRL_OFFSET,
738 .rstctrl_offs = OMAP54XX_RM_IPU_RSTCTRL_OFFSET,
739 .context_offs = OMAP54XX_RM_IPU_IPU_CONTEXT_OFFSET,
740 .modulemode = MODULEMODE_HWCTRL,
746 * 'mpu' class
747 * mpu sub-system
750 static struct omap_hwmod_class omap54xx_mpu_hwmod_class = {
751 .name = "mpu",
754 /* mpu */
755 static struct omap_hwmod omap54xx_mpu_hwmod = {
756 .name = "mpu",
757 .class = &omap54xx_mpu_hwmod_class,
758 .clkdm_name = "mpu_clkdm",
759 .flags = HWMOD_INIT_NO_IDLE,
760 .main_clk = "dpll_mpu_m2_ck",
761 .prcm = {
762 .omap4 = {
763 .clkctrl_offs = OMAP54XX_CM_MPU_MPU_CLKCTRL_OFFSET,
764 .context_offs = OMAP54XX_RM_MPU_MPU_CONTEXT_OFFSET,
770 * 'spinlock' class
771 * spinlock provides hardware assistance for synchronizing the processes
772 * running on multiple processors
775 static struct omap_hwmod_class_sysconfig omap54xx_spinlock_sysc = {
776 .rev_offs = 0x0000,
777 .sysc_offs = 0x0010,
778 .syss_offs = 0x0014,
779 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
780 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
781 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
782 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
783 .sysc_fields = &omap_hwmod_sysc_type1,
786 static struct omap_hwmod_class omap54xx_spinlock_hwmod_class = {
787 .name = "spinlock",
788 .sysc = &omap54xx_spinlock_sysc,
791 /* spinlock */
792 static struct omap_hwmod omap54xx_spinlock_hwmod = {
793 .name = "spinlock",
794 .class = &omap54xx_spinlock_hwmod_class,
795 .clkdm_name = "l4cfg_clkdm",
796 .prcm = {
797 .omap4 = {
798 .clkctrl_offs = OMAP54XX_CM_L4CFG_SPINLOCK_CLKCTRL_OFFSET,
799 .context_offs = OMAP54XX_RM_L4CFG_SPINLOCK_CONTEXT_OFFSET,
805 * 'ocp2scp' class
806 * bridge to transform ocp interface protocol to scp (serial control port)
807 * protocol
810 static struct omap_hwmod_class_sysconfig omap54xx_ocp2scp_sysc = {
811 .rev_offs = 0x0000,
812 .sysc_offs = 0x0010,
813 .syss_offs = 0x0014,
814 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
815 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
816 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
817 .sysc_fields = &omap_hwmod_sysc_type1,
820 static struct omap_hwmod_class omap54xx_ocp2scp_hwmod_class = {
821 .name = "ocp2scp",
822 .sysc = &omap54xx_ocp2scp_sysc,
825 /* ocp2scp1 */
826 static struct omap_hwmod omap54xx_ocp2scp1_hwmod = {
827 .name = "ocp2scp1",
828 .class = &omap54xx_ocp2scp_hwmod_class,
829 .clkdm_name = "l3init_clkdm",
830 .main_clk = "l4_root_clk_div",
831 .prcm = {
832 .omap4 = {
833 .clkctrl_offs = OMAP54XX_CM_L3INIT_OCP2SCP1_CLKCTRL_OFFSET,
834 .context_offs = OMAP54XX_RM_L3INIT_OCP2SCP1_CONTEXT_OFFSET,
835 .modulemode = MODULEMODE_HWCTRL,
841 * 'timer' class
842 * general purpose timer module with accurate 1ms tick
843 * This class contains several variants: ['timer_1ms', 'timer']
846 static struct omap_hwmod_class_sysconfig omap54xx_timer_1ms_sysc = {
847 .rev_offs = 0x0000,
848 .sysc_offs = 0x0010,
849 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
850 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
851 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
852 SIDLE_SMART_WKUP),
853 .sysc_fields = &omap_hwmod_sysc_type2,
856 static struct omap_hwmod_class omap54xx_timer_1ms_hwmod_class = {
857 .name = "timer",
858 .sysc = &omap54xx_timer_1ms_sysc,
861 static struct omap_hwmod_class_sysconfig omap54xx_timer_sysc = {
862 .rev_offs = 0x0000,
863 .sysc_offs = 0x0010,
864 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
865 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
866 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
867 SIDLE_SMART_WKUP),
868 .sysc_fields = &omap_hwmod_sysc_type2,
871 static struct omap_hwmod_class omap54xx_timer_hwmod_class = {
872 .name = "timer",
873 .sysc = &omap54xx_timer_sysc,
876 /* timer1 */
877 static struct omap_hwmod omap54xx_timer1_hwmod = {
878 .name = "timer1",
879 .class = &omap54xx_timer_1ms_hwmod_class,
880 .clkdm_name = "wkupaon_clkdm",
881 .main_clk = "timer1_gfclk_mux",
882 .flags = HWMOD_SET_DEFAULT_CLOCKACT,
883 .prcm = {
884 .omap4 = {
885 .clkctrl_offs = OMAP54XX_CM_WKUPAON_TIMER1_CLKCTRL_OFFSET,
886 .context_offs = OMAP54XX_RM_WKUPAON_TIMER1_CONTEXT_OFFSET,
887 .modulemode = MODULEMODE_SWCTRL,
892 /* timer2 */
893 static struct omap_hwmod omap54xx_timer2_hwmod = {
894 .name = "timer2",
895 .class = &omap54xx_timer_1ms_hwmod_class,
896 .clkdm_name = "l4per_clkdm",
897 .main_clk = "timer2_gfclk_mux",
898 .flags = HWMOD_SET_DEFAULT_CLOCKACT,
899 .prcm = {
900 .omap4 = {
901 .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER2_CLKCTRL_OFFSET,
902 .context_offs = OMAP54XX_RM_L4PER_TIMER2_CONTEXT_OFFSET,
903 .modulemode = MODULEMODE_SWCTRL,
908 /* timer3 */
909 static struct omap_hwmod omap54xx_timer3_hwmod = {
910 .name = "timer3",
911 .class = &omap54xx_timer_hwmod_class,
912 .clkdm_name = "l4per_clkdm",
913 .main_clk = "timer3_gfclk_mux",
914 .prcm = {
915 .omap4 = {
916 .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER3_CLKCTRL_OFFSET,
917 .context_offs = OMAP54XX_RM_L4PER_TIMER3_CONTEXT_OFFSET,
918 .modulemode = MODULEMODE_SWCTRL,
923 /* timer4 */
924 static struct omap_hwmod omap54xx_timer4_hwmod = {
925 .name = "timer4",
926 .class = &omap54xx_timer_hwmod_class,
927 .clkdm_name = "l4per_clkdm",
928 .main_clk = "timer4_gfclk_mux",
929 .prcm = {
930 .omap4 = {
931 .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER4_CLKCTRL_OFFSET,
932 .context_offs = OMAP54XX_RM_L4PER_TIMER4_CONTEXT_OFFSET,
933 .modulemode = MODULEMODE_SWCTRL,
938 /* timer5 */
939 static struct omap_hwmod omap54xx_timer5_hwmod = {
940 .name = "timer5",
941 .class = &omap54xx_timer_hwmod_class,
942 .clkdm_name = "abe_clkdm",
943 .main_clk = "timer5_gfclk_mux",
944 .prcm = {
945 .omap4 = {
946 .clkctrl_offs = OMAP54XX_CM_ABE_TIMER5_CLKCTRL_OFFSET,
947 .context_offs = OMAP54XX_RM_ABE_TIMER5_CONTEXT_OFFSET,
948 .modulemode = MODULEMODE_SWCTRL,
953 /* timer6 */
954 static struct omap_hwmod omap54xx_timer6_hwmod = {
955 .name = "timer6",
956 .class = &omap54xx_timer_hwmod_class,
957 .clkdm_name = "abe_clkdm",
958 .main_clk = "timer6_gfclk_mux",
959 .prcm = {
960 .omap4 = {
961 .clkctrl_offs = OMAP54XX_CM_ABE_TIMER6_CLKCTRL_OFFSET,
962 .context_offs = OMAP54XX_RM_ABE_TIMER6_CONTEXT_OFFSET,
963 .modulemode = MODULEMODE_SWCTRL,
968 /* timer7 */
969 static struct omap_hwmod omap54xx_timer7_hwmod = {
970 .name = "timer7",
971 .class = &omap54xx_timer_hwmod_class,
972 .clkdm_name = "abe_clkdm",
973 .main_clk = "timer7_gfclk_mux",
974 .prcm = {
975 .omap4 = {
976 .clkctrl_offs = OMAP54XX_CM_ABE_TIMER7_CLKCTRL_OFFSET,
977 .context_offs = OMAP54XX_RM_ABE_TIMER7_CONTEXT_OFFSET,
978 .modulemode = MODULEMODE_SWCTRL,
983 /* timer8 */
984 static struct omap_hwmod omap54xx_timer8_hwmod = {
985 .name = "timer8",
986 .class = &omap54xx_timer_hwmod_class,
987 .clkdm_name = "abe_clkdm",
988 .main_clk = "timer8_gfclk_mux",
989 .prcm = {
990 .omap4 = {
991 .clkctrl_offs = OMAP54XX_CM_ABE_TIMER8_CLKCTRL_OFFSET,
992 .context_offs = OMAP54XX_RM_ABE_TIMER8_CONTEXT_OFFSET,
993 .modulemode = MODULEMODE_SWCTRL,
998 /* timer9 */
999 static struct omap_hwmod omap54xx_timer9_hwmod = {
1000 .name = "timer9",
1001 .class = &omap54xx_timer_hwmod_class,
1002 .clkdm_name = "l4per_clkdm",
1003 .main_clk = "timer9_gfclk_mux",
1004 .prcm = {
1005 .omap4 = {
1006 .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER9_CLKCTRL_OFFSET,
1007 .context_offs = OMAP54XX_RM_L4PER_TIMER9_CONTEXT_OFFSET,
1008 .modulemode = MODULEMODE_SWCTRL,
1013 /* timer10 */
1014 static struct omap_hwmod omap54xx_timer10_hwmod = {
1015 .name = "timer10",
1016 .class = &omap54xx_timer_1ms_hwmod_class,
1017 .clkdm_name = "l4per_clkdm",
1018 .main_clk = "timer10_gfclk_mux",
1019 .flags = HWMOD_SET_DEFAULT_CLOCKACT,
1020 .prcm = {
1021 .omap4 = {
1022 .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER10_CLKCTRL_OFFSET,
1023 .context_offs = OMAP54XX_RM_L4PER_TIMER10_CONTEXT_OFFSET,
1024 .modulemode = MODULEMODE_SWCTRL,
1029 /* timer11 */
1030 static struct omap_hwmod omap54xx_timer11_hwmod = {
1031 .name = "timer11",
1032 .class = &omap54xx_timer_hwmod_class,
1033 .clkdm_name = "l4per_clkdm",
1034 .main_clk = "timer11_gfclk_mux",
1035 .prcm = {
1036 .omap4 = {
1037 .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER11_CLKCTRL_OFFSET,
1038 .context_offs = OMAP54XX_RM_L4PER_TIMER11_CONTEXT_OFFSET,
1039 .modulemode = MODULEMODE_SWCTRL,
1045 * 'usb_host_hs' class
1046 * high-speed multi-port usb host controller
1049 static struct omap_hwmod_class_sysconfig omap54xx_usb_host_hs_sysc = {
1050 .rev_offs = 0x0000,
1051 .sysc_offs = 0x0010,
1052 .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_RESET_STATUS |
1053 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
1054 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1055 SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
1056 MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
1057 .sysc_fields = &omap_hwmod_sysc_type2,
1060 static struct omap_hwmod_class omap54xx_usb_host_hs_hwmod_class = {
1061 .name = "usb_host_hs",
1062 .sysc = &omap54xx_usb_host_hs_sysc,
1065 static struct omap_hwmod omap54xx_usb_host_hs_hwmod = {
1066 .name = "usb_host_hs",
1067 .class = &omap54xx_usb_host_hs_hwmod_class,
1068 .clkdm_name = "l3init_clkdm",
1070 * Errata: USBHOST Configured In Smart-Idle Can Lead To a Deadlock
1071 * id: i660
1073 * Description:
1074 * In the following configuration :
1075 * - USBHOST module is set to smart-idle mode
1076 * - PRCM asserts idle_req to the USBHOST module ( This typically
1077 * happens when the system is going to a low power mode : all ports
1078 * have been suspended, the master part of the USBHOST module has
1079 * entered the standby state, and SW has cut the functional clocks)
1080 * - an USBHOST interrupt occurs before the module is able to answer
1081 * idle_ack, typically a remote wakeup IRQ.
1082 * Then the USB HOST module will enter a deadlock situation where it
1083 * is no more accessible nor functional.
1085 * Workaround:
1086 * Don't use smart idle; use only force idle, hence HWMOD_SWSUP_SIDLE
1090 * Errata: USB host EHCI may stall when entering smart-standby mode
1091 * Id: i571
1093 * Description:
1094 * When the USBHOST module is set to smart-standby mode, and when it is
1095 * ready to enter the standby state (i.e. all ports are suspended and
1096 * all attached devices are in suspend mode), then it can wrongly assert
1097 * the Mstandby signal too early while there are still some residual OCP
1098 * transactions ongoing. If this condition occurs, the internal state
1099 * machine may go to an undefined state and the USB link may be stuck
1100 * upon the next resume.
1102 * Workaround:
1103 * Don't use smart standby; use only force standby,
1104 * hence HWMOD_SWSUP_MSTANDBY
1107 .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
1108 .main_clk = "l3init_60m_fclk",
1109 .prcm = {
1110 .omap4 = {
1111 .clkctrl_offs = OMAP54XX_CM_L3INIT_USB_HOST_HS_CLKCTRL_OFFSET,
1112 .context_offs = OMAP54XX_RM_L3INIT_USB_HOST_HS_CONTEXT_OFFSET,
1113 .modulemode = MODULEMODE_SWCTRL,
1119 * 'usb_tll_hs' class
1120 * usb_tll_hs module is the adapter on the usb_host_hs ports
1123 static struct omap_hwmod_class_sysconfig omap54xx_usb_tll_hs_sysc = {
1124 .rev_offs = 0x0000,
1125 .sysc_offs = 0x0010,
1126 .syss_offs = 0x0014,
1127 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
1128 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
1129 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
1130 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1131 .sysc_fields = &omap_hwmod_sysc_type1,
1134 static struct omap_hwmod_class omap54xx_usb_tll_hs_hwmod_class = {
1135 .name = "usb_tll_hs",
1136 .sysc = &omap54xx_usb_tll_hs_sysc,
1139 static struct omap_hwmod omap54xx_usb_tll_hs_hwmod = {
1140 .name = "usb_tll_hs",
1141 .class = &omap54xx_usb_tll_hs_hwmod_class,
1142 .clkdm_name = "l3init_clkdm",
1143 .main_clk = "l4_root_clk_div",
1144 .prcm = {
1145 .omap4 = {
1146 .clkctrl_offs = OMAP54XX_CM_L3INIT_USB_TLL_HS_CLKCTRL_OFFSET,
1147 .context_offs = OMAP54XX_RM_L3INIT_USB_TLL_HS_CONTEXT_OFFSET,
1148 .modulemode = MODULEMODE_HWCTRL,
1154 * 'usb_otg_ss' class
1155 * 2.0 super speed (usb_otg_ss) controller
1158 static struct omap_hwmod_class_sysconfig omap54xx_usb_otg_ss_sysc = {
1159 .rev_offs = 0x0000,
1160 .sysc_offs = 0x0010,
1161 .sysc_flags = (SYSC_HAS_DMADISABLE | SYSC_HAS_MIDLEMODE |
1162 SYSC_HAS_SIDLEMODE),
1163 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1164 SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
1165 MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
1166 .sysc_fields = &omap_hwmod_sysc_type2,
1169 static struct omap_hwmod_class omap54xx_usb_otg_ss_hwmod_class = {
1170 .name = "usb_otg_ss",
1171 .sysc = &omap54xx_usb_otg_ss_sysc,
1174 /* usb_otg_ss */
1175 static struct omap_hwmod_opt_clk usb_otg_ss_opt_clks[] = {
1176 { .role = "refclk960m", .clk = "usb_otg_ss_refclk960m" },
1179 static struct omap_hwmod omap54xx_usb_otg_ss_hwmod = {
1180 .name = "usb_otg_ss",
1181 .class = &omap54xx_usb_otg_ss_hwmod_class,
1182 .clkdm_name = "l3init_clkdm",
1183 .flags = HWMOD_SWSUP_SIDLE,
1184 .main_clk = "dpll_core_h13x2_ck",
1185 .prcm = {
1186 .omap4 = {
1187 .clkctrl_offs = OMAP54XX_CM_L3INIT_USB_OTG_SS_CLKCTRL_OFFSET,
1188 .context_offs = OMAP54XX_RM_L3INIT_USB_OTG_SS_CONTEXT_OFFSET,
1189 .modulemode = MODULEMODE_HWCTRL,
1192 .opt_clks = usb_otg_ss_opt_clks,
1193 .opt_clks_cnt = ARRAY_SIZE(usb_otg_ss_opt_clks),
1198 * 'ocp2scp' class
1199 * bridge to transform ocp interface protocol to scp (serial control port)
1200 * protocol
1202 /* ocp2scp3 */
1203 static struct omap_hwmod omap54xx_ocp2scp3_hwmod;
1204 /* l4_cfg -> ocp2scp3 */
1205 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__ocp2scp3 = {
1206 .master = &omap54xx_l4_cfg_hwmod,
1207 .slave = &omap54xx_ocp2scp3_hwmod,
1208 .clk = "l4_root_clk_div",
1209 .user = OCP_USER_MPU | OCP_USER_SDMA,
1212 static struct omap_hwmod omap54xx_ocp2scp3_hwmod = {
1213 .name = "ocp2scp3",
1214 .class = &omap54xx_ocp2scp_hwmod_class,
1215 .clkdm_name = "l3init_clkdm",
1216 .prcm = {
1217 .omap4 = {
1218 .clkctrl_offs = OMAP54XX_CM_L3INIT_OCP2SCP3_CLKCTRL_OFFSET,
1219 .context_offs = OMAP54XX_RM_L3INIT_OCP2SCP3_CONTEXT_OFFSET,
1220 .modulemode = MODULEMODE_HWCTRL,
1226 * 'sata' class
1227 * sata: serial ata interface gen2 compliant ( 1 rx/ 1 tx)
1230 static struct omap_hwmod_class_sysconfig omap54xx_sata_sysc = {
1231 .rev_offs = 0x00fc,
1232 .sysc_offs = 0x0000,
1233 .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
1234 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1235 SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
1236 MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
1237 .sysc_fields = &omap_hwmod_sysc_type2,
1240 static struct omap_hwmod_class omap54xx_sata_hwmod_class = {
1241 .name = "sata",
1242 .sysc = &omap54xx_sata_sysc,
1245 /* sata */
1246 static struct omap_hwmod omap54xx_sata_hwmod = {
1247 .name = "sata",
1248 .class = &omap54xx_sata_hwmod_class,
1249 .clkdm_name = "l3init_clkdm",
1250 .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
1251 .main_clk = "func_48m_fclk",
1252 .mpu_rt_idx = 1,
1253 .prcm = {
1254 .omap4 = {
1255 .clkctrl_offs = OMAP54XX_CM_L3INIT_SATA_CLKCTRL_OFFSET,
1256 .context_offs = OMAP54XX_RM_L3INIT_SATA_CONTEXT_OFFSET,
1257 .modulemode = MODULEMODE_SWCTRL,
1262 /* l4_cfg -> sata */
1263 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__sata = {
1264 .master = &omap54xx_l4_cfg_hwmod,
1265 .slave = &omap54xx_sata_hwmod,
1266 .clk = "l3_iclk_div",
1267 .user = OCP_USER_MPU | OCP_USER_SDMA,
1271 * Interfaces
1274 /* l3_main_1 -> dmm */
1275 static struct omap_hwmod_ocp_if omap54xx_l3_main_1__dmm = {
1276 .master = &omap54xx_l3_main_1_hwmod,
1277 .slave = &omap54xx_dmm_hwmod,
1278 .clk = "l3_iclk_div",
1279 .user = OCP_USER_SDMA,
1282 /* l3_main_3 -> l3_instr */
1283 static struct omap_hwmod_ocp_if omap54xx_l3_main_3__l3_instr = {
1284 .master = &omap54xx_l3_main_3_hwmod,
1285 .slave = &omap54xx_l3_instr_hwmod,
1286 .clk = "l3_iclk_div",
1287 .user = OCP_USER_MPU | OCP_USER_SDMA,
1290 /* l3_main_2 -> l3_main_1 */
1291 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__l3_main_1 = {
1292 .master = &omap54xx_l3_main_2_hwmod,
1293 .slave = &omap54xx_l3_main_1_hwmod,
1294 .clk = "l3_iclk_div",
1295 .user = OCP_USER_MPU | OCP_USER_SDMA,
1298 /* l4_cfg -> l3_main_1 */
1299 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__l3_main_1 = {
1300 .master = &omap54xx_l4_cfg_hwmod,
1301 .slave = &omap54xx_l3_main_1_hwmod,
1302 .clk = "l3_iclk_div",
1303 .user = OCP_USER_MPU | OCP_USER_SDMA,
1306 /* l4_cfg -> mmu_dsp */
1307 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__mmu_dsp = {
1308 .master = &omap54xx_l4_cfg_hwmod,
1309 .slave = &omap54xx_mmu_dsp_hwmod,
1310 .clk = "l4_root_clk_div",
1311 .user = OCP_USER_MPU | OCP_USER_SDMA,
1314 /* mpu -> l3_main_1 */
1315 static struct omap_hwmod_ocp_if omap54xx_mpu__l3_main_1 = {
1316 .master = &omap54xx_mpu_hwmod,
1317 .slave = &omap54xx_l3_main_1_hwmod,
1318 .clk = "l3_iclk_div",
1319 .user = OCP_USER_MPU,
1322 /* l3_main_1 -> l3_main_2 */
1323 static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l3_main_2 = {
1324 .master = &omap54xx_l3_main_1_hwmod,
1325 .slave = &omap54xx_l3_main_2_hwmod,
1326 .clk = "l3_iclk_div",
1327 .user = OCP_USER_MPU,
1330 /* l4_cfg -> l3_main_2 */
1331 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__l3_main_2 = {
1332 .master = &omap54xx_l4_cfg_hwmod,
1333 .slave = &omap54xx_l3_main_2_hwmod,
1334 .clk = "l3_iclk_div",
1335 .user = OCP_USER_MPU | OCP_USER_SDMA,
1338 /* l3_main_2 -> mmu_ipu */
1339 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__mmu_ipu = {
1340 .master = &omap54xx_l3_main_2_hwmod,
1341 .slave = &omap54xx_mmu_ipu_hwmod,
1342 .clk = "l3_iclk_div",
1343 .user = OCP_USER_MPU | OCP_USER_SDMA,
1346 /* l3_main_1 -> l3_main_3 */
1347 static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l3_main_3 = {
1348 .master = &omap54xx_l3_main_1_hwmod,
1349 .slave = &omap54xx_l3_main_3_hwmod,
1350 .clk = "l3_iclk_div",
1351 .user = OCP_USER_MPU,
1354 /* l3_main_2 -> l3_main_3 */
1355 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__l3_main_3 = {
1356 .master = &omap54xx_l3_main_2_hwmod,
1357 .slave = &omap54xx_l3_main_3_hwmod,
1358 .clk = "l3_iclk_div",
1359 .user = OCP_USER_MPU | OCP_USER_SDMA,
1362 /* l4_cfg -> l3_main_3 */
1363 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__l3_main_3 = {
1364 .master = &omap54xx_l4_cfg_hwmod,
1365 .slave = &omap54xx_l3_main_3_hwmod,
1366 .clk = "l3_iclk_div",
1367 .user = OCP_USER_MPU | OCP_USER_SDMA,
1370 /* l3_main_1 -> l4_abe */
1371 static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l4_abe = {
1372 .master = &omap54xx_l3_main_1_hwmod,
1373 .slave = &omap54xx_l4_abe_hwmod,
1374 .clk = "abe_iclk",
1375 .user = OCP_USER_MPU | OCP_USER_SDMA,
1378 /* mpu -> l4_abe */
1379 static struct omap_hwmod_ocp_if omap54xx_mpu__l4_abe = {
1380 .master = &omap54xx_mpu_hwmod,
1381 .slave = &omap54xx_l4_abe_hwmod,
1382 .clk = "abe_iclk",
1383 .user = OCP_USER_MPU | OCP_USER_SDMA,
1386 /* l3_main_1 -> l4_cfg */
1387 static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l4_cfg = {
1388 .master = &omap54xx_l3_main_1_hwmod,
1389 .slave = &omap54xx_l4_cfg_hwmod,
1390 .clk = "l4_root_clk_div",
1391 .user = OCP_USER_MPU | OCP_USER_SDMA,
1394 /* l3_main_2 -> l4_per */
1395 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__l4_per = {
1396 .master = &omap54xx_l3_main_2_hwmod,
1397 .slave = &omap54xx_l4_per_hwmod,
1398 .clk = "l4_root_clk_div",
1399 .user = OCP_USER_MPU | OCP_USER_SDMA,
1402 /* l3_main_1 -> l4_wkup */
1403 static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l4_wkup = {
1404 .master = &omap54xx_l3_main_1_hwmod,
1405 .slave = &omap54xx_l4_wkup_hwmod,
1406 .clk = "wkupaon_iclk_mux",
1407 .user = OCP_USER_MPU | OCP_USER_SDMA,
1410 /* mpu -> mpu_private */
1411 static struct omap_hwmod_ocp_if omap54xx_mpu__mpu_private = {
1412 .master = &omap54xx_mpu_hwmod,
1413 .slave = &omap54xx_mpu_private_hwmod,
1414 .clk = "l3_iclk_div",
1415 .user = OCP_USER_MPU | OCP_USER_SDMA,
1418 /* l4_wkup -> counter_32k */
1419 static struct omap_hwmod_ocp_if omap54xx_l4_wkup__counter_32k = {
1420 .master = &omap54xx_l4_wkup_hwmod,
1421 .slave = &omap54xx_counter_32k_hwmod,
1422 .clk = "wkupaon_iclk_mux",
1423 .user = OCP_USER_MPU | OCP_USER_SDMA,
1426 /* l4_cfg -> dma_system */
1427 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__dma_system = {
1428 .master = &omap54xx_l4_cfg_hwmod,
1429 .slave = &omap54xx_dma_system_hwmod,
1430 .clk = "l4_root_clk_div",
1431 .user = OCP_USER_MPU | OCP_USER_SDMA,
1434 /* l4_abe -> dmic */
1435 static struct omap_hwmod_ocp_if omap54xx_l4_abe__dmic = {
1436 .master = &omap54xx_l4_abe_hwmod,
1437 .slave = &omap54xx_dmic_hwmod,
1438 .clk = "abe_iclk",
1439 .user = OCP_USER_MPU,
1442 /* l3_main_2 -> dss */
1443 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss = {
1444 .master = &omap54xx_l3_main_2_hwmod,
1445 .slave = &omap54xx_dss_hwmod,
1446 .clk = "l3_iclk_div",
1447 .user = OCP_USER_MPU | OCP_USER_SDMA,
1450 /* l3_main_2 -> dss_dispc */
1451 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss_dispc = {
1452 .master = &omap54xx_l3_main_2_hwmod,
1453 .slave = &omap54xx_dss_dispc_hwmod,
1454 .clk = "l3_iclk_div",
1455 .user = OCP_USER_MPU | OCP_USER_SDMA,
1458 /* l3_main_2 -> dss_dsi1_a */
1459 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss_dsi1_a = {
1460 .master = &omap54xx_l3_main_2_hwmod,
1461 .slave = &omap54xx_dss_dsi1_a_hwmod,
1462 .clk = "l3_iclk_div",
1463 .user = OCP_USER_MPU | OCP_USER_SDMA,
1466 /* l3_main_2 -> dss_dsi1_c */
1467 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss_dsi1_c = {
1468 .master = &omap54xx_l3_main_2_hwmod,
1469 .slave = &omap54xx_dss_dsi1_c_hwmod,
1470 .clk = "l3_iclk_div",
1471 .user = OCP_USER_MPU | OCP_USER_SDMA,
1474 /* l3_main_2 -> dss_hdmi */
1475 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss_hdmi = {
1476 .master = &omap54xx_l3_main_2_hwmod,
1477 .slave = &omap54xx_dss_hdmi_hwmod,
1478 .clk = "l3_iclk_div",
1479 .user = OCP_USER_MPU | OCP_USER_SDMA,
1482 /* l3_main_2 -> dss_rfbi */
1483 static struct omap_hwmod_ocp_if omap54xx_l3_main_2__dss_rfbi = {
1484 .master = &omap54xx_l3_main_2_hwmod,
1485 .slave = &omap54xx_dss_rfbi_hwmod,
1486 .clk = "l3_iclk_div",
1487 .user = OCP_USER_MPU | OCP_USER_SDMA,
1490 /* mpu -> emif1 */
1491 static struct omap_hwmod_ocp_if omap54xx_mpu__emif1 = {
1492 .master = &omap54xx_mpu_hwmod,
1493 .slave = &omap54xx_emif1_hwmod,
1494 .clk = "dpll_core_h11x2_ck",
1495 .user = OCP_USER_MPU | OCP_USER_SDMA,
1498 /* mpu -> emif2 */
1499 static struct omap_hwmod_ocp_if omap54xx_mpu__emif2 = {
1500 .master = &omap54xx_mpu_hwmod,
1501 .slave = &omap54xx_emif2_hwmod,
1502 .clk = "dpll_core_h11x2_ck",
1503 .user = OCP_USER_MPU | OCP_USER_SDMA,
1506 /* l4_wkup -> kbd */
1507 static struct omap_hwmod_ocp_if omap54xx_l4_wkup__kbd = {
1508 .master = &omap54xx_l4_wkup_hwmod,
1509 .slave = &omap54xx_kbd_hwmod,
1510 .clk = "wkupaon_iclk_mux",
1511 .user = OCP_USER_MPU | OCP_USER_SDMA,
1514 /* l4_abe -> mcpdm */
1515 static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcpdm = {
1516 .master = &omap54xx_l4_abe_hwmod,
1517 .slave = &omap54xx_mcpdm_hwmod,
1518 .clk = "abe_iclk",
1519 .user = OCP_USER_MPU,
1522 /* l4_cfg -> mpu */
1523 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__mpu = {
1524 .master = &omap54xx_l4_cfg_hwmod,
1525 .slave = &omap54xx_mpu_hwmod,
1526 .clk = "l4_root_clk_div",
1527 .user = OCP_USER_MPU | OCP_USER_SDMA,
1530 /* l4_cfg -> spinlock */
1531 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__spinlock = {
1532 .master = &omap54xx_l4_cfg_hwmod,
1533 .slave = &omap54xx_spinlock_hwmod,
1534 .clk = "l4_root_clk_div",
1535 .user = OCP_USER_MPU | OCP_USER_SDMA,
1538 /* l4_cfg -> ocp2scp1 */
1539 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__ocp2scp1 = {
1540 .master = &omap54xx_l4_cfg_hwmod,
1541 .slave = &omap54xx_ocp2scp1_hwmod,
1542 .clk = "l4_root_clk_div",
1543 .user = OCP_USER_MPU | OCP_USER_SDMA,
1546 /* l4_wkup -> timer1 */
1547 static struct omap_hwmod_ocp_if omap54xx_l4_wkup__timer1 = {
1548 .master = &omap54xx_l4_wkup_hwmod,
1549 .slave = &omap54xx_timer1_hwmod,
1550 .clk = "wkupaon_iclk_mux",
1551 .user = OCP_USER_MPU | OCP_USER_SDMA,
1554 /* l4_per -> timer2 */
1555 static struct omap_hwmod_ocp_if omap54xx_l4_per__timer2 = {
1556 .master = &omap54xx_l4_per_hwmod,
1557 .slave = &omap54xx_timer2_hwmod,
1558 .clk = "l4_root_clk_div",
1559 .user = OCP_USER_MPU | OCP_USER_SDMA,
1562 /* l4_per -> timer3 */
1563 static struct omap_hwmod_ocp_if omap54xx_l4_per__timer3 = {
1564 .master = &omap54xx_l4_per_hwmod,
1565 .slave = &omap54xx_timer3_hwmod,
1566 .clk = "l4_root_clk_div",
1567 .user = OCP_USER_MPU | OCP_USER_SDMA,
1570 /* l4_per -> timer4 */
1571 static struct omap_hwmod_ocp_if omap54xx_l4_per__timer4 = {
1572 .master = &omap54xx_l4_per_hwmod,
1573 .slave = &omap54xx_timer4_hwmod,
1574 .clk = "l4_root_clk_div",
1575 .user = OCP_USER_MPU | OCP_USER_SDMA,
1578 /* l4_abe -> timer5 */
1579 static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer5 = {
1580 .master = &omap54xx_l4_abe_hwmod,
1581 .slave = &omap54xx_timer5_hwmod,
1582 .clk = "abe_iclk",
1583 .user = OCP_USER_MPU,
1586 /* l4_abe -> timer6 */
1587 static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer6 = {
1588 .master = &omap54xx_l4_abe_hwmod,
1589 .slave = &omap54xx_timer6_hwmod,
1590 .clk = "abe_iclk",
1591 .user = OCP_USER_MPU,
1594 /* l4_abe -> timer7 */
1595 static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer7 = {
1596 .master = &omap54xx_l4_abe_hwmod,
1597 .slave = &omap54xx_timer7_hwmod,
1598 .clk = "abe_iclk",
1599 .user = OCP_USER_MPU,
1602 /* l4_abe -> timer8 */
1603 static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer8 = {
1604 .master = &omap54xx_l4_abe_hwmod,
1605 .slave = &omap54xx_timer8_hwmod,
1606 .clk = "abe_iclk",
1607 .user = OCP_USER_MPU,
1610 /* l4_per -> timer9 */
1611 static struct omap_hwmod_ocp_if omap54xx_l4_per__timer9 = {
1612 .master = &omap54xx_l4_per_hwmod,
1613 .slave = &omap54xx_timer9_hwmod,
1614 .clk = "l4_root_clk_div",
1615 .user = OCP_USER_MPU | OCP_USER_SDMA,
1618 /* l4_per -> timer10 */
1619 static struct omap_hwmod_ocp_if omap54xx_l4_per__timer10 = {
1620 .master = &omap54xx_l4_per_hwmod,
1621 .slave = &omap54xx_timer10_hwmod,
1622 .clk = "l4_root_clk_div",
1623 .user = OCP_USER_MPU | OCP_USER_SDMA,
1626 /* l4_per -> timer11 */
1627 static struct omap_hwmod_ocp_if omap54xx_l4_per__timer11 = {
1628 .master = &omap54xx_l4_per_hwmod,
1629 .slave = &omap54xx_timer11_hwmod,
1630 .clk = "l4_root_clk_div",
1631 .user = OCP_USER_MPU | OCP_USER_SDMA,
1634 /* l4_cfg -> usb_host_hs */
1635 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__usb_host_hs = {
1636 .master = &omap54xx_l4_cfg_hwmod,
1637 .slave = &omap54xx_usb_host_hs_hwmod,
1638 .clk = "l3_iclk_div",
1639 .user = OCP_USER_MPU | OCP_USER_SDMA,
1642 /* l4_cfg -> usb_tll_hs */
1643 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__usb_tll_hs = {
1644 .master = &omap54xx_l4_cfg_hwmod,
1645 .slave = &omap54xx_usb_tll_hs_hwmod,
1646 .clk = "l4_root_clk_div",
1647 .user = OCP_USER_MPU | OCP_USER_SDMA,
1650 /* l4_cfg -> usb_otg_ss */
1651 static struct omap_hwmod_ocp_if omap54xx_l4_cfg__usb_otg_ss = {
1652 .master = &omap54xx_l4_cfg_hwmod,
1653 .slave = &omap54xx_usb_otg_ss_hwmod,
1654 .clk = "dpll_core_h13x2_ck",
1655 .user = OCP_USER_MPU | OCP_USER_SDMA,
1658 static struct omap_hwmod_ocp_if *omap54xx_hwmod_ocp_ifs[] __initdata = {
1659 &omap54xx_l3_main_1__dmm,
1660 &omap54xx_l3_main_3__l3_instr,
1661 &omap54xx_l3_main_2__l3_main_1,
1662 &omap54xx_l4_cfg__l3_main_1,
1663 &omap54xx_mpu__l3_main_1,
1664 &omap54xx_l3_main_1__l3_main_2,
1665 &omap54xx_l4_cfg__l3_main_2,
1666 &omap54xx_l3_main_1__l3_main_3,
1667 &omap54xx_l3_main_2__l3_main_3,
1668 &omap54xx_l4_cfg__l3_main_3,
1669 &omap54xx_l3_main_1__l4_abe,
1670 &omap54xx_mpu__l4_abe,
1671 &omap54xx_l3_main_1__l4_cfg,
1672 &omap54xx_l3_main_2__l4_per,
1673 &omap54xx_l3_main_1__l4_wkup,
1674 &omap54xx_mpu__mpu_private,
1675 &omap54xx_l4_wkup__counter_32k,
1676 &omap54xx_l4_cfg__dma_system,
1677 &omap54xx_l4_abe__dmic,
1678 &omap54xx_l4_cfg__mmu_dsp,
1679 &omap54xx_l3_main_2__dss,
1680 &omap54xx_l3_main_2__dss_dispc,
1681 &omap54xx_l3_main_2__dss_dsi1_a,
1682 &omap54xx_l3_main_2__dss_dsi1_c,
1683 &omap54xx_l3_main_2__dss_hdmi,
1684 &omap54xx_l3_main_2__dss_rfbi,
1685 &omap54xx_mpu__emif1,
1686 &omap54xx_mpu__emif2,
1687 &omap54xx_l3_main_2__mmu_ipu,
1688 &omap54xx_l4_wkup__kbd,
1689 &omap54xx_l4_abe__mcpdm,
1690 &omap54xx_l4_cfg__mpu,
1691 &omap54xx_l4_cfg__spinlock,
1692 &omap54xx_l4_cfg__ocp2scp1,
1693 &omap54xx_l4_wkup__timer1,
1694 &omap54xx_l4_per__timer2,
1695 &omap54xx_l4_per__timer3,
1696 &omap54xx_l4_per__timer4,
1697 &omap54xx_l4_abe__timer5,
1698 &omap54xx_l4_abe__timer6,
1699 &omap54xx_l4_abe__timer7,
1700 &omap54xx_l4_abe__timer8,
1701 &omap54xx_l4_per__timer9,
1702 &omap54xx_l4_per__timer10,
1703 &omap54xx_l4_per__timer11,
1704 &omap54xx_l4_cfg__usb_host_hs,
1705 &omap54xx_l4_cfg__usb_tll_hs,
1706 &omap54xx_l4_cfg__usb_otg_ss,
1707 &omap54xx_l4_cfg__ocp2scp3,
1708 &omap54xx_l4_cfg__sata,
1709 NULL,
1712 int __init omap54xx_hwmod_init(void)
1714 omap_hwmod_init();
1715 return omap_hwmod_register_links(omap54xx_hwmod_ocp_ifs);