2 * omap_hwmod_2430_data.c - hardware modules present on the OMAP2430 chips
4 * Copyright (C) 2009-2010 Nokia Corporation
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * XXX handle crossbar/shared link difference for L3?
12 * XXX these should be marked initdata for multi-OMAP kernels
14 #include <plat/omap_hwmod.h>
15 #include <mach/irqs.h>
18 #include <plat/serial.h>
20 #include <plat/gpio.h>
21 #include <plat/mcspi.h>
23 #include "omap_hwmod_common_data.h"
25 #include "prm-regbits-24xx.h"
26 #include "cm-regbits-24xx.h"
30 * OMAP2430 hardware module integration data
32 * ALl of the data in this section should be autogeneratable from the
33 * TI hardware database or other technical documentation. Data that
34 * is driver-specific or driver-kernel integration-specific belongs
38 static struct omap_hwmod omap2430_mpu_hwmod;
39 static struct omap_hwmod omap2430_iva_hwmod;
40 static struct omap_hwmod omap2430_l3_main_hwmod;
41 static struct omap_hwmod omap2430_l4_core_hwmod;
42 static struct omap_hwmod omap2430_wd_timer2_hwmod;
43 static struct omap_hwmod omap2430_gpio1_hwmod;
44 static struct omap_hwmod omap2430_gpio2_hwmod;
45 static struct omap_hwmod omap2430_gpio3_hwmod;
46 static struct omap_hwmod omap2430_gpio4_hwmod;
47 static struct omap_hwmod omap2430_gpio5_hwmod;
48 static struct omap_hwmod omap2430_dma_system_hwmod;
49 static struct omap_hwmod omap2430_mcspi1_hwmod;
50 static struct omap_hwmod omap2430_mcspi2_hwmod;
51 static struct omap_hwmod omap2430_mcspi3_hwmod;
53 /* L3 -> L4_CORE interface */
54 static struct omap_hwmod_ocp_if omap2430_l3_main__l4_core = {
55 .master = &omap2430_l3_main_hwmod,
56 .slave = &omap2430_l4_core_hwmod,
57 .user = OCP_USER_MPU | OCP_USER_SDMA,
60 /* MPU -> L3 interface */
61 static struct omap_hwmod_ocp_if omap2430_mpu__l3_main = {
62 .master = &omap2430_mpu_hwmod,
63 .slave = &omap2430_l3_main_hwmod,
67 /* Slave interfaces on the L3 interconnect */
68 static struct omap_hwmod_ocp_if *omap2430_l3_main_slaves[] = {
69 &omap2430_mpu__l3_main,
72 /* Master interfaces on the L3 interconnect */
73 static struct omap_hwmod_ocp_if *omap2430_l3_main_masters[] = {
74 &omap2430_l3_main__l4_core,
78 static struct omap_hwmod omap2430_l3_main_hwmod = {
80 .class = &l3_hwmod_class,
81 .masters = omap2430_l3_main_masters,
82 .masters_cnt = ARRAY_SIZE(omap2430_l3_main_masters),
83 .slaves = omap2430_l3_main_slaves,
84 .slaves_cnt = ARRAY_SIZE(omap2430_l3_main_slaves),
85 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
86 .flags = HWMOD_NO_IDLEST,
89 static struct omap_hwmod omap2430_l4_wkup_hwmod;
90 static struct omap_hwmod omap2430_uart1_hwmod;
91 static struct omap_hwmod omap2430_uart2_hwmod;
92 static struct omap_hwmod omap2430_uart3_hwmod;
93 static struct omap_hwmod omap2430_i2c1_hwmod;
94 static struct omap_hwmod omap2430_i2c2_hwmod;
96 static struct omap_hwmod omap2430_usbhsotg_hwmod;
98 /* l3_core -> usbhsotg interface */
99 static struct omap_hwmod_ocp_if omap2430_usbhsotg__l3 = {
100 .master = &omap2430_usbhsotg_hwmod,
101 .slave = &omap2430_l3_main_hwmod,
103 .user = OCP_USER_MPU,
106 /* I2C IP block address space length (in bytes) */
107 #define OMAP2_I2C_AS_LEN 128
109 /* L4 CORE -> I2C1 interface */
110 static struct omap_hwmod_addr_space omap2430_i2c1_addr_space[] = {
112 .pa_start = 0x48070000,
113 .pa_end = 0x48070000 + OMAP2_I2C_AS_LEN - 1,
114 .flags = ADDR_TYPE_RT,
118 static struct omap_hwmod_ocp_if omap2430_l4_core__i2c1 = {
119 .master = &omap2430_l4_core_hwmod,
120 .slave = &omap2430_i2c1_hwmod,
122 .addr = omap2430_i2c1_addr_space,
123 .addr_cnt = ARRAY_SIZE(omap2430_i2c1_addr_space),
124 .user = OCP_USER_MPU | OCP_USER_SDMA,
127 /* L4 CORE -> I2C2 interface */
128 static struct omap_hwmod_addr_space omap2430_i2c2_addr_space[] = {
130 .pa_start = 0x48072000,
131 .pa_end = 0x48072000 + OMAP2_I2C_AS_LEN - 1,
132 .flags = ADDR_TYPE_RT,
136 static struct omap_hwmod_ocp_if omap2430_l4_core__i2c2 = {
137 .master = &omap2430_l4_core_hwmod,
138 .slave = &omap2430_i2c2_hwmod,
140 .addr = omap2430_i2c2_addr_space,
141 .addr_cnt = ARRAY_SIZE(omap2430_i2c2_addr_space),
142 .user = OCP_USER_MPU | OCP_USER_SDMA,
145 /* L4_CORE -> L4_WKUP interface */
146 static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = {
147 .master = &omap2430_l4_core_hwmod,
148 .slave = &omap2430_l4_wkup_hwmod,
149 .user = OCP_USER_MPU | OCP_USER_SDMA,
152 /* L4 CORE -> UART1 interface */
153 static struct omap_hwmod_addr_space omap2430_uart1_addr_space[] = {
155 .pa_start = OMAP2_UART1_BASE,
156 .pa_end = OMAP2_UART1_BASE + SZ_8K - 1,
157 .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
161 static struct omap_hwmod_ocp_if omap2_l4_core__uart1 = {
162 .master = &omap2430_l4_core_hwmod,
163 .slave = &omap2430_uart1_hwmod,
165 .addr = omap2430_uart1_addr_space,
166 .addr_cnt = ARRAY_SIZE(omap2430_uart1_addr_space),
167 .user = OCP_USER_MPU | OCP_USER_SDMA,
170 /* L4 CORE -> UART2 interface */
171 static struct omap_hwmod_addr_space omap2430_uart2_addr_space[] = {
173 .pa_start = OMAP2_UART2_BASE,
174 .pa_end = OMAP2_UART2_BASE + SZ_1K - 1,
175 .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
179 static struct omap_hwmod_ocp_if omap2_l4_core__uart2 = {
180 .master = &omap2430_l4_core_hwmod,
181 .slave = &omap2430_uart2_hwmod,
183 .addr = omap2430_uart2_addr_space,
184 .addr_cnt = ARRAY_SIZE(omap2430_uart2_addr_space),
185 .user = OCP_USER_MPU | OCP_USER_SDMA,
188 /* L4 PER -> UART3 interface */
189 static struct omap_hwmod_addr_space omap2430_uart3_addr_space[] = {
191 .pa_start = OMAP2_UART3_BASE,
192 .pa_end = OMAP2_UART3_BASE + SZ_1K - 1,
193 .flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
197 static struct omap_hwmod_ocp_if omap2_l4_core__uart3 = {
198 .master = &omap2430_l4_core_hwmod,
199 .slave = &omap2430_uart3_hwmod,
201 .addr = omap2430_uart3_addr_space,
202 .addr_cnt = ARRAY_SIZE(omap2430_uart3_addr_space),
203 .user = OCP_USER_MPU | OCP_USER_SDMA,
207 * usbhsotg interface data
209 static struct omap_hwmod_addr_space omap2430_usbhsotg_addrs[] = {
211 .pa_start = OMAP243X_HS_BASE,
212 .pa_end = OMAP243X_HS_BASE + SZ_4K - 1,
213 .flags = ADDR_TYPE_RT
217 /* l4_core ->usbhsotg interface */
218 static struct omap_hwmod_ocp_if omap2430_l4_core__usbhsotg = {
219 .master = &omap2430_l4_core_hwmod,
220 .slave = &omap2430_usbhsotg_hwmod,
222 .addr = omap2430_usbhsotg_addrs,
223 .addr_cnt = ARRAY_SIZE(omap2430_usbhsotg_addrs),
224 .user = OCP_USER_MPU,
227 static struct omap_hwmod_ocp_if *omap2430_usbhsotg_masters[] = {
228 &omap2430_usbhsotg__l3,
231 static struct omap_hwmod_ocp_if *omap2430_usbhsotg_slaves[] = {
232 &omap2430_l4_core__usbhsotg,
235 /* Slave interfaces on the L4_CORE interconnect */
236 static struct omap_hwmod_ocp_if *omap2430_l4_core_slaves[] = {
237 &omap2430_l3_main__l4_core,
240 /* Master interfaces on the L4_CORE interconnect */
241 static struct omap_hwmod_ocp_if *omap2430_l4_core_masters[] = {
242 &omap2430_l4_core__l4_wkup,
246 static struct omap_hwmod omap2430_l4_core_hwmod = {
248 .class = &l4_hwmod_class,
249 .masters = omap2430_l4_core_masters,
250 .masters_cnt = ARRAY_SIZE(omap2430_l4_core_masters),
251 .slaves = omap2430_l4_core_slaves,
252 .slaves_cnt = ARRAY_SIZE(omap2430_l4_core_slaves),
253 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
254 .flags = HWMOD_NO_IDLEST,
257 /* Slave interfaces on the L4_WKUP interconnect */
258 static struct omap_hwmod_ocp_if *omap2430_l4_wkup_slaves[] = {
259 &omap2430_l4_core__l4_wkup,
260 &omap2_l4_core__uart1,
261 &omap2_l4_core__uart2,
262 &omap2_l4_core__uart3,
265 /* Master interfaces on the L4_WKUP interconnect */
266 static struct omap_hwmod_ocp_if *omap2430_l4_wkup_masters[] = {
269 /* l4 core -> mcspi1 interface */
270 static struct omap_hwmod_addr_space omap2430_mcspi1_addr_space[] = {
272 .pa_start = 0x48098000,
273 .pa_end = 0x480980ff,
274 .flags = ADDR_TYPE_RT,
278 static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi1 = {
279 .master = &omap2430_l4_core_hwmod,
280 .slave = &omap2430_mcspi1_hwmod,
282 .addr = omap2430_mcspi1_addr_space,
283 .addr_cnt = ARRAY_SIZE(omap2430_mcspi1_addr_space),
284 .user = OCP_USER_MPU | OCP_USER_SDMA,
287 /* l4 core -> mcspi2 interface */
288 static struct omap_hwmod_addr_space omap2430_mcspi2_addr_space[] = {
290 .pa_start = 0x4809a000,
291 .pa_end = 0x4809a0ff,
292 .flags = ADDR_TYPE_RT,
296 static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi2 = {
297 .master = &omap2430_l4_core_hwmod,
298 .slave = &omap2430_mcspi2_hwmod,
300 .addr = omap2430_mcspi2_addr_space,
301 .addr_cnt = ARRAY_SIZE(omap2430_mcspi2_addr_space),
302 .user = OCP_USER_MPU | OCP_USER_SDMA,
305 /* l4 core -> mcspi3 interface */
306 static struct omap_hwmod_addr_space omap2430_mcspi3_addr_space[] = {
308 .pa_start = 0x480b8000,
309 .pa_end = 0x480b80ff,
310 .flags = ADDR_TYPE_RT,
314 static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi3 = {
315 .master = &omap2430_l4_core_hwmod,
316 .slave = &omap2430_mcspi3_hwmod,
318 .addr = omap2430_mcspi3_addr_space,
319 .addr_cnt = ARRAY_SIZE(omap2430_mcspi3_addr_space),
320 .user = OCP_USER_MPU | OCP_USER_SDMA,
324 static struct omap_hwmod omap2430_l4_wkup_hwmod = {
326 .class = &l4_hwmod_class,
327 .masters = omap2430_l4_wkup_masters,
328 .masters_cnt = ARRAY_SIZE(omap2430_l4_wkup_masters),
329 .slaves = omap2430_l4_wkup_slaves,
330 .slaves_cnt = ARRAY_SIZE(omap2430_l4_wkup_slaves),
331 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
332 .flags = HWMOD_NO_IDLEST,
335 /* Master interfaces on the MPU device */
336 static struct omap_hwmod_ocp_if *omap2430_mpu_masters[] = {
337 &omap2430_mpu__l3_main,
341 static struct omap_hwmod omap2430_mpu_hwmod = {
343 .class = &mpu_hwmod_class,
344 .main_clk = "mpu_ck",
345 .masters = omap2430_mpu_masters,
346 .masters_cnt = ARRAY_SIZE(omap2430_mpu_masters),
347 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
351 * IVA2_1 interface data
354 /* IVA2 <- L3 interface */
355 static struct omap_hwmod_ocp_if omap2430_l3__iva = {
356 .master = &omap2430_l3_main_hwmod,
357 .slave = &omap2430_iva_hwmod,
359 .user = OCP_USER_MPU | OCP_USER_SDMA,
362 static struct omap_hwmod_ocp_if *omap2430_iva_masters[] = {
370 static struct omap_hwmod omap2430_iva_hwmod = {
372 .class = &iva_hwmod_class,
373 .masters = omap2430_iva_masters,
374 .masters_cnt = ARRAY_SIZE(omap2430_iva_masters),
375 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
378 /* l4_wkup -> wd_timer2 */
379 static struct omap_hwmod_addr_space omap2430_wd_timer2_addrs[] = {
381 .pa_start = 0x49016000,
382 .pa_end = 0x4901607f,
383 .flags = ADDR_TYPE_RT
387 static struct omap_hwmod_ocp_if omap2430_l4_wkup__wd_timer2 = {
388 .master = &omap2430_l4_wkup_hwmod,
389 .slave = &omap2430_wd_timer2_hwmod,
390 .clk = "mpu_wdt_ick",
391 .addr = omap2430_wd_timer2_addrs,
392 .addr_cnt = ARRAY_SIZE(omap2430_wd_timer2_addrs),
393 .user = OCP_USER_MPU | OCP_USER_SDMA,
398 * 32-bit watchdog upward counter that generates a pulse on the reset pin on
402 static struct omap_hwmod_class_sysconfig omap2430_wd_timer_sysc = {
406 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET |
408 .sysc_fields = &omap_hwmod_sysc_type1,
411 static struct omap_hwmod_class omap2430_wd_timer_hwmod_class = {
413 .sysc = &omap2430_wd_timer_sysc,
414 .pre_shutdown = &omap2_wd_timer_disable
418 static struct omap_hwmod_ocp_if *omap2430_wd_timer2_slaves[] = {
419 &omap2430_l4_wkup__wd_timer2,
422 static struct omap_hwmod omap2430_wd_timer2_hwmod = {
424 .class = &omap2430_wd_timer_hwmod_class,
425 .main_clk = "mpu_wdt_fck",
429 .module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
430 .module_offs = WKUP_MOD,
432 .idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
435 .slaves = omap2430_wd_timer2_slaves,
436 .slaves_cnt = ARRAY_SIZE(omap2430_wd_timer2_slaves),
437 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
442 static struct omap_hwmod_class_sysconfig uart_sysc = {
446 .sysc_flags = (SYSC_HAS_SIDLEMODE |
447 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
449 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
450 .sysc_fields = &omap_hwmod_sysc_type1,
453 static struct omap_hwmod_class uart_class = {
460 static struct omap_hwmod_irq_info uart1_mpu_irqs[] = {
461 { .irq = INT_24XX_UART1_IRQ, },
464 static struct omap_hwmod_dma_info uart1_sdma_reqs[] = {
465 { .name = "rx", .dma_req = OMAP24XX_DMA_UART1_RX, },
466 { .name = "tx", .dma_req = OMAP24XX_DMA_UART1_TX, },
469 static struct omap_hwmod_ocp_if *omap2430_uart1_slaves[] = {
470 &omap2_l4_core__uart1,
473 static struct omap_hwmod omap2430_uart1_hwmod = {
475 .mpu_irqs = uart1_mpu_irqs,
476 .mpu_irqs_cnt = ARRAY_SIZE(uart1_mpu_irqs),
477 .sdma_reqs = uart1_sdma_reqs,
478 .sdma_reqs_cnt = ARRAY_SIZE(uart1_sdma_reqs),
479 .main_clk = "uart1_fck",
482 .module_offs = CORE_MOD,
484 .module_bit = OMAP24XX_EN_UART1_SHIFT,
486 .idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
489 .slaves = omap2430_uart1_slaves,
490 .slaves_cnt = ARRAY_SIZE(omap2430_uart1_slaves),
491 .class = &uart_class,
492 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
497 static struct omap_hwmod_irq_info uart2_mpu_irqs[] = {
498 { .irq = INT_24XX_UART2_IRQ, },
501 static struct omap_hwmod_dma_info uart2_sdma_reqs[] = {
502 { .name = "rx", .dma_req = OMAP24XX_DMA_UART2_RX, },
503 { .name = "tx", .dma_req = OMAP24XX_DMA_UART2_TX, },
506 static struct omap_hwmod_ocp_if *omap2430_uart2_slaves[] = {
507 &omap2_l4_core__uart2,
510 static struct omap_hwmod omap2430_uart2_hwmod = {
512 .mpu_irqs = uart2_mpu_irqs,
513 .mpu_irqs_cnt = ARRAY_SIZE(uart2_mpu_irqs),
514 .sdma_reqs = uart2_sdma_reqs,
515 .sdma_reqs_cnt = ARRAY_SIZE(uart2_sdma_reqs),
516 .main_clk = "uart2_fck",
519 .module_offs = CORE_MOD,
521 .module_bit = OMAP24XX_EN_UART2_SHIFT,
523 .idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
526 .slaves = omap2430_uart2_slaves,
527 .slaves_cnt = ARRAY_SIZE(omap2430_uart2_slaves),
528 .class = &uart_class,
529 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
534 static struct omap_hwmod_irq_info uart3_mpu_irqs[] = {
535 { .irq = INT_24XX_UART3_IRQ, },
538 static struct omap_hwmod_dma_info uart3_sdma_reqs[] = {
539 { .name = "rx", .dma_req = OMAP24XX_DMA_UART3_RX, },
540 { .name = "tx", .dma_req = OMAP24XX_DMA_UART3_TX, },
543 static struct omap_hwmod_ocp_if *omap2430_uart3_slaves[] = {
544 &omap2_l4_core__uart3,
547 static struct omap_hwmod omap2430_uart3_hwmod = {
549 .mpu_irqs = uart3_mpu_irqs,
550 .mpu_irqs_cnt = ARRAY_SIZE(uart3_mpu_irqs),
551 .sdma_reqs = uart3_sdma_reqs,
552 .sdma_reqs_cnt = ARRAY_SIZE(uart3_sdma_reqs),
553 .main_clk = "uart3_fck",
556 .module_offs = CORE_MOD,
558 .module_bit = OMAP24XX_EN_UART3_SHIFT,
560 .idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
563 .slaves = omap2430_uart3_slaves,
564 .slaves_cnt = ARRAY_SIZE(omap2430_uart3_slaves),
565 .class = &uart_class,
566 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
570 static struct omap_hwmod_class_sysconfig i2c_sysc = {
574 .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
575 .sysc_fields = &omap_hwmod_sysc_type1,
578 static struct omap_hwmod_class i2c_class = {
583 static struct omap_i2c_dev_attr i2c_dev_attr = {
584 .fifo_depth = 8, /* bytes */
589 static struct omap_hwmod_irq_info i2c1_mpu_irqs[] = {
590 { .irq = INT_24XX_I2C1_IRQ, },
593 static struct omap_hwmod_dma_info i2c1_sdma_reqs[] = {
594 { .name = "tx", .dma_req = OMAP24XX_DMA_I2C1_TX },
595 { .name = "rx", .dma_req = OMAP24XX_DMA_I2C1_RX },
598 static struct omap_hwmod_ocp_if *omap2430_i2c1_slaves[] = {
599 &omap2430_l4_core__i2c1,
602 static struct omap_hwmod omap2430_i2c1_hwmod = {
604 .mpu_irqs = i2c1_mpu_irqs,
605 .mpu_irqs_cnt = ARRAY_SIZE(i2c1_mpu_irqs),
606 .sdma_reqs = i2c1_sdma_reqs,
607 .sdma_reqs_cnt = ARRAY_SIZE(i2c1_sdma_reqs),
608 .main_clk = "i2chs1_fck",
612 * NOTE: The CM_FCLKEN* and CM_ICLKEN* for
613 * I2CHS IP's do not follow the usual pattern.
614 * prcm_reg_id alone cannot be used to program
615 * the iclk and fclk. Needs to be handled using
616 * additonal flags when clk handling is moved
617 * to hwmod framework.
619 .module_offs = CORE_MOD,
621 .module_bit = OMAP2430_EN_I2CHS1_SHIFT,
623 .idlest_idle_bit = OMAP2430_ST_I2CHS1_SHIFT,
626 .slaves = omap2430_i2c1_slaves,
627 .slaves_cnt = ARRAY_SIZE(omap2430_i2c1_slaves),
629 .dev_attr = &i2c_dev_attr,
630 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
635 static struct omap_hwmod_irq_info i2c2_mpu_irqs[] = {
636 { .irq = INT_24XX_I2C2_IRQ, },
639 static struct omap_hwmod_dma_info i2c2_sdma_reqs[] = {
640 { .name = "tx", .dma_req = OMAP24XX_DMA_I2C2_TX },
641 { .name = "rx", .dma_req = OMAP24XX_DMA_I2C2_RX },
644 static struct omap_hwmod_ocp_if *omap2430_i2c2_slaves[] = {
645 &omap2430_l4_core__i2c2,
648 static struct omap_hwmod omap2430_i2c2_hwmod = {
650 .mpu_irqs = i2c2_mpu_irqs,
651 .mpu_irqs_cnt = ARRAY_SIZE(i2c2_mpu_irqs),
652 .sdma_reqs = i2c2_sdma_reqs,
653 .sdma_reqs_cnt = ARRAY_SIZE(i2c2_sdma_reqs),
654 .main_clk = "i2chs2_fck",
657 .module_offs = CORE_MOD,
659 .module_bit = OMAP2430_EN_I2CHS2_SHIFT,
661 .idlest_idle_bit = OMAP2430_ST_I2CHS2_SHIFT,
664 .slaves = omap2430_i2c2_slaves,
665 .slaves_cnt = ARRAY_SIZE(omap2430_i2c2_slaves),
667 .dev_attr = &i2c_dev_attr,
668 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
671 /* l4_wkup -> gpio1 */
672 static struct omap_hwmod_addr_space omap2430_gpio1_addr_space[] = {
674 .pa_start = 0x4900C000,
675 .pa_end = 0x4900C1ff,
676 .flags = ADDR_TYPE_RT
680 static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio1 = {
681 .master = &omap2430_l4_wkup_hwmod,
682 .slave = &omap2430_gpio1_hwmod,
684 .addr = omap2430_gpio1_addr_space,
685 .addr_cnt = ARRAY_SIZE(omap2430_gpio1_addr_space),
686 .user = OCP_USER_MPU | OCP_USER_SDMA,
689 /* l4_wkup -> gpio2 */
690 static struct omap_hwmod_addr_space omap2430_gpio2_addr_space[] = {
692 .pa_start = 0x4900E000,
693 .pa_end = 0x4900E1ff,
694 .flags = ADDR_TYPE_RT
698 static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio2 = {
699 .master = &omap2430_l4_wkup_hwmod,
700 .slave = &omap2430_gpio2_hwmod,
702 .addr = omap2430_gpio2_addr_space,
703 .addr_cnt = ARRAY_SIZE(omap2430_gpio2_addr_space),
704 .user = OCP_USER_MPU | OCP_USER_SDMA,
707 /* l4_wkup -> gpio3 */
708 static struct omap_hwmod_addr_space omap2430_gpio3_addr_space[] = {
710 .pa_start = 0x49010000,
711 .pa_end = 0x490101ff,
712 .flags = ADDR_TYPE_RT
716 static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio3 = {
717 .master = &omap2430_l4_wkup_hwmod,
718 .slave = &omap2430_gpio3_hwmod,
720 .addr = omap2430_gpio3_addr_space,
721 .addr_cnt = ARRAY_SIZE(omap2430_gpio3_addr_space),
722 .user = OCP_USER_MPU | OCP_USER_SDMA,
725 /* l4_wkup -> gpio4 */
726 static struct omap_hwmod_addr_space omap2430_gpio4_addr_space[] = {
728 .pa_start = 0x49012000,
729 .pa_end = 0x490121ff,
730 .flags = ADDR_TYPE_RT
734 static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio4 = {
735 .master = &omap2430_l4_wkup_hwmod,
736 .slave = &omap2430_gpio4_hwmod,
738 .addr = omap2430_gpio4_addr_space,
739 .addr_cnt = ARRAY_SIZE(omap2430_gpio4_addr_space),
740 .user = OCP_USER_MPU | OCP_USER_SDMA,
743 /* l4_core -> gpio5 */
744 static struct omap_hwmod_addr_space omap2430_gpio5_addr_space[] = {
746 .pa_start = 0x480B6000,
747 .pa_end = 0x480B61ff,
748 .flags = ADDR_TYPE_RT
752 static struct omap_hwmod_ocp_if omap2430_l4_core__gpio5 = {
753 .master = &omap2430_l4_core_hwmod,
754 .slave = &omap2430_gpio5_hwmod,
756 .addr = omap2430_gpio5_addr_space,
757 .addr_cnt = ARRAY_SIZE(omap2430_gpio5_addr_space),
758 .user = OCP_USER_MPU | OCP_USER_SDMA,
762 static struct omap_gpio_dev_attr gpio_dev_attr = {
767 static struct omap_hwmod_class_sysconfig omap243x_gpio_sysc = {
771 .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
772 SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
773 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
774 .sysc_fields = &omap_hwmod_sysc_type1,
779 * general purpose io module
781 static struct omap_hwmod_class omap243x_gpio_hwmod_class = {
783 .sysc = &omap243x_gpio_sysc,
788 static struct omap_hwmod_irq_info omap243x_gpio1_irqs[] = {
789 { .irq = 29 }, /* INT_24XX_GPIO_BANK1 */
792 static struct omap_hwmod_ocp_if *omap2430_gpio1_slaves[] = {
793 &omap2430_l4_wkup__gpio1,
796 static struct omap_hwmod omap2430_gpio1_hwmod = {
798 .mpu_irqs = omap243x_gpio1_irqs,
799 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio1_irqs),
800 .main_clk = "gpios_fck",
804 .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
805 .module_offs = WKUP_MOD,
807 .idlest_idle_bit = OMAP24XX_EN_GPIOS_SHIFT,
810 .slaves = omap2430_gpio1_slaves,
811 .slaves_cnt = ARRAY_SIZE(omap2430_gpio1_slaves),
812 .class = &omap243x_gpio_hwmod_class,
813 .dev_attr = &gpio_dev_attr,
814 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
818 static struct omap_hwmod_irq_info omap243x_gpio2_irqs[] = {
819 { .irq = 30 }, /* INT_24XX_GPIO_BANK2 */
822 static struct omap_hwmod_ocp_if *omap2430_gpio2_slaves[] = {
823 &omap2430_l4_wkup__gpio2,
826 static struct omap_hwmod omap2430_gpio2_hwmod = {
828 .mpu_irqs = omap243x_gpio2_irqs,
829 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio2_irqs),
830 .main_clk = "gpios_fck",
834 .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
835 .module_offs = WKUP_MOD,
837 .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
840 .slaves = omap2430_gpio2_slaves,
841 .slaves_cnt = ARRAY_SIZE(omap2430_gpio2_slaves),
842 .class = &omap243x_gpio_hwmod_class,
843 .dev_attr = &gpio_dev_attr,
844 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
848 static struct omap_hwmod_irq_info omap243x_gpio3_irqs[] = {
849 { .irq = 31 }, /* INT_24XX_GPIO_BANK3 */
852 static struct omap_hwmod_ocp_if *omap2430_gpio3_slaves[] = {
853 &omap2430_l4_wkup__gpio3,
856 static struct omap_hwmod omap2430_gpio3_hwmod = {
858 .mpu_irqs = omap243x_gpio3_irqs,
859 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio3_irqs),
860 .main_clk = "gpios_fck",
864 .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
865 .module_offs = WKUP_MOD,
867 .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
870 .slaves = omap2430_gpio3_slaves,
871 .slaves_cnt = ARRAY_SIZE(omap2430_gpio3_slaves),
872 .class = &omap243x_gpio_hwmod_class,
873 .dev_attr = &gpio_dev_attr,
874 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
878 static struct omap_hwmod_irq_info omap243x_gpio4_irqs[] = {
879 { .irq = 32 }, /* INT_24XX_GPIO_BANK4 */
882 static struct omap_hwmod_ocp_if *omap2430_gpio4_slaves[] = {
883 &omap2430_l4_wkup__gpio4,
886 static struct omap_hwmod omap2430_gpio4_hwmod = {
888 .mpu_irqs = omap243x_gpio4_irqs,
889 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio4_irqs),
890 .main_clk = "gpios_fck",
894 .module_bit = OMAP24XX_EN_GPIOS_SHIFT,
895 .module_offs = WKUP_MOD,
897 .idlest_idle_bit = OMAP24XX_ST_GPIOS_SHIFT,
900 .slaves = omap2430_gpio4_slaves,
901 .slaves_cnt = ARRAY_SIZE(omap2430_gpio4_slaves),
902 .class = &omap243x_gpio_hwmod_class,
903 .dev_attr = &gpio_dev_attr,
904 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
908 static struct omap_hwmod_irq_info omap243x_gpio5_irqs[] = {
909 { .irq = 33 }, /* INT_24XX_GPIO_BANK5 */
912 static struct omap_hwmod_ocp_if *omap2430_gpio5_slaves[] = {
913 &omap2430_l4_core__gpio5,
916 static struct omap_hwmod omap2430_gpio5_hwmod = {
918 .mpu_irqs = omap243x_gpio5_irqs,
919 .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio5_irqs),
920 .main_clk = "gpio5_fck",
924 .module_bit = OMAP2430_EN_GPIO5_SHIFT,
925 .module_offs = CORE_MOD,
927 .idlest_idle_bit = OMAP2430_ST_GPIO5_SHIFT,
930 .slaves = omap2430_gpio5_slaves,
931 .slaves_cnt = ARRAY_SIZE(omap2430_gpio5_slaves),
932 .class = &omap243x_gpio_hwmod_class,
933 .dev_attr = &gpio_dev_attr,
934 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
938 static struct omap_hwmod_class_sysconfig omap2430_dma_sysc = {
942 .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_MIDLEMODE |
943 SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_EMUFREE |
945 .idlemodes = (MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
946 .sysc_fields = &omap_hwmod_sysc_type1,
949 static struct omap_hwmod_class omap2430_dma_hwmod_class = {
951 .sysc = &omap2430_dma_sysc,
955 static struct omap_dma_dev_attr dma_dev_attr = {
956 .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
957 IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
961 static struct omap_hwmod_irq_info omap2430_dma_system_irqs[] = {
962 { .name = "0", .irq = 12 }, /* INT_24XX_SDMA_IRQ0 */
963 { .name = "1", .irq = 13 }, /* INT_24XX_SDMA_IRQ1 */
964 { .name = "2", .irq = 14 }, /* INT_24XX_SDMA_IRQ2 */
965 { .name = "3", .irq = 15 }, /* INT_24XX_SDMA_IRQ3 */
968 static struct omap_hwmod_addr_space omap2430_dma_system_addrs[] = {
970 .pa_start = 0x48056000,
971 .pa_end = 0x4a0560ff,
972 .flags = ADDR_TYPE_RT
976 /* dma_system -> L3 */
977 static struct omap_hwmod_ocp_if omap2430_dma_system__l3 = {
978 .master = &omap2430_dma_system_hwmod,
979 .slave = &omap2430_l3_main_hwmod,
981 .user = OCP_USER_MPU | OCP_USER_SDMA,
984 /* dma_system master ports */
985 static struct omap_hwmod_ocp_if *omap2430_dma_system_masters[] = {
986 &omap2430_dma_system__l3,
989 /* l4_core -> dma_system */
990 static struct omap_hwmod_ocp_if omap2430_l4_core__dma_system = {
991 .master = &omap2430_l4_core_hwmod,
992 .slave = &omap2430_dma_system_hwmod,
994 .addr = omap2430_dma_system_addrs,
995 .addr_cnt = ARRAY_SIZE(omap2430_dma_system_addrs),
996 .user = OCP_USER_MPU | OCP_USER_SDMA,
999 /* dma_system slave ports */
1000 static struct omap_hwmod_ocp_if *omap2430_dma_system_slaves[] = {
1001 &omap2430_l4_core__dma_system,
1004 static struct omap_hwmod omap2430_dma_system_hwmod = {
1006 .class = &omap2430_dma_hwmod_class,
1007 .mpu_irqs = omap2430_dma_system_irqs,
1008 .mpu_irqs_cnt = ARRAY_SIZE(omap2430_dma_system_irqs),
1009 .main_clk = "core_l3_ck",
1010 .slaves = omap2430_dma_system_slaves,
1011 .slaves_cnt = ARRAY_SIZE(omap2430_dma_system_slaves),
1012 .masters = omap2430_dma_system_masters,
1013 .masters_cnt = ARRAY_SIZE(omap2430_dma_system_masters),
1014 .dev_attr = &dma_dev_attr,
1015 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
1016 .flags = HWMOD_NO_IDLEST,
1021 * multichannel serial port interface (mcspi) / master/slave synchronous serial
1025 static struct omap_hwmod_class_sysconfig omap2430_mcspi_sysc = {
1027 .sysc_offs = 0x0010,
1028 .syss_offs = 0x0014,
1029 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1030 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1031 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
1032 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1033 .sysc_fields = &omap_hwmod_sysc_type1,
1036 static struct omap_hwmod_class omap2430_mcspi_class = {
1038 .sysc = &omap2430_mcspi_sysc,
1039 .rev = OMAP2_MCSPI_REV,
1043 static struct omap_hwmod_irq_info omap2430_mcspi1_mpu_irqs[] = {
1047 static struct omap_hwmod_dma_info omap2430_mcspi1_sdma_reqs[] = {
1048 { .name = "tx0", .dma_req = 35 }, /* DMA_SPI1_TX0 */
1049 { .name = "rx0", .dma_req = 36 }, /* DMA_SPI1_RX0 */
1050 { .name = "tx1", .dma_req = 37 }, /* DMA_SPI1_TX1 */
1051 { .name = "rx1", .dma_req = 38 }, /* DMA_SPI1_RX1 */
1052 { .name = "tx2", .dma_req = 39 }, /* DMA_SPI1_TX2 */
1053 { .name = "rx2", .dma_req = 40 }, /* DMA_SPI1_RX2 */
1054 { .name = "tx3", .dma_req = 41 }, /* DMA_SPI1_TX3 */
1055 { .name = "rx3", .dma_req = 42 }, /* DMA_SPI1_RX3 */
1058 static struct omap_hwmod_ocp_if *omap2430_mcspi1_slaves[] = {
1059 &omap2430_l4_core__mcspi1,
1062 static struct omap2_mcspi_dev_attr omap_mcspi1_dev_attr = {
1063 .num_chipselect = 4,
1066 static struct omap_hwmod omap2430_mcspi1_hwmod = {
1067 .name = "mcspi1_hwmod",
1068 .mpu_irqs = omap2430_mcspi1_mpu_irqs,
1069 .mpu_irqs_cnt = ARRAY_SIZE(omap2430_mcspi1_mpu_irqs),
1070 .sdma_reqs = omap2430_mcspi1_sdma_reqs,
1071 .sdma_reqs_cnt = ARRAY_SIZE(omap2430_mcspi1_sdma_reqs),
1072 .main_clk = "mcspi1_fck",
1075 .module_offs = CORE_MOD,
1077 .module_bit = OMAP24XX_EN_MCSPI1_SHIFT,
1079 .idlest_idle_bit = OMAP24XX_ST_MCSPI1_SHIFT,
1082 .slaves = omap2430_mcspi1_slaves,
1083 .slaves_cnt = ARRAY_SIZE(omap2430_mcspi1_slaves),
1084 .class = &omap2430_mcspi_class,
1085 .dev_attr = &omap_mcspi1_dev_attr,
1086 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
1090 static struct omap_hwmod_irq_info omap2430_mcspi2_mpu_irqs[] = {
1094 static struct omap_hwmod_dma_info omap2430_mcspi2_sdma_reqs[] = {
1095 { .name = "tx0", .dma_req = 43 }, /* DMA_SPI2_TX0 */
1096 { .name = "rx0", .dma_req = 44 }, /* DMA_SPI2_RX0 */
1097 { .name = "tx1", .dma_req = 45 }, /* DMA_SPI2_TX1 */
1098 { .name = "rx1", .dma_req = 46 }, /* DMA_SPI2_RX1 */
1101 static struct omap_hwmod_ocp_if *omap2430_mcspi2_slaves[] = {
1102 &omap2430_l4_core__mcspi2,
1105 static struct omap2_mcspi_dev_attr omap_mcspi2_dev_attr = {
1106 .num_chipselect = 2,
1109 static struct omap_hwmod omap2430_mcspi2_hwmod = {
1110 .name = "mcspi2_hwmod",
1111 .mpu_irqs = omap2430_mcspi2_mpu_irqs,
1112 .mpu_irqs_cnt = ARRAY_SIZE(omap2430_mcspi2_mpu_irqs),
1113 .sdma_reqs = omap2430_mcspi2_sdma_reqs,
1114 .sdma_reqs_cnt = ARRAY_SIZE(omap2430_mcspi2_sdma_reqs),
1115 .main_clk = "mcspi2_fck",
1118 .module_offs = CORE_MOD,
1120 .module_bit = OMAP24XX_EN_MCSPI2_SHIFT,
1122 .idlest_idle_bit = OMAP24XX_ST_MCSPI2_SHIFT,
1125 .slaves = omap2430_mcspi2_slaves,
1126 .slaves_cnt = ARRAY_SIZE(omap2430_mcspi2_slaves),
1127 .class = &omap2430_mcspi_class,
1128 .dev_attr = &omap_mcspi2_dev_attr,
1129 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
1133 static struct omap_hwmod_irq_info omap2430_mcspi3_mpu_irqs[] = {
1137 static struct omap_hwmod_dma_info omap2430_mcspi3_sdma_reqs[] = {
1138 { .name = "tx0", .dma_req = 15 }, /* DMA_SPI3_TX0 */
1139 { .name = "rx0", .dma_req = 16 }, /* DMA_SPI3_RX0 */
1140 { .name = "tx1", .dma_req = 23 }, /* DMA_SPI3_TX1 */
1141 { .name = "rx1", .dma_req = 24 }, /* DMA_SPI3_RX1 */
1144 static struct omap_hwmod_ocp_if *omap2430_mcspi3_slaves[] = {
1145 &omap2430_l4_core__mcspi3,
1148 static struct omap2_mcspi_dev_attr omap_mcspi3_dev_attr = {
1149 .num_chipselect = 2,
1152 static struct omap_hwmod omap2430_mcspi3_hwmod = {
1153 .name = "mcspi3_hwmod",
1154 .mpu_irqs = omap2430_mcspi3_mpu_irqs,
1155 .mpu_irqs_cnt = ARRAY_SIZE(omap2430_mcspi3_mpu_irqs),
1156 .sdma_reqs = omap2430_mcspi3_sdma_reqs,
1157 .sdma_reqs_cnt = ARRAY_SIZE(omap2430_mcspi3_sdma_reqs),
1158 .main_clk = "mcspi3_fck",
1161 .module_offs = CORE_MOD,
1163 .module_bit = OMAP2430_EN_MCSPI3_SHIFT,
1165 .idlest_idle_bit = OMAP2430_ST_MCSPI3_SHIFT,
1168 .slaves = omap2430_mcspi3_slaves,
1169 .slaves_cnt = ARRAY_SIZE(omap2430_mcspi3_slaves),
1170 .class = &omap2430_mcspi_class,
1171 .dev_attr = &omap_mcspi3_dev_attr,
1172 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
1178 static struct omap_hwmod_class_sysconfig omap2430_usbhsotg_sysc = {
1180 .sysc_offs = 0x0404,
1181 .syss_offs = 0x0408,
1182 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE|
1183 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1185 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1186 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
1187 .sysc_fields = &omap_hwmod_sysc_type1,
1190 static struct omap_hwmod_class usbotg_class = {
1192 .sysc = &omap2430_usbhsotg_sysc,
1196 static struct omap_hwmod_irq_info omap2430_usbhsotg_mpu_irqs[] = {
1198 { .name = "mc", .irq = 92 },
1199 { .name = "dma", .irq = 93 },
1202 static struct omap_hwmod omap2430_usbhsotg_hwmod = {
1203 .name = "usb_otg_hs",
1204 .mpu_irqs = omap2430_usbhsotg_mpu_irqs,
1205 .mpu_irqs_cnt = ARRAY_SIZE(omap2430_usbhsotg_mpu_irqs),
1206 .main_clk = "usbhs_ick",
1210 .module_bit = OMAP2430_EN_USBHS_MASK,
1211 .module_offs = CORE_MOD,
1213 .idlest_idle_bit = OMAP2430_ST_USBHS_SHIFT,
1216 .masters = omap2430_usbhsotg_masters,
1217 .masters_cnt = ARRAY_SIZE(omap2430_usbhsotg_masters),
1218 .slaves = omap2430_usbhsotg_slaves,
1219 .slaves_cnt = ARRAY_SIZE(omap2430_usbhsotg_slaves),
1220 .class = &usbotg_class,
1222 * Erratum ID: i479 idle_req / idle_ack mechanism potentially
1223 * broken when autoidle is enabled
1224 * workaround is to disable the autoidle bit at module level.
1226 .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
1227 | HWMOD_SWSUP_MSTANDBY,
1228 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
1233 static __initdata struct omap_hwmod *omap2430_hwmods[] = {
1234 &omap2430_l3_main_hwmod,
1235 &omap2430_l4_core_hwmod,
1236 &omap2430_l4_wkup_hwmod,
1237 &omap2430_mpu_hwmod,
1238 &omap2430_iva_hwmod,
1239 &omap2430_wd_timer2_hwmod,
1240 &omap2430_uart1_hwmod,
1241 &omap2430_uart2_hwmod,
1242 &omap2430_uart3_hwmod,
1243 &omap2430_i2c1_hwmod,
1244 &omap2430_i2c2_hwmod,
1247 &omap2430_gpio1_hwmod,
1248 &omap2430_gpio2_hwmod,
1249 &omap2430_gpio3_hwmod,
1250 &omap2430_gpio4_hwmod,
1251 &omap2430_gpio5_hwmod,
1253 /* dma_system class*/
1254 &omap2430_dma_system_hwmod,
1257 &omap2430_mcspi1_hwmod,
1258 &omap2430_mcspi2_hwmod,
1259 &omap2430_mcspi3_hwmod,
1262 &omap2430_usbhsotg_hwmod,
1267 int __init omap2430_hwmod_init(void)
1269 return omap_hwmod_init(omap2430_hwmods);