1 /* 2 * omap_hwmod_3xxx_data.c - hardware modules present on the OMAP3xxx chips 3 * 4 * Copyright (C) 2009-2011 Nokia Corporation 5 * Copyright (C) 2012 Texas Instruments, Inc. 6 * Paul Walmsley 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 * 12 * The data in this file should be completely autogeneratable from 13 * the TI hardware database or other technical documentation. 14 * 15 * XXX these should be marked initdata for multi-OMAP kernels 16 */ 17 18 #include <linux/platform_data/i2c-omap.h> 19 #include <linux/power/smartreflex.h> 20 #include <linux/platform_data/hsmmc-omap.h> 21 22 #include <linux/omap-dma.h> 23 #include "l3_3xxx.h" 24 #include "l4_3xxx.h" 25 26 #include "soc.h" 27 #include "omap_hwmod.h" 28 #include "omap_hwmod_common_data.h" 29 #include "prm-regbits-34xx.h" 30 #include "cm-regbits-34xx.h" 31 32 #include "i2c.h" 33 #include "wd_timer.h" 34 #include "serial.h" 35 36 /* 37 * OMAP3xxx hardware module integration data 38 * 39 * All of the data in this section should be autogeneratable from the 40 * TI hardware database or other technical documentation. Data that 41 * is driver-specific or driver-kernel integration-specific belongs 42 * elsewhere. 43 */ 44 45 #define AM35XX_IPSS_USBOTGSS_BASE 0x5C040000 46 47 /* 48 * IP blocks 49 */ 50 51 /* L3 */ 52 53 static struct omap_hwmod omap3xxx_l3_main_hwmod = { 54 .name = "l3_main", 55 .class = &l3_hwmod_class, 56 .flags = HWMOD_NO_IDLEST, 57 }; 58 59 /* L4 CORE */ 60 static struct omap_hwmod omap3xxx_l4_core_hwmod = { 61 .name = "l4_core", 62 .class = &l4_hwmod_class, 63 .flags = HWMOD_NO_IDLEST, 64 }; 65 66 /* L4 PER */ 67 static struct omap_hwmod omap3xxx_l4_per_hwmod = { 68 .name = "l4_per", 69 .class = &l4_hwmod_class, 70 .flags = HWMOD_NO_IDLEST, 71 }; 72 73 /* L4 WKUP */ 74 static struct omap_hwmod omap3xxx_l4_wkup_hwmod = { 75 .name = "l4_wkup", 76 .class = &l4_hwmod_class, 77 .flags = HWMOD_NO_IDLEST, 78 }; 79 80 /* L4 SEC */ 81 static struct omap_hwmod omap3xxx_l4_sec_hwmod = { 82 .name = "l4_sec", 83 .class = &l4_hwmod_class, 84 .flags = HWMOD_NO_IDLEST, 85 }; 86 87 /* MPU */ 88 89 static struct omap_hwmod omap3xxx_mpu_hwmod = { 90 .name = "mpu", 91 .class = &mpu_hwmod_class, 92 .main_clk = "arm_fck", 93 }; 94 95 /* IVA2 (IVA2) */ 96 static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = { 97 { .name = "logic", .rst_shift = 0, .st_shift = 8 }, 98 { .name = "seq0", .rst_shift = 1, .st_shift = 9 }, 99 { .name = "seq1", .rst_shift = 2, .st_shift = 10 }, 100 }; 101 102 static struct omap_hwmod omap3xxx_iva_hwmod = { 103 .name = "iva", 104 .class = &iva_hwmod_class, 105 .clkdm_name = "iva2_clkdm", 106 .rst_lines = omap3xxx_iva_resets, 107 .rst_lines_cnt = ARRAY_SIZE(omap3xxx_iva_resets), 108 .main_clk = "iva2_ck", 109 .prcm = { 110 .omap2 = { 111 .module_offs = OMAP3430_IVA2_MOD, 112 .idlest_reg_id = 1, 113 .idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT, 114 }, 115 }, 116 }; 117 118 /* 119 * 'debugss' class 120 * debug and emulation sub system 121 */ 122 123 static struct omap_hwmod_class omap3xxx_debugss_hwmod_class = { 124 .name = "debugss", 125 }; 126 127 /* debugss */ 128 static struct omap_hwmod omap3xxx_debugss_hwmod = { 129 .name = "debugss", 130 .class = &omap3xxx_debugss_hwmod_class, 131 .clkdm_name = "emu_clkdm", 132 .main_clk = "emu_src_ck", 133 .flags = HWMOD_NO_IDLEST, 134 }; 135 136 /* timer class */ 137 static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = { 138 .rev_offs = 0x0000, 139 .sysc_offs = 0x0010, 140 .syss_offs = 0x0014, 141 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY | 142 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 143 SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE | 144 SYSS_HAS_RESET_STATUS), 145 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 146 .sysc_fields = &omap_hwmod_sysc_type1, 147 }; 148 149 static struct omap_hwmod_class omap3xxx_timer_hwmod_class = { 150 .name = "timer", 151 .sysc = &omap3xxx_timer_sysc, 152 }; 153 154 /* timer1 */ 155 static struct omap_hwmod omap3xxx_timer1_hwmod = { 156 .name = "timer1", 157 .main_clk = "gpt1_fck", 158 .prcm = { 159 .omap2 = { 160 .module_offs = WKUP_MOD, 161 .idlest_reg_id = 1, 162 .idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT, 163 }, 164 }, 165 .class = &omap3xxx_timer_hwmod_class, 166 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 167 }; 168 169 /* timer2 */ 170 static struct omap_hwmod omap3xxx_timer2_hwmod = { 171 .name = "timer2", 172 .main_clk = "gpt2_fck", 173 .prcm = { 174 .omap2 = { 175 .module_offs = OMAP3430_PER_MOD, 176 .idlest_reg_id = 1, 177 .idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT, 178 }, 179 }, 180 .class = &omap3xxx_timer_hwmod_class, 181 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 182 }; 183 184 /* timer3 */ 185 static struct omap_hwmod omap3xxx_timer3_hwmod = { 186 .name = "timer3", 187 .main_clk = "gpt3_fck", 188 .prcm = { 189 .omap2 = { 190 .module_offs = OMAP3430_PER_MOD, 191 .idlest_reg_id = 1, 192 .idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT, 193 }, 194 }, 195 .class = &omap3xxx_timer_hwmod_class, 196 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 197 }; 198 199 /* timer4 */ 200 static struct omap_hwmod omap3xxx_timer4_hwmod = { 201 .name = "timer4", 202 .main_clk = "gpt4_fck", 203 .prcm = { 204 .omap2 = { 205 .module_offs = OMAP3430_PER_MOD, 206 .idlest_reg_id = 1, 207 .idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT, 208 }, 209 }, 210 .class = &omap3xxx_timer_hwmod_class, 211 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 212 }; 213 214 /* timer5 */ 215 static struct omap_hwmod omap3xxx_timer5_hwmod = { 216 .name = "timer5", 217 .main_clk = "gpt5_fck", 218 .prcm = { 219 .omap2 = { 220 .module_offs = OMAP3430_PER_MOD, 221 .idlest_reg_id = 1, 222 .idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT, 223 }, 224 }, 225 .class = &omap3xxx_timer_hwmod_class, 226 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 227 }; 228 229 /* timer6 */ 230 static struct omap_hwmod omap3xxx_timer6_hwmod = { 231 .name = "timer6", 232 .main_clk = "gpt6_fck", 233 .prcm = { 234 .omap2 = { 235 .module_offs = OMAP3430_PER_MOD, 236 .idlest_reg_id = 1, 237 .idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT, 238 }, 239 }, 240 .class = &omap3xxx_timer_hwmod_class, 241 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 242 }; 243 244 /* timer7 */ 245 static struct omap_hwmod omap3xxx_timer7_hwmod = { 246 .name = "timer7", 247 .main_clk = "gpt7_fck", 248 .prcm = { 249 .omap2 = { 250 .module_offs = OMAP3430_PER_MOD, 251 .idlest_reg_id = 1, 252 .idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT, 253 }, 254 }, 255 .class = &omap3xxx_timer_hwmod_class, 256 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 257 }; 258 259 /* timer8 */ 260 static struct omap_hwmod omap3xxx_timer8_hwmod = { 261 .name = "timer8", 262 .main_clk = "gpt8_fck", 263 .prcm = { 264 .omap2 = { 265 .module_offs = OMAP3430_PER_MOD, 266 .idlest_reg_id = 1, 267 .idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT, 268 }, 269 }, 270 .class = &omap3xxx_timer_hwmod_class, 271 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 272 }; 273 274 /* timer9 */ 275 static struct omap_hwmod omap3xxx_timer9_hwmod = { 276 .name = "timer9", 277 .main_clk = "gpt9_fck", 278 .prcm = { 279 .omap2 = { 280 .module_offs = OMAP3430_PER_MOD, 281 .idlest_reg_id = 1, 282 .idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT, 283 }, 284 }, 285 .class = &omap3xxx_timer_hwmod_class, 286 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 287 }; 288 289 /* timer10 */ 290 static struct omap_hwmod omap3xxx_timer10_hwmod = { 291 .name = "timer10", 292 .main_clk = "gpt10_fck", 293 .prcm = { 294 .omap2 = { 295 .module_offs = CORE_MOD, 296 .idlest_reg_id = 1, 297 .idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT, 298 }, 299 }, 300 .class = &omap3xxx_timer_hwmod_class, 301 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 302 }; 303 304 /* timer11 */ 305 static struct omap_hwmod omap3xxx_timer11_hwmod = { 306 .name = "timer11", 307 .main_clk = "gpt11_fck", 308 .prcm = { 309 .omap2 = { 310 .module_offs = CORE_MOD, 311 .idlest_reg_id = 1, 312 .idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT, 313 }, 314 }, 315 .class = &omap3xxx_timer_hwmod_class, 316 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 317 }; 318 319 /* timer12 */ 320 static struct omap_hwmod omap3xxx_timer12_hwmod = { 321 .name = "timer12", 322 .main_clk = "gpt12_fck", 323 .prcm = { 324 .omap2 = { 325 .module_offs = WKUP_MOD, 326 .idlest_reg_id = 1, 327 .idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT, 328 }, 329 }, 330 .class = &omap3xxx_timer_hwmod_class, 331 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 332 }; 333 334 /* 335 * 'wd_timer' class 336 * 32-bit watchdog upward counter that generates a pulse on the reset pin on 337 * overflow condition 338 */ 339 340 static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = { 341 .rev_offs = 0x0000, 342 .sysc_offs = 0x0010, 343 .syss_offs = 0x0014, 344 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE | 345 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 346 SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY | 347 SYSS_HAS_RESET_STATUS), 348 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 349 .sysc_fields = &omap_hwmod_sysc_type1, 350 }; 351 352 /* I2C common */ 353 static struct omap_hwmod_class_sysconfig i2c_sysc = { 354 .rev_offs = 0x00, 355 .sysc_offs = 0x20, 356 .syss_offs = 0x10, 357 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | 358 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 359 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), 360 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 361 .sysc_fields = &omap_hwmod_sysc_type1, 362 }; 363 364 static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = { 365 .name = "wd_timer", 366 .sysc = &omap3xxx_wd_timer_sysc, 367 .pre_shutdown = &omap2_wd_timer_disable, 368 .reset = &omap2_wd_timer_reset, 369 }; 370 371 static struct omap_hwmod omap3xxx_wd_timer2_hwmod = { 372 .name = "wd_timer2", 373 .class = &omap3xxx_wd_timer_hwmod_class, 374 .main_clk = "wdt2_fck", 375 .prcm = { 376 .omap2 = { 377 .module_offs = WKUP_MOD, 378 .idlest_reg_id = 1, 379 .idlest_idle_bit = OMAP3430_ST_WDT2_SHIFT, 380 }, 381 }, 382 /* 383 * XXX: Use software supervised mode, HW supervised smartidle seems to 384 * block CORE power domain idle transitions. Maybe a HW bug in wdt2? 385 */ 386 .flags = HWMOD_SWSUP_SIDLE, 387 }; 388 389 /* UART1 */ 390 static struct omap_hwmod omap3xxx_uart1_hwmod = { 391 .name = "uart1", 392 .main_clk = "uart1_fck", 393 .flags = DEBUG_TI81XXUART1_FLAGS | HWMOD_SWSUP_SIDLE, 394 .prcm = { 395 .omap2 = { 396 .module_offs = CORE_MOD, 397 .idlest_reg_id = 1, 398 .idlest_idle_bit = OMAP3430_EN_UART1_SHIFT, 399 }, 400 }, 401 .class = &omap2_uart_class, 402 }; 403 404 /* UART2 */ 405 static struct omap_hwmod omap3xxx_uart2_hwmod = { 406 .name = "uart2", 407 .main_clk = "uart2_fck", 408 .flags = DEBUG_TI81XXUART2_FLAGS | HWMOD_SWSUP_SIDLE, 409 .prcm = { 410 .omap2 = { 411 .module_offs = CORE_MOD, 412 .idlest_reg_id = 1, 413 .idlest_idle_bit = OMAP3430_EN_UART2_SHIFT, 414 }, 415 }, 416 .class = &omap2_uart_class, 417 }; 418 419 /* UART3 */ 420 static struct omap_hwmod omap3xxx_uart3_hwmod = { 421 .name = "uart3", 422 .main_clk = "uart3_fck", 423 .flags = DEBUG_OMAP3UART3_FLAGS | DEBUG_TI81XXUART3_FLAGS | 424 HWMOD_SWSUP_SIDLE, 425 .prcm = { 426 .omap2 = { 427 .module_offs = OMAP3430_PER_MOD, 428 .idlest_reg_id = 1, 429 .idlest_idle_bit = OMAP3430_EN_UART3_SHIFT, 430 }, 431 }, 432 .class = &omap2_uart_class, 433 }; 434 435 /* UART4 */ 436 437 438 static struct omap_hwmod omap36xx_uart4_hwmod = { 439 .name = "uart4", 440 .main_clk = "uart4_fck", 441 .flags = DEBUG_OMAP3UART4_FLAGS | HWMOD_SWSUP_SIDLE, 442 .prcm = { 443 .omap2 = { 444 .module_offs = OMAP3430_PER_MOD, 445 .idlest_reg_id = 1, 446 .idlest_idle_bit = OMAP3630_EN_UART4_SHIFT, 447 }, 448 }, 449 .class = &omap2_uart_class, 450 }; 451 452 453 454 /* 455 * XXX AM35xx UART4 cannot complete its softreset without uart1_fck or 456 * uart2_fck being enabled. So we add uart1_fck as an optional clock, 457 * below, and set the HWMOD_CONTROL_OPT_CLKS_IN_RESET. This really 458 * should not be needed. The functional clock structure of the AM35xx 459 * UART4 is extremely unclear and opaque; it is unclear what the role 460 * of uart1/2_fck is for the UART4. Any clarification from either 461 * empirical testing or the AM3505/3517 hardware designers would be 462 * most welcome. 463 */ 464 static struct omap_hwmod_opt_clk am35xx_uart4_opt_clks[] = { 465 { .role = "softreset_uart1_fck", .clk = "uart1_fck" }, 466 }; 467 468 static struct omap_hwmod am35xx_uart4_hwmod = { 469 .name = "uart4", 470 .main_clk = "uart4_fck", 471 .prcm = { 472 .omap2 = { 473 .module_offs = CORE_MOD, 474 .idlest_reg_id = 1, 475 .idlest_idle_bit = AM35XX_ST_UART4_SHIFT, 476 }, 477 }, 478 .opt_clks = am35xx_uart4_opt_clks, 479 .opt_clks_cnt = ARRAY_SIZE(am35xx_uart4_opt_clks), 480 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 481 .class = &omap2_uart_class, 482 }; 483 484 static struct omap_hwmod_class i2c_class = { 485 .name = "i2c", 486 .sysc = &i2c_sysc, 487 .reset = &omap_i2c_reset, 488 }; 489 490 /* dss */ 491 static struct omap_hwmod_opt_clk dss_opt_clks[] = { 492 /* 493 * The DSS HW needs all DSS clocks enabled during reset. The dss_core 494 * driver does not use these clocks. 495 */ 496 { .role = "sys_clk", .clk = "dss2_alwon_fck" }, 497 { .role = "tv_clk", .clk = "dss_tv_fck" }, 498 /* required only on OMAP3430 */ 499 { .role = "tv_dac_clk", .clk = "dss_96m_fck" }, 500 }; 501 502 static struct omap_hwmod omap3430es1_dss_core_hwmod = { 503 .name = "dss_core", 504 .class = &omap2_dss_hwmod_class, 505 .main_clk = "dss1_alwon_fck", /* instead of dss_fck */ 506 .prcm = { 507 .omap2 = { 508 .module_offs = OMAP3430_DSS_MOD, 509 .idlest_reg_id = 1, 510 }, 511 }, 512 .opt_clks = dss_opt_clks, 513 .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks), 514 .flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET, 515 }; 516 517 static struct omap_hwmod omap3xxx_dss_core_hwmod = { 518 .name = "dss_core", 519 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 520 .class = &omap2_dss_hwmod_class, 521 .main_clk = "dss1_alwon_fck", /* instead of dss_fck */ 522 .prcm = { 523 .omap2 = { 524 .module_offs = OMAP3430_DSS_MOD, 525 .idlest_reg_id = 1, 526 .idlest_idle_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT, 527 }, 528 }, 529 .opt_clks = dss_opt_clks, 530 .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks), 531 }; 532 533 /* 534 * 'dispc' class 535 * display controller 536 */ 537 538 static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = { 539 .rev_offs = 0x0000, 540 .sysc_offs = 0x0010, 541 .syss_offs = 0x0014, 542 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE | 543 SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | 544 SYSC_HAS_ENAWAKEUP), 545 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | 546 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), 547 .sysc_fields = &omap_hwmod_sysc_type1, 548 }; 549 550 static struct omap_hwmod_class omap3_dispc_hwmod_class = { 551 .name = "dispc", 552 .sysc = &omap3_dispc_sysc, 553 }; 554 555 static struct omap_hwmod omap3xxx_dss_dispc_hwmod = { 556 .name = "dss_dispc", 557 .class = &omap3_dispc_hwmod_class, 558 .main_clk = "dss1_alwon_fck", 559 .prcm = { 560 .omap2 = { 561 .module_offs = OMAP3430_DSS_MOD, 562 }, 563 }, 564 .flags = HWMOD_NO_IDLEST, 565 .dev_attr = &omap2_3_dss_dispc_dev_attr, 566 }; 567 568 /* 569 * 'dsi' class 570 * display serial interface controller 571 */ 572 573 static struct omap_hwmod_class_sysconfig omap3xxx_dsi_sysc = { 574 .rev_offs = 0x0000, 575 .sysc_offs = 0x0010, 576 .syss_offs = 0x0014, 577 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY | 578 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | 579 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), 580 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 581 .sysc_fields = &omap_hwmod_sysc_type1, 582 }; 583 584 static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = { 585 .name = "dsi", 586 .sysc = &omap3xxx_dsi_sysc, 587 }; 588 589 /* dss_dsi1 */ 590 static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = { 591 { .role = "sys_clk", .clk = "dss2_alwon_fck" }, 592 }; 593 594 static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = { 595 .name = "dss_dsi1", 596 .class = &omap3xxx_dsi_hwmod_class, 597 .main_clk = "dss1_alwon_fck", 598 .prcm = { 599 .omap2 = { 600 .module_offs = OMAP3430_DSS_MOD, 601 }, 602 }, 603 .opt_clks = dss_dsi1_opt_clks, 604 .opt_clks_cnt = ARRAY_SIZE(dss_dsi1_opt_clks), 605 .flags = HWMOD_NO_IDLEST, 606 }; 607 608 static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = { 609 { .role = "ick", .clk = "dss_ick" }, 610 }; 611 612 static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = { 613 .name = "dss_rfbi", 614 .class = &omap2_rfbi_hwmod_class, 615 .main_clk = "dss1_alwon_fck", 616 .prcm = { 617 .omap2 = { 618 .module_offs = OMAP3430_DSS_MOD, 619 }, 620 }, 621 .opt_clks = dss_rfbi_opt_clks, 622 .opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks), 623 .flags = HWMOD_NO_IDLEST, 624 }; 625 626 static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = { 627 /* required only on OMAP3430 */ 628 { .role = "tv_dac_clk", .clk = "dss_96m_fck" }, 629 }; 630 631 static struct omap_hwmod omap3xxx_dss_venc_hwmod = { 632 .name = "dss_venc", 633 .class = &omap2_venc_hwmod_class, 634 .main_clk = "dss_tv_fck", 635 .prcm = { 636 .omap2 = { 637 .module_offs = OMAP3430_DSS_MOD, 638 }, 639 }, 640 .opt_clks = dss_venc_opt_clks, 641 .opt_clks_cnt = ARRAY_SIZE(dss_venc_opt_clks), 642 .flags = HWMOD_NO_IDLEST, 643 }; 644 645 /* I2C1 */ 646 static struct omap_hwmod omap3xxx_i2c1_hwmod = { 647 .name = "i2c1", 648 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, 649 .main_clk = "i2c1_fck", 650 .prcm = { 651 .omap2 = { 652 .module_offs = CORE_MOD, 653 .idlest_reg_id = 1, 654 .idlest_idle_bit = OMAP3430_ST_I2C1_SHIFT, 655 }, 656 }, 657 .class = &i2c_class, 658 }; 659 660 /* I2C2 */ 661 static struct omap_hwmod omap3xxx_i2c2_hwmod = { 662 .name = "i2c2", 663 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, 664 .main_clk = "i2c2_fck", 665 .prcm = { 666 .omap2 = { 667 .module_offs = CORE_MOD, 668 .idlest_reg_id = 1, 669 .idlest_idle_bit = OMAP3430_ST_I2C2_SHIFT, 670 }, 671 }, 672 .class = &i2c_class, 673 }; 674 675 /* I2C3 */ 676 static struct omap_hwmod omap3xxx_i2c3_hwmod = { 677 .name = "i2c3", 678 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, 679 .main_clk = "i2c3_fck", 680 .prcm = { 681 .omap2 = { 682 .module_offs = CORE_MOD, 683 .idlest_reg_id = 1, 684 .idlest_idle_bit = OMAP3430_ST_I2C3_SHIFT, 685 }, 686 }, 687 .class = &i2c_class, 688 }; 689 690 /* 691 * 'gpio' class 692 * general purpose io module 693 */ 694 695 static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = { 696 .rev_offs = 0x0000, 697 .sysc_offs = 0x0010, 698 .syss_offs = 0x0014, 699 .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE | 700 SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | 701 SYSS_HAS_RESET_STATUS), 702 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 703 .sysc_fields = &omap_hwmod_sysc_type1, 704 }; 705 706 static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = { 707 .name = "gpio", 708 .sysc = &omap3xxx_gpio_sysc, 709 }; 710 711 /* gpio1 */ 712 static struct omap_hwmod_opt_clk gpio1_opt_clks[] = { 713 { .role = "dbclk", .clk = "gpio1_dbck", }, 714 }; 715 716 static struct omap_hwmod omap3xxx_gpio1_hwmod = { 717 .name = "gpio1", 718 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 719 .main_clk = "gpio1_ick", 720 .opt_clks = gpio1_opt_clks, 721 .opt_clks_cnt = ARRAY_SIZE(gpio1_opt_clks), 722 .prcm = { 723 .omap2 = { 724 .module_offs = WKUP_MOD, 725 .idlest_reg_id = 1, 726 .idlest_idle_bit = OMAP3430_ST_GPIO1_SHIFT, 727 }, 728 }, 729 .class = &omap3xxx_gpio_hwmod_class, 730 }; 731 732 /* gpio2 */ 733 static struct omap_hwmod_opt_clk gpio2_opt_clks[] = { 734 { .role = "dbclk", .clk = "gpio2_dbck", }, 735 }; 736 737 static struct omap_hwmod omap3xxx_gpio2_hwmod = { 738 .name = "gpio2", 739 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 740 .main_clk = "gpio2_ick", 741 .opt_clks = gpio2_opt_clks, 742 .opt_clks_cnt = ARRAY_SIZE(gpio2_opt_clks), 743 .prcm = { 744 .omap2 = { 745 .module_offs = OMAP3430_PER_MOD, 746 .idlest_reg_id = 1, 747 .idlest_idle_bit = OMAP3430_ST_GPIO2_SHIFT, 748 }, 749 }, 750 .class = &omap3xxx_gpio_hwmod_class, 751 }; 752 753 /* gpio3 */ 754 static struct omap_hwmod_opt_clk gpio3_opt_clks[] = { 755 { .role = "dbclk", .clk = "gpio3_dbck", }, 756 }; 757 758 static struct omap_hwmod omap3xxx_gpio3_hwmod = { 759 .name = "gpio3", 760 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 761 .main_clk = "gpio3_ick", 762 .opt_clks = gpio3_opt_clks, 763 .opt_clks_cnt = ARRAY_SIZE(gpio3_opt_clks), 764 .prcm = { 765 .omap2 = { 766 .module_offs = OMAP3430_PER_MOD, 767 .idlest_reg_id = 1, 768 .idlest_idle_bit = OMAP3430_ST_GPIO3_SHIFT, 769 }, 770 }, 771 .class = &omap3xxx_gpio_hwmod_class, 772 }; 773 774 /* gpio4 */ 775 static struct omap_hwmod_opt_clk gpio4_opt_clks[] = { 776 { .role = "dbclk", .clk = "gpio4_dbck", }, 777 }; 778 779 static struct omap_hwmod omap3xxx_gpio4_hwmod = { 780 .name = "gpio4", 781 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 782 .main_clk = "gpio4_ick", 783 .opt_clks = gpio4_opt_clks, 784 .opt_clks_cnt = ARRAY_SIZE(gpio4_opt_clks), 785 .prcm = { 786 .omap2 = { 787 .module_offs = OMAP3430_PER_MOD, 788 .idlest_reg_id = 1, 789 .idlest_idle_bit = OMAP3430_ST_GPIO4_SHIFT, 790 }, 791 }, 792 .class = &omap3xxx_gpio_hwmod_class, 793 }; 794 795 /* gpio5 */ 796 797 static struct omap_hwmod_opt_clk gpio5_opt_clks[] = { 798 { .role = "dbclk", .clk = "gpio5_dbck", }, 799 }; 800 801 static struct omap_hwmod omap3xxx_gpio5_hwmod = { 802 .name = "gpio5", 803 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 804 .main_clk = "gpio5_ick", 805 .opt_clks = gpio5_opt_clks, 806 .opt_clks_cnt = ARRAY_SIZE(gpio5_opt_clks), 807 .prcm = { 808 .omap2 = { 809 .module_offs = OMAP3430_PER_MOD, 810 .idlest_reg_id = 1, 811 .idlest_idle_bit = OMAP3430_ST_GPIO5_SHIFT, 812 }, 813 }, 814 .class = &omap3xxx_gpio_hwmod_class, 815 }; 816 817 /* gpio6 */ 818 819 static struct omap_hwmod_opt_clk gpio6_opt_clks[] = { 820 { .role = "dbclk", .clk = "gpio6_dbck", }, 821 }; 822 823 static struct omap_hwmod omap3xxx_gpio6_hwmod = { 824 .name = "gpio6", 825 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, 826 .main_clk = "gpio6_ick", 827 .opt_clks = gpio6_opt_clks, 828 .opt_clks_cnt = ARRAY_SIZE(gpio6_opt_clks), 829 .prcm = { 830 .omap2 = { 831 .module_offs = OMAP3430_PER_MOD, 832 .idlest_reg_id = 1, 833 .idlest_idle_bit = OMAP3430_ST_GPIO6_SHIFT, 834 }, 835 }, 836 .class = &omap3xxx_gpio_hwmod_class, 837 }; 838 839 /* dma attributes */ 840 static struct omap_dma_dev_attr dma_dev_attr = { 841 .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY | 842 IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY, 843 .lch_count = 32, 844 }; 845 846 static struct omap_hwmod_class_sysconfig omap3xxx_dma_sysc = { 847 .rev_offs = 0x0000, 848 .sysc_offs = 0x002c, 849 .syss_offs = 0x0028, 850 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | 851 SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | 852 SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE | 853 SYSS_HAS_RESET_STATUS), 854 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | 855 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), 856 .sysc_fields = &omap_hwmod_sysc_type1, 857 }; 858 859 static struct omap_hwmod_class omap3xxx_dma_hwmod_class = { 860 .name = "dma", 861 .sysc = &omap3xxx_dma_sysc, 862 }; 863 864 /* dma_system */ 865 static struct omap_hwmod omap3xxx_dma_system_hwmod = { 866 .name = "dma", 867 .class = &omap3xxx_dma_hwmod_class, 868 .main_clk = "core_l3_ick", 869 .prcm = { 870 .omap2 = { 871 .module_offs = CORE_MOD, 872 .idlest_reg_id = 1, 873 .idlest_idle_bit = OMAP3430_ST_SDMA_SHIFT, 874 }, 875 }, 876 .dev_attr = &dma_dev_attr, 877 .flags = HWMOD_NO_IDLEST, 878 }; 879 880 /* 881 * 'mcbsp' class 882 * multi channel buffered serial port controller 883 */ 884 885 static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sysc = { 886 .rev_offs = -ENODEV, 887 .sysc_offs = 0x008c, 888 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP | 889 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET), 890 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 891 .sysc_fields = &omap_hwmod_sysc_type1, 892 }; 893 894 static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = { 895 .name = "mcbsp", 896 .sysc = &omap3xxx_mcbsp_sysc, 897 }; 898 899 /* McBSP functional clock mapping */ 900 static struct omap_hwmod_opt_clk mcbsp15_opt_clks[] = { 901 { .role = "pad_fck", .clk = "mcbsp_clks" }, 902 { .role = "prcm_fck", .clk = "core_96m_fck" }, 903 }; 904 905 static struct omap_hwmod_opt_clk mcbsp234_opt_clks[] = { 906 { .role = "pad_fck", .clk = "mcbsp_clks" }, 907 { .role = "prcm_fck", .clk = "per_96m_fck" }, 908 }; 909 910 /* mcbsp1 */ 911 static struct omap_hwmod omap3xxx_mcbsp1_hwmod = { 912 .name = "mcbsp1", 913 .class = &omap3xxx_mcbsp_hwmod_class, 914 .main_clk = "mcbsp1_fck", 915 .prcm = { 916 .omap2 = { 917 .module_offs = CORE_MOD, 918 .idlest_reg_id = 1, 919 .idlest_idle_bit = OMAP3430_ST_MCBSP1_SHIFT, 920 }, 921 }, 922 .opt_clks = mcbsp15_opt_clks, 923 .opt_clks_cnt = ARRAY_SIZE(mcbsp15_opt_clks), 924 }; 925 926 /* mcbsp2 */ 927 static struct omap_hwmod omap3xxx_mcbsp2_hwmod = { 928 .name = "mcbsp2", 929 .class = &omap3xxx_mcbsp_hwmod_class, 930 .main_clk = "mcbsp2_fck", 931 .prcm = { 932 .omap2 = { 933 .module_offs = OMAP3430_PER_MOD, 934 .idlest_reg_id = 1, 935 .idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT, 936 }, 937 }, 938 .opt_clks = mcbsp234_opt_clks, 939 .opt_clks_cnt = ARRAY_SIZE(mcbsp234_opt_clks), 940 }; 941 942 /* mcbsp3 */ 943 static struct omap_hwmod omap3xxx_mcbsp3_hwmod = { 944 .name = "mcbsp3", 945 .class = &omap3xxx_mcbsp_hwmod_class, 946 .main_clk = "mcbsp3_fck", 947 .prcm = { 948 .omap2 = { 949 .module_offs = OMAP3430_PER_MOD, 950 .idlest_reg_id = 1, 951 .idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT, 952 }, 953 }, 954 .opt_clks = mcbsp234_opt_clks, 955 .opt_clks_cnt = ARRAY_SIZE(mcbsp234_opt_clks), 956 }; 957 958 /* mcbsp4 */ 959 static struct omap_hwmod omap3xxx_mcbsp4_hwmod = { 960 .name = "mcbsp4", 961 .class = &omap3xxx_mcbsp_hwmod_class, 962 .main_clk = "mcbsp4_fck", 963 .prcm = { 964 .omap2 = { 965 .module_offs = OMAP3430_PER_MOD, 966 .idlest_reg_id = 1, 967 .idlest_idle_bit = OMAP3430_ST_MCBSP4_SHIFT, 968 }, 969 }, 970 .opt_clks = mcbsp234_opt_clks, 971 .opt_clks_cnt = ARRAY_SIZE(mcbsp234_opt_clks), 972 }; 973 974 /* mcbsp5 */ 975 static struct omap_hwmod omap3xxx_mcbsp5_hwmod = { 976 .name = "mcbsp5", 977 .class = &omap3xxx_mcbsp_hwmod_class, 978 .main_clk = "mcbsp5_fck", 979 .prcm = { 980 .omap2 = { 981 .module_offs = CORE_MOD, 982 .idlest_reg_id = 1, 983 .idlest_idle_bit = OMAP3430_ST_MCBSP5_SHIFT, 984 }, 985 }, 986 .opt_clks = mcbsp15_opt_clks, 987 .opt_clks_cnt = ARRAY_SIZE(mcbsp15_opt_clks), 988 }; 989 990 /* 'mcbsp sidetone' class */ 991 static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sidetone_sysc = { 992 .rev_offs = -ENODEV, 993 .sysc_offs = 0x0010, 994 .sysc_flags = SYSC_HAS_AUTOIDLE, 995 .sysc_fields = &omap_hwmod_sysc_type1, 996 }; 997 998 static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = { 999 .name = "mcbsp_sidetone", 1000 .sysc = &omap3xxx_mcbsp_sidetone_sysc, 1001 }; 1002 1003 /* mcbsp2_sidetone */ 1004 static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = { 1005 .name = "mcbsp2_sidetone", 1006 .class = &omap3xxx_mcbsp_sidetone_hwmod_class, 1007 .main_clk = "mcbsp2_ick", 1008 .flags = HWMOD_NO_IDLEST, 1009 }; 1010 1011 /* mcbsp3_sidetone */ 1012 static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = { 1013 .name = "mcbsp3_sidetone", 1014 .class = &omap3xxx_mcbsp_sidetone_hwmod_class, 1015 .main_clk = "mcbsp3_ick", 1016 .flags = HWMOD_NO_IDLEST, 1017 }; 1018 1019 /* SR common */ 1020 static struct omap_hwmod_class_sysconfig omap34xx_sr_sysc = { 1021 .rev_offs = -ENODEV, 1022 .sysc_offs = 0x24, 1023 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_NO_CACHE), 1024 .sysc_fields = &omap34xx_sr_sysc_fields, 1025 }; 1026 1027 static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = { 1028 .name = "smartreflex", 1029 .sysc = &omap34xx_sr_sysc, 1030 }; 1031 1032 static struct omap_hwmod_class_sysconfig omap36xx_sr_sysc = { 1033 .rev_offs = -ENODEV, 1034 .sysc_offs = 0x38, 1035 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 1036 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | 1037 SYSC_NO_CACHE), 1038 .sysc_fields = &omap36xx_sr_sysc_fields, 1039 }; 1040 1041 static struct omap_hwmod_class omap36xx_smartreflex_hwmod_class = { 1042 .name = "smartreflex", 1043 .sysc = &omap36xx_sr_sysc, 1044 }; 1045 1046 /* SR1 */ 1047 static struct omap_smartreflex_dev_attr sr1_dev_attr = { 1048 .sensor_voltdm_name = "mpu_iva", 1049 }; 1050 1051 1052 static struct omap_hwmod omap34xx_sr1_hwmod = { 1053 .name = "smartreflex_mpu_iva", 1054 .class = &omap34xx_smartreflex_hwmod_class, 1055 .main_clk = "sr1_fck", 1056 .prcm = { 1057 .omap2 = { 1058 .module_offs = WKUP_MOD, 1059 .idlest_reg_id = 1, 1060 .idlest_idle_bit = OMAP3430_EN_SR1_SHIFT, 1061 }, 1062 }, 1063 .dev_attr = &sr1_dev_attr, 1064 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 1065 }; 1066 1067 static struct omap_hwmod omap36xx_sr1_hwmod = { 1068 .name = "smartreflex_mpu_iva", 1069 .class = &omap36xx_smartreflex_hwmod_class, 1070 .main_clk = "sr1_fck", 1071 .prcm = { 1072 .omap2 = { 1073 .module_offs = WKUP_MOD, 1074 .idlest_reg_id = 1, 1075 .idlest_idle_bit = OMAP3430_EN_SR1_SHIFT, 1076 }, 1077 }, 1078 .dev_attr = &sr1_dev_attr, 1079 }; 1080 1081 /* SR2 */ 1082 static struct omap_smartreflex_dev_attr sr2_dev_attr = { 1083 .sensor_voltdm_name = "core", 1084 }; 1085 1086 1087 static struct omap_hwmod omap34xx_sr2_hwmod = { 1088 .name = "smartreflex_core", 1089 .class = &omap34xx_smartreflex_hwmod_class, 1090 .main_clk = "sr2_fck", 1091 .prcm = { 1092 .omap2 = { 1093 .module_offs = WKUP_MOD, 1094 .idlest_reg_id = 1, 1095 .idlest_idle_bit = OMAP3430_EN_SR2_SHIFT, 1096 }, 1097 }, 1098 .dev_attr = &sr2_dev_attr, 1099 .flags = HWMOD_SET_DEFAULT_CLOCKACT, 1100 }; 1101 1102 static struct omap_hwmod omap36xx_sr2_hwmod = { 1103 .name = "smartreflex_core", 1104 .class = &omap36xx_smartreflex_hwmod_class, 1105 .main_clk = "sr2_fck", 1106 .prcm = { 1107 .omap2 = { 1108 .module_offs = WKUP_MOD, 1109 .idlest_reg_id = 1, 1110 .idlest_idle_bit = OMAP3430_EN_SR2_SHIFT, 1111 }, 1112 }, 1113 .dev_attr = &sr2_dev_attr, 1114 }; 1115 1116 /* 1117 * 'mailbox' class 1118 * mailbox module allowing communication between the on-chip processors 1119 * using a queued mailbox-interrupt mechanism. 1120 */ 1121 1122 static struct omap_hwmod_class_sysconfig omap3xxx_mailbox_sysc = { 1123 .rev_offs = 0x000, 1124 .sysc_offs = 0x010, 1125 .syss_offs = 0x014, 1126 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | 1127 SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), 1128 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 1129 .sysc_fields = &omap_hwmod_sysc_type1, 1130 }; 1131 1132 static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = { 1133 .name = "mailbox", 1134 .sysc = &omap3xxx_mailbox_sysc, 1135 }; 1136 1137 static struct omap_hwmod omap3xxx_mailbox_hwmod = { 1138 .name = "mailbox", 1139 .class = &omap3xxx_mailbox_hwmod_class, 1140 .main_clk = "mailboxes_ick", 1141 .prcm = { 1142 .omap2 = { 1143 .module_offs = CORE_MOD, 1144 .idlest_reg_id = 1, 1145 .idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT, 1146 }, 1147 }, 1148 }; 1149 1150 /* 1151 * 'mcspi' class 1152 * multichannel serial port interface (mcspi) / master/slave synchronous serial 1153 * bus 1154 */ 1155 1156 static struct omap_hwmod_class_sysconfig omap34xx_mcspi_sysc = { 1157 .rev_offs = 0x0000, 1158 .sysc_offs = 0x0010, 1159 .syss_offs = 0x0014, 1160 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | 1161 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 1162 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), 1163 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 1164 .sysc_fields = &omap_hwmod_sysc_type1, 1165 }; 1166 1167 static struct omap_hwmod_class omap34xx_mcspi_class = { 1168 .name = "mcspi", 1169 .sysc = &omap34xx_mcspi_sysc, 1170 }; 1171 1172 /* mcspi1 */ 1173 static struct omap_hwmod omap34xx_mcspi1 = { 1174 .name = "mcspi1", 1175 .main_clk = "mcspi1_fck", 1176 .prcm = { 1177 .omap2 = { 1178 .module_offs = CORE_MOD, 1179 .idlest_reg_id = 1, 1180 .idlest_idle_bit = OMAP3430_ST_MCSPI1_SHIFT, 1181 }, 1182 }, 1183 .class = &omap34xx_mcspi_class, 1184 }; 1185 1186 /* mcspi2 */ 1187 static struct omap_hwmod omap34xx_mcspi2 = { 1188 .name = "mcspi2", 1189 .main_clk = "mcspi2_fck", 1190 .prcm = { 1191 .omap2 = { 1192 .module_offs = CORE_MOD, 1193 .idlest_reg_id = 1, 1194 .idlest_idle_bit = OMAP3430_ST_MCSPI2_SHIFT, 1195 }, 1196 }, 1197 .class = &omap34xx_mcspi_class, 1198 }; 1199 1200 /* mcspi3 */ 1201 static struct omap_hwmod omap34xx_mcspi3 = { 1202 .name = "mcspi3", 1203 .main_clk = "mcspi3_fck", 1204 .prcm = { 1205 .omap2 = { 1206 .module_offs = CORE_MOD, 1207 .idlest_reg_id = 1, 1208 .idlest_idle_bit = OMAP3430_ST_MCSPI3_SHIFT, 1209 }, 1210 }, 1211 .class = &omap34xx_mcspi_class, 1212 }; 1213 1214 /* mcspi4 */ 1215 static struct omap_hwmod omap34xx_mcspi4 = { 1216 .name = "mcspi4", 1217 .main_clk = "mcspi4_fck", 1218 .prcm = { 1219 .omap2 = { 1220 .module_offs = CORE_MOD, 1221 .idlest_reg_id = 1, 1222 .idlest_idle_bit = OMAP3430_ST_MCSPI4_SHIFT, 1223 }, 1224 }, 1225 .class = &omap34xx_mcspi_class, 1226 }; 1227 1228 /* usbhsotg */ 1229 static struct omap_hwmod_class_sysconfig omap3xxx_usbhsotg_sysc = { 1230 .rev_offs = 0x0400, 1231 .sysc_offs = 0x0404, 1232 .syss_offs = 0x0408, 1233 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE| 1234 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 1235 SYSC_HAS_AUTOIDLE), 1236 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | 1237 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), 1238 .sysc_fields = &omap_hwmod_sysc_type1, 1239 }; 1240 1241 static struct omap_hwmod_class usbotg_class = { 1242 .name = "usbotg", 1243 .sysc = &omap3xxx_usbhsotg_sysc, 1244 }; 1245 1246 /* usb_otg_hs */ 1247 1248 static struct omap_hwmod omap3xxx_usbhsotg_hwmod = { 1249 .name = "usb_otg_hs", 1250 .main_clk = "hsotgusb_ick", 1251 .prcm = { 1252 .omap2 = { 1253 .module_offs = CORE_MOD, 1254 .idlest_reg_id = 1, 1255 .idlest_idle_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT, 1256 }, 1257 }, 1258 .class = &usbotg_class, 1259 1260 /* 1261 * Erratum ID: i479 idle_req / idle_ack mechanism potentially 1262 * broken when autoidle is enabled 1263 * workaround is to disable the autoidle bit at module level. 1264 * 1265 * Enabling the device in any other MIDLEMODE setting but force-idle 1266 * causes core_pwrdm not enter idle states at least on OMAP3630. 1267 * Note that musb has OTG_FORCESTDBY register that controls MSTANDBY 1268 * signal when MIDLEMODE is set to force-idle. 1269 */ 1270 .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE | 1271 HWMOD_FORCE_MSTANDBY | HWMOD_RECONFIG_IO_CHAIN, 1272 }; 1273 1274 /* usb_otg_hs */ 1275 1276 static struct omap_hwmod_class am35xx_usbotg_class = { 1277 .name = "am35xx_usbotg", 1278 }; 1279 1280 static struct omap_hwmod am35xx_usbhsotg_hwmod = { 1281 .name = "am35x_otg_hs", 1282 .main_clk = "hsotgusb_fck", 1283 .class = &am35xx_usbotg_class, 1284 .flags = HWMOD_NO_IDLEST, 1285 }; 1286 1287 /* MMC/SD/SDIO common */ 1288 static struct omap_hwmod_class_sysconfig omap34xx_mmc_sysc = { 1289 .rev_offs = 0x1fc, 1290 .sysc_offs = 0x10, 1291 .syss_offs = 0x14, 1292 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | 1293 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 1294 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), 1295 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 1296 .sysc_fields = &omap_hwmod_sysc_type1, 1297 }; 1298 1299 static struct omap_hwmod_class omap34xx_mmc_class = { 1300 .name = "mmc", 1301 .sysc = &omap34xx_mmc_sysc, 1302 }; 1303 1304 /* MMC/SD/SDIO1 */ 1305 1306 1307 1308 static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = { 1309 { .role = "dbck", .clk = "omap_32k_fck", }, 1310 }; 1311 1312 static struct omap_hsmmc_dev_attr mmc1_dev_attr = { 1313 .flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT, 1314 }; 1315 1316 /* See 35xx errata 2.1.1.128 in SPRZ278F */ 1317 static struct omap_hsmmc_dev_attr mmc1_pre_es3_dev_attr = { 1318 .flags = (OMAP_HSMMC_SUPPORTS_DUAL_VOLT | 1319 OMAP_HSMMC_BROKEN_MULTIBLOCK_READ), 1320 }; 1321 1322 static struct omap_hwmod omap3xxx_pre_es3_mmc1_hwmod = { 1323 .name = "mmc1", 1324 .opt_clks = omap34xx_mmc1_opt_clks, 1325 .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc1_opt_clks), 1326 .main_clk = "mmchs1_fck", 1327 .prcm = { 1328 .omap2 = { 1329 .module_offs = CORE_MOD, 1330 .idlest_reg_id = 1, 1331 .idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT, 1332 }, 1333 }, 1334 .dev_attr = &mmc1_pre_es3_dev_attr, 1335 .class = &omap34xx_mmc_class, 1336 }; 1337 1338 static struct omap_hwmod omap3xxx_es3plus_mmc1_hwmod = { 1339 .name = "mmc1", 1340 .opt_clks = omap34xx_mmc1_opt_clks, 1341 .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc1_opt_clks), 1342 .main_clk = "mmchs1_fck", 1343 .prcm = { 1344 .omap2 = { 1345 .module_offs = CORE_MOD, 1346 .idlest_reg_id = 1, 1347 .idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT, 1348 }, 1349 }, 1350 .dev_attr = &mmc1_dev_attr, 1351 .class = &omap34xx_mmc_class, 1352 }; 1353 1354 /* MMC/SD/SDIO2 */ 1355 1356 1357 1358 static struct omap_hwmod_opt_clk omap34xx_mmc2_opt_clks[] = { 1359 { .role = "dbck", .clk = "omap_32k_fck", }, 1360 }; 1361 1362 /* See 35xx errata 2.1.1.128 in SPRZ278F */ 1363 static struct omap_hsmmc_dev_attr mmc2_pre_es3_dev_attr = { 1364 .flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ, 1365 }; 1366 1367 static struct omap_hwmod omap3xxx_pre_es3_mmc2_hwmod = { 1368 .name = "mmc2", 1369 .opt_clks = omap34xx_mmc2_opt_clks, 1370 .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc2_opt_clks), 1371 .main_clk = "mmchs2_fck", 1372 .prcm = { 1373 .omap2 = { 1374 .module_offs = CORE_MOD, 1375 .idlest_reg_id = 1, 1376 .idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT, 1377 }, 1378 }, 1379 .dev_attr = &mmc2_pre_es3_dev_attr, 1380 .class = &omap34xx_mmc_class, 1381 }; 1382 1383 static struct omap_hwmod omap3xxx_es3plus_mmc2_hwmod = { 1384 .name = "mmc2", 1385 .opt_clks = omap34xx_mmc2_opt_clks, 1386 .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc2_opt_clks), 1387 .main_clk = "mmchs2_fck", 1388 .prcm = { 1389 .omap2 = { 1390 .module_offs = CORE_MOD, 1391 .idlest_reg_id = 1, 1392 .idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT, 1393 }, 1394 }, 1395 .class = &omap34xx_mmc_class, 1396 }; 1397 1398 /* MMC/SD/SDIO3 */ 1399 1400 1401 1402 static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = { 1403 { .role = "dbck", .clk = "omap_32k_fck", }, 1404 }; 1405 1406 static struct omap_hwmod omap3xxx_mmc3_hwmod = { 1407 .name = "mmc3", 1408 .opt_clks = omap34xx_mmc3_opt_clks, 1409 .opt_clks_cnt = ARRAY_SIZE(omap34xx_mmc3_opt_clks), 1410 .main_clk = "mmchs3_fck", 1411 .prcm = { 1412 .omap2 = { 1413 .module_offs = CORE_MOD, 1414 .idlest_reg_id = 1, 1415 .idlest_idle_bit = OMAP3430_ST_MMC3_SHIFT, 1416 }, 1417 }, 1418 .class = &omap34xx_mmc_class, 1419 }; 1420 1421 /* 1422 * 'usb_host_hs' class 1423 * high-speed multi-port usb host controller 1424 */ 1425 1426 static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = { 1427 .rev_offs = 0x0000, 1428 .sysc_offs = 0x0010, 1429 .syss_offs = 0x0014, 1430 .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | 1431 SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | 1432 SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | 1433 SYSS_HAS_RESET_STATUS), 1434 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | 1435 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), 1436 .sysc_fields = &omap_hwmod_sysc_type1, 1437 }; 1438 1439 static struct omap_hwmod_class omap3xxx_usb_host_hs_hwmod_class = { 1440 .name = "usb_host_hs", 1441 .sysc = &omap3xxx_usb_host_hs_sysc, 1442 }; 1443 1444 1445 static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { 1446 .name = "usb_host_hs", 1447 .class = &omap3xxx_usb_host_hs_hwmod_class, 1448 .clkdm_name = "usbhost_clkdm", 1449 .main_clk = "usbhost_48m_fck", 1450 .prcm = { 1451 .omap2 = { 1452 .module_offs = OMAP3430ES2_USBHOST_MOD, 1453 .idlest_reg_id = 1, 1454 .idlest_idle_bit = OMAP3430ES2_ST_USBHOST_IDLE_SHIFT, 1455 }, 1456 }, 1457 1458 /* 1459 * Errata: USBHOST Configured In Smart-Idle Can Lead To a Deadlock 1460 * id: i660 1461 * 1462 * Description: 1463 * In the following configuration : 1464 * - USBHOST module is set to smart-idle mode 1465 * - PRCM asserts idle_req to the USBHOST module ( This typically 1466 * happens when the system is going to a low power mode : all ports 1467 * have been suspended, the master part of the USBHOST module has 1468 * entered the standby state, and SW has cut the functional clocks) 1469 * - an USBHOST interrupt occurs before the module is able to answer 1470 * idle_ack, typically a remote wakeup IRQ. 1471 * Then the USB HOST module will enter a deadlock situation where it 1472 * is no more accessible nor functional. 1473 * 1474 * Workaround: 1475 * Don't use smart idle; use only force idle, hence HWMOD_SWSUP_SIDLE 1476 */ 1477 1478 /* 1479 * Errata: USB host EHCI may stall when entering smart-standby mode 1480 * Id: i571 1481 * 1482 * Description: 1483 * When the USBHOST module is set to smart-standby mode, and when it is 1484 * ready to enter the standby state (i.e. all ports are suspended and 1485 * all attached devices are in suspend mode), then it can wrongly assert 1486 * the Mstandby signal too early while there are still some residual OCP 1487 * transactions ongoing. If this condition occurs, the internal state 1488 * machine may go to an undefined state and the USB link may be stuck 1489 * upon the next resume. 1490 * 1491 * Workaround: 1492 * Don't use smart standby; use only force standby, 1493 * hence HWMOD_SWSUP_MSTANDBY 1494 */ 1495 1496 .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY, 1497 }; 1498 1499 /* 1500 * 'usb_tll_hs' class 1501 * usb_tll_hs module is the adapter on the usb_host_hs ports 1502 */ 1503 static struct omap_hwmod_class_sysconfig omap3xxx_usb_tll_hs_sysc = { 1504 .rev_offs = 0x0000, 1505 .sysc_offs = 0x0010, 1506 .syss_offs = 0x0014, 1507 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | 1508 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET | 1509 SYSC_HAS_AUTOIDLE), 1510 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 1511 .sysc_fields = &omap_hwmod_sysc_type1, 1512 }; 1513 1514 static struct omap_hwmod_class omap3xxx_usb_tll_hs_hwmod_class = { 1515 .name = "usb_tll_hs", 1516 .sysc = &omap3xxx_usb_tll_hs_sysc, 1517 }; 1518 1519 1520 static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { 1521 .name = "usb_tll_hs", 1522 .class = &omap3xxx_usb_tll_hs_hwmod_class, 1523 .clkdm_name = "core_l4_clkdm", 1524 .main_clk = "usbtll_fck", 1525 .prcm = { 1526 .omap2 = { 1527 .module_offs = CORE_MOD, 1528 .idlest_reg_id = 3, 1529 .idlest_idle_bit = OMAP3430ES2_ST_USBTLL_SHIFT, 1530 }, 1531 }, 1532 }; 1533 1534 static struct omap_hwmod omap3xxx_hdq1w_hwmod = { 1535 .name = "hdq1w", 1536 .main_clk = "hdq_fck", 1537 .prcm = { 1538 .omap2 = { 1539 .module_offs = CORE_MOD, 1540 .idlest_reg_id = 1, 1541 .idlest_idle_bit = OMAP3430_ST_HDQ_SHIFT, 1542 }, 1543 }, 1544 .class = &omap2_hdq1w_class, 1545 }; 1546 1547 /* SAD2D */ 1548 static struct omap_hwmod_rst_info omap3xxx_sad2d_resets[] = { 1549 { .name = "rst_modem_pwron_sw", .rst_shift = 0 }, 1550 { .name = "rst_modem_sw", .rst_shift = 1 }, 1551 }; 1552 1553 static struct omap_hwmod_class omap3xxx_sad2d_class = { 1554 .name = "sad2d", 1555 }; 1556 1557 static struct omap_hwmod omap3xxx_sad2d_hwmod = { 1558 .name = "sad2d", 1559 .rst_lines = omap3xxx_sad2d_resets, 1560 .rst_lines_cnt = ARRAY_SIZE(omap3xxx_sad2d_resets), 1561 .main_clk = "sad2d_ick", 1562 .prcm = { 1563 .omap2 = { 1564 .module_offs = CORE_MOD, 1565 .idlest_reg_id = 1, 1566 .idlest_idle_bit = OMAP3430_ST_SAD2D_SHIFT, 1567 }, 1568 }, 1569 .class = &omap3xxx_sad2d_class, 1570 }; 1571 1572 /* 1573 * '32K sync counter' class 1574 * 32-bit ordinary counter, clocked by the falling edge of the 32 khz clock 1575 */ 1576 static struct omap_hwmod_class_sysconfig omap3xxx_counter_sysc = { 1577 .rev_offs = 0x0000, 1578 .sysc_offs = 0x0004, 1579 .sysc_flags = SYSC_HAS_SIDLEMODE, 1580 .idlemodes = (SIDLE_FORCE | SIDLE_NO), 1581 .sysc_fields = &omap_hwmod_sysc_type1, 1582 }; 1583 1584 static struct omap_hwmod_class omap3xxx_counter_hwmod_class = { 1585 .name = "counter", 1586 .sysc = &omap3xxx_counter_sysc, 1587 }; 1588 1589 static struct omap_hwmod omap3xxx_counter_32k_hwmod = { 1590 .name = "counter_32k", 1591 .class = &omap3xxx_counter_hwmod_class, 1592 .clkdm_name = "wkup_clkdm", 1593 .flags = HWMOD_SWSUP_SIDLE, 1594 .main_clk = "wkup_32k_fck", 1595 .prcm = { 1596 .omap2 = { 1597 .module_offs = WKUP_MOD, 1598 .idlest_reg_id = 1, 1599 .idlest_idle_bit = OMAP3430_ST_32KSYNC_SHIFT, 1600 }, 1601 }, 1602 }; 1603 1604 /* 1605 * 'gpmc' class 1606 * general purpose memory controller 1607 */ 1608 1609 static struct omap_hwmod_class_sysconfig omap3xxx_gpmc_sysc = { 1610 .rev_offs = 0x0000, 1611 .sysc_offs = 0x0010, 1612 .syss_offs = 0x0014, 1613 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE | 1614 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), 1615 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 1616 .sysc_fields = &omap_hwmod_sysc_type1, 1617 }; 1618 1619 static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = { 1620 .name = "gpmc", 1621 .sysc = &omap3xxx_gpmc_sysc, 1622 }; 1623 1624 static struct omap_hwmod omap3xxx_gpmc_hwmod = { 1625 .name = "gpmc", 1626 .class = &omap3xxx_gpmc_hwmod_class, 1627 .clkdm_name = "core_l3_clkdm", 1628 .main_clk = "gpmc_fck", 1629 /* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */ 1630 .flags = HWMOD_NO_IDLEST | DEBUG_OMAP_GPMC_HWMOD_FLAGS, 1631 }; 1632 1633 /* 1634 * interfaces 1635 */ 1636 1637 /* L3 -> L4_CORE interface */ 1638 static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = { 1639 .master = &omap3xxx_l3_main_hwmod, 1640 .slave = &omap3xxx_l4_core_hwmod, 1641 .user = OCP_USER_MPU | OCP_USER_SDMA, 1642 }; 1643 1644 /* L3 -> L4_PER interface */ 1645 static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = { 1646 .master = &omap3xxx_l3_main_hwmod, 1647 .slave = &omap3xxx_l4_per_hwmod, 1648 .user = OCP_USER_MPU | OCP_USER_SDMA, 1649 }; 1650 1651 1652 /* MPU -> L3 interface */ 1653 static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = { 1654 .master = &omap3xxx_mpu_hwmod, 1655 .slave = &omap3xxx_l3_main_hwmod, 1656 .user = OCP_USER_MPU, 1657 }; 1658 1659 1660 /* l3 -> debugss */ 1661 static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_debugss = { 1662 .master = &omap3xxx_l3_main_hwmod, 1663 .slave = &omap3xxx_debugss_hwmod, 1664 .user = OCP_USER_MPU, 1665 }; 1666 1667 /* DSS -> l3 */ 1668 static struct omap_hwmod_ocp_if omap3430es1_dss__l3 = { 1669 .master = &omap3430es1_dss_core_hwmod, 1670 .slave = &omap3xxx_l3_main_hwmod, 1671 .user = OCP_USER_MPU | OCP_USER_SDMA, 1672 }; 1673 1674 static struct omap_hwmod_ocp_if omap3xxx_dss__l3 = { 1675 .master = &omap3xxx_dss_core_hwmod, 1676 .slave = &omap3xxx_l3_main_hwmod, 1677 .fw = { 1678 .omap2 = { 1679 .l3_perm_bit = OMAP3_L3_CORE_FW_INIT_ID_DSS, 1680 .flags = OMAP_FIREWALL_L3, 1681 }, 1682 }, 1683 .user = OCP_USER_MPU | OCP_USER_SDMA, 1684 }; 1685 1686 /* l3_core -> usbhsotg interface */ 1687 static struct omap_hwmod_ocp_if omap3xxx_usbhsotg__l3 = { 1688 .master = &omap3xxx_usbhsotg_hwmod, 1689 .slave = &omap3xxx_l3_main_hwmod, 1690 .clk = "core_l3_ick", 1691 .user = OCP_USER_MPU, 1692 }; 1693 1694 /* l3_core -> am35xx_usbhsotg interface */ 1695 static struct omap_hwmod_ocp_if am35xx_usbhsotg__l3 = { 1696 .master = &am35xx_usbhsotg_hwmod, 1697 .slave = &omap3xxx_l3_main_hwmod, 1698 .clk = "hsotgusb_ick", 1699 .user = OCP_USER_MPU, 1700 }; 1701 1702 /* l3_core -> sad2d interface */ 1703 static struct omap_hwmod_ocp_if omap3xxx_sad2d__l3 = { 1704 .master = &omap3xxx_sad2d_hwmod, 1705 .slave = &omap3xxx_l3_main_hwmod, 1706 .clk = "core_l3_ick", 1707 .user = OCP_USER_MPU, 1708 }; 1709 1710 /* L4_CORE -> L4_WKUP interface */ 1711 static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = { 1712 .master = &omap3xxx_l4_core_hwmod, 1713 .slave = &omap3xxx_l4_wkup_hwmod, 1714 .user = OCP_USER_MPU | OCP_USER_SDMA, 1715 }; 1716 1717 /* L4 CORE -> MMC1 interface */ 1718 static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc1 = { 1719 .master = &omap3xxx_l4_core_hwmod, 1720 .slave = &omap3xxx_pre_es3_mmc1_hwmod, 1721 .clk = "mmchs1_ick", 1722 .user = OCP_USER_MPU | OCP_USER_SDMA, 1723 .flags = OMAP_FIREWALL_L4, 1724 }; 1725 1726 static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc1 = { 1727 .master = &omap3xxx_l4_core_hwmod, 1728 .slave = &omap3xxx_es3plus_mmc1_hwmod, 1729 .clk = "mmchs1_ick", 1730 .user = OCP_USER_MPU | OCP_USER_SDMA, 1731 .flags = OMAP_FIREWALL_L4, 1732 }; 1733 1734 /* L4 CORE -> MMC2 interface */ 1735 static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc2 = { 1736 .master = &omap3xxx_l4_core_hwmod, 1737 .slave = &omap3xxx_pre_es3_mmc2_hwmod, 1738 .clk = "mmchs2_ick", 1739 .user = OCP_USER_MPU | OCP_USER_SDMA, 1740 .flags = OMAP_FIREWALL_L4, 1741 }; 1742 1743 static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc2 = { 1744 .master = &omap3xxx_l4_core_hwmod, 1745 .slave = &omap3xxx_es3plus_mmc2_hwmod, 1746 .clk = "mmchs2_ick", 1747 .user = OCP_USER_MPU | OCP_USER_SDMA, 1748 .flags = OMAP_FIREWALL_L4, 1749 }; 1750 1751 /* L4 CORE -> MMC3 interface */ 1752 1753 static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc3 = { 1754 .master = &omap3xxx_l4_core_hwmod, 1755 .slave = &omap3xxx_mmc3_hwmod, 1756 .clk = "mmchs3_ick", 1757 .user = OCP_USER_MPU | OCP_USER_SDMA, 1758 .flags = OMAP_FIREWALL_L4, 1759 }; 1760 1761 /* L4 CORE -> UART1 interface */ 1762 1763 static struct omap_hwmod_ocp_if omap3_l4_core__uart1 = { 1764 .master = &omap3xxx_l4_core_hwmod, 1765 .slave = &omap3xxx_uart1_hwmod, 1766 .clk = "uart1_ick", 1767 .user = OCP_USER_MPU | OCP_USER_SDMA, 1768 }; 1769 1770 /* L4 CORE -> UART2 interface */ 1771 1772 static struct omap_hwmod_ocp_if omap3_l4_core__uart2 = { 1773 .master = &omap3xxx_l4_core_hwmod, 1774 .slave = &omap3xxx_uart2_hwmod, 1775 .clk = "uart2_ick", 1776 .user = OCP_USER_MPU | OCP_USER_SDMA, 1777 }; 1778 1779 /* L4 PER -> UART3 interface */ 1780 1781 static struct omap_hwmod_ocp_if omap3_l4_per__uart3 = { 1782 .master = &omap3xxx_l4_per_hwmod, 1783 .slave = &omap3xxx_uart3_hwmod, 1784 .clk = "uart3_ick", 1785 .user = OCP_USER_MPU | OCP_USER_SDMA, 1786 }; 1787 1788 /* L4 PER -> UART4 interface */ 1789 1790 static struct omap_hwmod_ocp_if omap36xx_l4_per__uart4 = { 1791 .master = &omap3xxx_l4_per_hwmod, 1792 .slave = &omap36xx_uart4_hwmod, 1793 .clk = "uart4_ick", 1794 .user = OCP_USER_MPU | OCP_USER_SDMA, 1795 }; 1796 1797 /* AM35xx: L4 CORE -> UART4 interface */ 1798 1799 static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = { 1800 .master = &omap3xxx_l4_core_hwmod, 1801 .slave = &am35xx_uart4_hwmod, 1802 .clk = "uart4_ick", 1803 .user = OCP_USER_MPU | OCP_USER_SDMA, 1804 }; 1805 1806 /* L4 CORE -> I2C1 interface */ 1807 static struct omap_hwmod_ocp_if omap3_l4_core__i2c1 = { 1808 .master = &omap3xxx_l4_core_hwmod, 1809 .slave = &omap3xxx_i2c1_hwmod, 1810 .clk = "i2c1_ick", 1811 .fw = { 1812 .omap2 = { 1813 .l4_fw_region = OMAP3_L4_CORE_FW_I2C1_REGION, 1814 .l4_prot_group = 7, 1815 .flags = OMAP_FIREWALL_L4, 1816 }, 1817 }, 1818 .user = OCP_USER_MPU | OCP_USER_SDMA, 1819 }; 1820 1821 /* L4 CORE -> I2C2 interface */ 1822 static struct omap_hwmod_ocp_if omap3_l4_core__i2c2 = { 1823 .master = &omap3xxx_l4_core_hwmod, 1824 .slave = &omap3xxx_i2c2_hwmod, 1825 .clk = "i2c2_ick", 1826 .fw = { 1827 .omap2 = { 1828 .l4_fw_region = OMAP3_L4_CORE_FW_I2C2_REGION, 1829 .l4_prot_group = 7, 1830 .flags = OMAP_FIREWALL_L4, 1831 }, 1832 }, 1833 .user = OCP_USER_MPU | OCP_USER_SDMA, 1834 }; 1835 1836 /* L4 CORE -> I2C3 interface */ 1837 1838 static struct omap_hwmod_ocp_if omap3_l4_core__i2c3 = { 1839 .master = &omap3xxx_l4_core_hwmod, 1840 .slave = &omap3xxx_i2c3_hwmod, 1841 .clk = "i2c3_ick", 1842 .fw = { 1843 .omap2 = { 1844 .l4_fw_region = OMAP3_L4_CORE_FW_I2C3_REGION, 1845 .l4_prot_group = 7, 1846 .flags = OMAP_FIREWALL_L4, 1847 }, 1848 }, 1849 .user = OCP_USER_MPU | OCP_USER_SDMA, 1850 }; 1851 1852 /* L4 CORE -> SR1 interface */ 1853 static struct omap_hwmod_ocp_if omap34xx_l4_core__sr1 = { 1854 .master = &omap3xxx_l4_core_hwmod, 1855 .slave = &omap34xx_sr1_hwmod, 1856 .clk = "sr_l4_ick", 1857 .user = OCP_USER_MPU, 1858 }; 1859 1860 static struct omap_hwmod_ocp_if omap36xx_l4_core__sr1 = { 1861 .master = &omap3xxx_l4_core_hwmod, 1862 .slave = &omap36xx_sr1_hwmod, 1863 .clk = "sr_l4_ick", 1864 .user = OCP_USER_MPU, 1865 }; 1866 1867 /* L4 CORE -> SR2 interface */ 1868 1869 static struct omap_hwmod_ocp_if omap34xx_l4_core__sr2 = { 1870 .master = &omap3xxx_l4_core_hwmod, 1871 .slave = &omap34xx_sr2_hwmod, 1872 .clk = "sr_l4_ick", 1873 .user = OCP_USER_MPU, 1874 }; 1875 1876 static struct omap_hwmod_ocp_if omap36xx_l4_core__sr2 = { 1877 .master = &omap3xxx_l4_core_hwmod, 1878 .slave = &omap36xx_sr2_hwmod, 1879 .clk = "sr_l4_ick", 1880 .user = OCP_USER_MPU, 1881 }; 1882 1883 1884 /* l4_core -> usbhsotg */ 1885 static struct omap_hwmod_ocp_if omap3xxx_l4_core__usbhsotg = { 1886 .master = &omap3xxx_l4_core_hwmod, 1887 .slave = &omap3xxx_usbhsotg_hwmod, 1888 .clk = "l4_ick", 1889 .user = OCP_USER_MPU, 1890 }; 1891 1892 1893 /* l4_core -> usbhsotg */ 1894 static struct omap_hwmod_ocp_if am35xx_l4_core__usbhsotg = { 1895 .master = &omap3xxx_l4_core_hwmod, 1896 .slave = &am35xx_usbhsotg_hwmod, 1897 .clk = "hsotgusb_ick", 1898 .user = OCP_USER_MPU, 1899 }; 1900 1901 /* L4_WKUP -> L4_SEC interface */ 1902 static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__l4_sec = { 1903 .master = &omap3xxx_l4_wkup_hwmod, 1904 .slave = &omap3xxx_l4_sec_hwmod, 1905 .user = OCP_USER_MPU | OCP_USER_SDMA, 1906 }; 1907 1908 /* IVA2 <- L3 interface */ 1909 static struct omap_hwmod_ocp_if omap3xxx_l3__iva = { 1910 .master = &omap3xxx_l3_main_hwmod, 1911 .slave = &omap3xxx_iva_hwmod, 1912 .clk = "core_l3_ick", 1913 .user = OCP_USER_MPU | OCP_USER_SDMA, 1914 }; 1915 1916 1917 /* l4_wkup -> timer1 */ 1918 static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__timer1 = { 1919 .master = &omap3xxx_l4_wkup_hwmod, 1920 .slave = &omap3xxx_timer1_hwmod, 1921 .clk = "gpt1_ick", 1922 .user = OCP_USER_MPU | OCP_USER_SDMA, 1923 }; 1924 1925 1926 /* l4_per -> timer2 */ 1927 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer2 = { 1928 .master = &omap3xxx_l4_per_hwmod, 1929 .slave = &omap3xxx_timer2_hwmod, 1930 .clk = "gpt2_ick", 1931 .user = OCP_USER_MPU | OCP_USER_SDMA, 1932 }; 1933 1934 1935 /* l4_per -> timer3 */ 1936 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer3 = { 1937 .master = &omap3xxx_l4_per_hwmod, 1938 .slave = &omap3xxx_timer3_hwmod, 1939 .clk = "gpt3_ick", 1940 .user = OCP_USER_MPU | OCP_USER_SDMA, 1941 }; 1942 1943 1944 /* l4_per -> timer4 */ 1945 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer4 = { 1946 .master = &omap3xxx_l4_per_hwmod, 1947 .slave = &omap3xxx_timer4_hwmod, 1948 .clk = "gpt4_ick", 1949 .user = OCP_USER_MPU | OCP_USER_SDMA, 1950 }; 1951 1952 1953 /* l4_per -> timer5 */ 1954 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer5 = { 1955 .master = &omap3xxx_l4_per_hwmod, 1956 .slave = &omap3xxx_timer5_hwmod, 1957 .clk = "gpt5_ick", 1958 .user = OCP_USER_MPU | OCP_USER_SDMA, 1959 }; 1960 1961 1962 /* l4_per -> timer6 */ 1963 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer6 = { 1964 .master = &omap3xxx_l4_per_hwmod, 1965 .slave = &omap3xxx_timer6_hwmod, 1966 .clk = "gpt6_ick", 1967 .user = OCP_USER_MPU | OCP_USER_SDMA, 1968 }; 1969 1970 1971 /* l4_per -> timer7 */ 1972 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer7 = { 1973 .master = &omap3xxx_l4_per_hwmod, 1974 .slave = &omap3xxx_timer7_hwmod, 1975 .clk = "gpt7_ick", 1976 .user = OCP_USER_MPU | OCP_USER_SDMA, 1977 }; 1978 1979 1980 /* l4_per -> timer8 */ 1981 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer8 = { 1982 .master = &omap3xxx_l4_per_hwmod, 1983 .slave = &omap3xxx_timer8_hwmod, 1984 .clk = "gpt8_ick", 1985 .user = OCP_USER_MPU | OCP_USER_SDMA, 1986 }; 1987 1988 1989 /* l4_per -> timer9 */ 1990 static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer9 = { 1991 .master = &omap3xxx_l4_per_hwmod, 1992 .slave = &omap3xxx_timer9_hwmod, 1993 .clk = "gpt9_ick", 1994 .user = OCP_USER_MPU | OCP_USER_SDMA, 1995 }; 1996 1997 /* l4_core -> timer10 */ 1998 static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer10 = { 1999 .master = &omap3xxx_l4_core_hwmod, 2000 .slave = &omap3xxx_timer10_hwmod, 2001 .clk = "gpt10_ick", 2002 .user = OCP_USER_MPU | OCP_USER_SDMA, 2003 }; 2004 2005 /* l4_core -> timer11 */ 2006 static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer11 = { 2007 .master = &omap3xxx_l4_core_hwmod, 2008 .slave = &omap3xxx_timer11_hwmod, 2009 .clk = "gpt11_ick", 2010 .user = OCP_USER_MPU | OCP_USER_SDMA, 2011 }; 2012 2013 2014 /* l4_core -> timer12 */ 2015 static struct omap_hwmod_ocp_if omap3xxx_l4_sec__timer12 = { 2016 .master = &omap3xxx_l4_sec_hwmod, 2017 .slave = &omap3xxx_timer12_hwmod, 2018 .clk = "gpt12_ick", 2019 .user = OCP_USER_MPU | OCP_USER_SDMA, 2020 }; 2021 2022 /* l4_wkup -> wd_timer2 */ 2023 2024 static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = { 2025 .master = &omap3xxx_l4_wkup_hwmod, 2026 .slave = &omap3xxx_wd_timer2_hwmod, 2027 .clk = "wdt2_ick", 2028 .user = OCP_USER_MPU | OCP_USER_SDMA, 2029 }; 2030 2031 /* l4_core -> dss */ 2032 static struct omap_hwmod_ocp_if omap3430es1_l4_core__dss = { 2033 .master = &omap3xxx_l4_core_hwmod, 2034 .slave = &omap3430es1_dss_core_hwmod, 2035 .clk = "dss_ick", 2036 .fw = { 2037 .omap2 = { 2038 .l4_fw_region = OMAP3ES1_L4_CORE_FW_DSS_CORE_REGION, 2039 .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, 2040 .flags = OMAP_FIREWALL_L4, 2041 }, 2042 }, 2043 .user = OCP_USER_MPU | OCP_USER_SDMA, 2044 }; 2045 2046 static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss = { 2047 .master = &omap3xxx_l4_core_hwmod, 2048 .slave = &omap3xxx_dss_core_hwmod, 2049 .clk = "dss_ick", 2050 .fw = { 2051 .omap2 = { 2052 .l4_fw_region = OMAP3_L4_CORE_FW_DSS_CORE_REGION, 2053 .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, 2054 .flags = OMAP_FIREWALL_L4, 2055 }, 2056 }, 2057 .user = OCP_USER_MPU | OCP_USER_SDMA, 2058 }; 2059 2060 /* l4_core -> dss_dispc */ 2061 static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = { 2062 .master = &omap3xxx_l4_core_hwmod, 2063 .slave = &omap3xxx_dss_dispc_hwmod, 2064 .clk = "dss_ick", 2065 .fw = { 2066 .omap2 = { 2067 .l4_fw_region = OMAP3_L4_CORE_FW_DSS_DISPC_REGION, 2068 .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, 2069 .flags = OMAP_FIREWALL_L4, 2070 }, 2071 }, 2072 .user = OCP_USER_MPU | OCP_USER_SDMA, 2073 }; 2074 2075 /* l4_core -> dss_dsi1 */ 2076 static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dsi1 = { 2077 .master = &omap3xxx_l4_core_hwmod, 2078 .slave = &omap3xxx_dss_dsi1_hwmod, 2079 .clk = "dss_ick", 2080 .fw = { 2081 .omap2 = { 2082 .l4_fw_region = OMAP3_L4_CORE_FW_DSS_DSI_REGION, 2083 .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, 2084 .flags = OMAP_FIREWALL_L4, 2085 }, 2086 }, 2087 .user = OCP_USER_MPU | OCP_USER_SDMA, 2088 }; 2089 2090 /* l4_core -> dss_rfbi */ 2091 static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_rfbi = { 2092 .master = &omap3xxx_l4_core_hwmod, 2093 .slave = &omap3xxx_dss_rfbi_hwmod, 2094 .clk = "dss_ick", 2095 .fw = { 2096 .omap2 = { 2097 .l4_fw_region = OMAP3_L4_CORE_FW_DSS_RFBI_REGION, 2098 .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP , 2099 .flags = OMAP_FIREWALL_L4, 2100 }, 2101 }, 2102 .user = OCP_USER_MPU | OCP_USER_SDMA, 2103 }; 2104 2105 /* l4_core -> dss_venc */ 2106 static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = { 2107 .master = &omap3xxx_l4_core_hwmod, 2108 .slave = &omap3xxx_dss_venc_hwmod, 2109 .clk = "dss_ick", 2110 .fw = { 2111 .omap2 = { 2112 .l4_fw_region = OMAP3_L4_CORE_FW_DSS_VENC_REGION, 2113 .l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP, 2114 .flags = OMAP_FIREWALL_L4, 2115 }, 2116 }, 2117 .flags = OCPIF_SWSUP_IDLE, 2118 .user = OCP_USER_MPU | OCP_USER_SDMA, 2119 }; 2120 2121 /* l4_wkup -> gpio1 */ 2122 2123 static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__gpio1 = { 2124 .master = &omap3xxx_l4_wkup_hwmod, 2125 .slave = &omap3xxx_gpio1_hwmod, 2126 .user = OCP_USER_MPU | OCP_USER_SDMA, 2127 }; 2128 2129 /* l4_per -> gpio2 */ 2130 2131 static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio2 = { 2132 .master = &omap3xxx_l4_per_hwmod, 2133 .slave = &omap3xxx_gpio2_hwmod, 2134 .user = OCP_USER_MPU | OCP_USER_SDMA, 2135 }; 2136 2137 /* l4_per -> gpio3 */ 2138 2139 static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio3 = { 2140 .master = &omap3xxx_l4_per_hwmod, 2141 .slave = &omap3xxx_gpio3_hwmod, 2142 .user = OCP_USER_MPU | OCP_USER_SDMA, 2143 }; 2144 2145 /* 2146 * 'mmu' class 2147 * The memory management unit performs virtual to physical address translation 2148 * for its requestors. 2149 */ 2150 2151 static struct omap_hwmod_class_sysconfig mmu_sysc = { 2152 .rev_offs = 0x000, 2153 .sysc_offs = 0x010, 2154 .syss_offs = 0x014, 2155 .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE | 2156 SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), 2157 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 2158 .sysc_fields = &omap_hwmod_sysc_type1, 2159 }; 2160 2161 static struct omap_hwmod_class omap3xxx_mmu_hwmod_class = { 2162 .name = "mmu", 2163 .sysc = &mmu_sysc, 2164 }; 2165 2166 /* mmu isp */ 2167 static struct omap_hwmod omap3xxx_mmu_isp_hwmod; 2168 2169 /* l4_core -> mmu isp */ 2170 static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmu_isp = { 2171 .master = &omap3xxx_l4_core_hwmod, 2172 .slave = &omap3xxx_mmu_isp_hwmod, 2173 .user = OCP_USER_MPU | OCP_USER_SDMA, 2174 }; 2175 2176 static struct omap_hwmod omap3xxx_mmu_isp_hwmod = { 2177 .name = "mmu_isp", 2178 .class = &omap3xxx_mmu_hwmod_class, 2179 .main_clk = "cam_ick", 2180 .flags = HWMOD_NO_IDLEST, 2181 }; 2182 2183 /* mmu iva */ 2184 2185 static struct omap_hwmod omap3xxx_mmu_iva_hwmod; 2186 2187 static struct omap_hwmod_rst_info omap3xxx_mmu_iva_resets[] = { 2188 { .name = "mmu", .rst_shift = 1, .st_shift = 9 }, 2189 }; 2190 2191 /* l3_main -> iva mmu */ 2192 static struct omap_hwmod_ocp_if omap3xxx_l3_main__mmu_iva = { 2193 .master = &omap3xxx_l3_main_hwmod, 2194 .slave = &omap3xxx_mmu_iva_hwmod, 2195 .user = OCP_USER_MPU | OCP_USER_SDMA, 2196 }; 2197 2198 static struct omap_hwmod omap3xxx_mmu_iva_hwmod = { 2199 .name = "mmu_iva", 2200 .class = &omap3xxx_mmu_hwmod_class, 2201 .clkdm_name = "iva2_clkdm", 2202 .rst_lines = omap3xxx_mmu_iva_resets, 2203 .rst_lines_cnt = ARRAY_SIZE(omap3xxx_mmu_iva_resets), 2204 .main_clk = "iva2_ck", 2205 .prcm = { 2206 .omap2 = { 2207 .module_offs = OMAP3430_IVA2_MOD, 2208 .idlest_reg_id = 1, 2209 .idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT, 2210 }, 2211 }, 2212 .flags = HWMOD_NO_IDLEST, 2213 }; 2214 2215 /* l4_per -> gpio4 */ 2216 2217 static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio4 = { 2218 .master = &omap3xxx_l4_per_hwmod, 2219 .slave = &omap3xxx_gpio4_hwmod, 2220 .user = OCP_USER_MPU | OCP_USER_SDMA, 2221 }; 2222 2223 /* l4_per -> gpio5 */ 2224 2225 static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio5 = { 2226 .master = &omap3xxx_l4_per_hwmod, 2227 .slave = &omap3xxx_gpio5_hwmod, 2228 .user = OCP_USER_MPU | OCP_USER_SDMA, 2229 }; 2230 2231 /* l4_per -> gpio6 */ 2232 2233 static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = { 2234 .master = &omap3xxx_l4_per_hwmod, 2235 .slave = &omap3xxx_gpio6_hwmod, 2236 .user = OCP_USER_MPU | OCP_USER_SDMA, 2237 }; 2238 2239 /* dma_system -> L3 */ 2240 static struct omap_hwmod_ocp_if omap3xxx_dma_system__l3 = { 2241 .master = &omap3xxx_dma_system_hwmod, 2242 .slave = &omap3xxx_l3_main_hwmod, 2243 .clk = "core_l3_ick", 2244 .user = OCP_USER_MPU | OCP_USER_SDMA, 2245 }; 2246 2247 /* l4_cfg -> dma_system */ 2248 static struct omap_hwmod_ocp_if omap3xxx_l4_core__dma_system = { 2249 .master = &omap3xxx_l4_core_hwmod, 2250 .slave = &omap3xxx_dma_system_hwmod, 2251 .clk = "core_l4_ick", 2252 .user = OCP_USER_MPU | OCP_USER_SDMA, 2253 }; 2254 2255 2256 /* l4_core -> mcbsp1 */ 2257 static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp1 = { 2258 .master = &omap3xxx_l4_core_hwmod, 2259 .slave = &omap3xxx_mcbsp1_hwmod, 2260 .clk = "mcbsp1_ick", 2261 .user = OCP_USER_MPU | OCP_USER_SDMA, 2262 }; 2263 2264 2265 /* l4_per -> mcbsp2 */ 2266 static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2 = { 2267 .master = &omap3xxx_l4_per_hwmod, 2268 .slave = &omap3xxx_mcbsp2_hwmod, 2269 .clk = "mcbsp2_ick", 2270 .user = OCP_USER_MPU | OCP_USER_SDMA, 2271 }; 2272 2273 2274 /* l4_per -> mcbsp3 */ 2275 static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3 = { 2276 .master = &omap3xxx_l4_per_hwmod, 2277 .slave = &omap3xxx_mcbsp3_hwmod, 2278 .clk = "mcbsp3_ick", 2279 .user = OCP_USER_MPU | OCP_USER_SDMA, 2280 }; 2281 2282 2283 /* l4_per -> mcbsp4 */ 2284 static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp4 = { 2285 .master = &omap3xxx_l4_per_hwmod, 2286 .slave = &omap3xxx_mcbsp4_hwmod, 2287 .clk = "mcbsp4_ick", 2288 .user = OCP_USER_MPU | OCP_USER_SDMA, 2289 }; 2290 2291 2292 /* l4_core -> mcbsp5 */ 2293 static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp5 = { 2294 .master = &omap3xxx_l4_core_hwmod, 2295 .slave = &omap3xxx_mcbsp5_hwmod, 2296 .clk = "mcbsp5_ick", 2297 .user = OCP_USER_MPU | OCP_USER_SDMA, 2298 }; 2299 2300 2301 /* l4_per -> mcbsp2_sidetone */ 2302 static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2_sidetone = { 2303 .master = &omap3xxx_l4_per_hwmod, 2304 .slave = &omap3xxx_mcbsp2_sidetone_hwmod, 2305 .clk = "mcbsp2_ick", 2306 .user = OCP_USER_MPU, 2307 }; 2308 2309 2310 /* l4_per -> mcbsp3_sidetone */ 2311 static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3_sidetone = { 2312 .master = &omap3xxx_l4_per_hwmod, 2313 .slave = &omap3xxx_mcbsp3_sidetone_hwmod, 2314 .clk = "mcbsp3_ick", 2315 .user = OCP_USER_MPU, 2316 }; 2317 2318 /* l4_core -> mailbox */ 2319 static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = { 2320 .master = &omap3xxx_l4_core_hwmod, 2321 .slave = &omap3xxx_mailbox_hwmod, 2322 .user = OCP_USER_MPU | OCP_USER_SDMA, 2323 }; 2324 2325 /* l4 core -> mcspi1 interface */ 2326 static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi1 = { 2327 .master = &omap3xxx_l4_core_hwmod, 2328 .slave = &omap34xx_mcspi1, 2329 .clk = "mcspi1_ick", 2330 .user = OCP_USER_MPU | OCP_USER_SDMA, 2331 }; 2332 2333 /* l4 core -> mcspi2 interface */ 2334 static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi2 = { 2335 .master = &omap3xxx_l4_core_hwmod, 2336 .slave = &omap34xx_mcspi2, 2337 .clk = "mcspi2_ick", 2338 .user = OCP_USER_MPU | OCP_USER_SDMA, 2339 }; 2340 2341 /* l4 core -> mcspi3 interface */ 2342 static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi3 = { 2343 .master = &omap3xxx_l4_core_hwmod, 2344 .slave = &omap34xx_mcspi3, 2345 .clk = "mcspi3_ick", 2346 .user = OCP_USER_MPU | OCP_USER_SDMA, 2347 }; 2348 2349 /* l4 core -> mcspi4 interface */ 2350 2351 static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi4 = { 2352 .master = &omap3xxx_l4_core_hwmod, 2353 .slave = &omap34xx_mcspi4, 2354 .clk = "mcspi4_ick", 2355 .user = OCP_USER_MPU | OCP_USER_SDMA, 2356 }; 2357 2358 static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = { 2359 .master = &omap3xxx_usb_host_hs_hwmod, 2360 .slave = &omap3xxx_l3_main_hwmod, 2361 .clk = "core_l3_ick", 2362 .user = OCP_USER_MPU, 2363 }; 2364 2365 2366 static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_host_hs = { 2367 .master = &omap3xxx_l4_core_hwmod, 2368 .slave = &omap3xxx_usb_host_hs_hwmod, 2369 .clk = "usbhost_ick", 2370 .user = OCP_USER_MPU | OCP_USER_SDMA, 2371 }; 2372 2373 2374 static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = { 2375 .master = &omap3xxx_l4_core_hwmod, 2376 .slave = &omap3xxx_usb_tll_hs_hwmod, 2377 .clk = "usbtll_ick", 2378 .user = OCP_USER_MPU | OCP_USER_SDMA, 2379 }; 2380 2381 /* l4_core -> hdq1w interface */ 2382 static struct omap_hwmod_ocp_if omap3xxx_l4_core__hdq1w = { 2383 .master = &omap3xxx_l4_core_hwmod, 2384 .slave = &omap3xxx_hdq1w_hwmod, 2385 .clk = "hdq_ick", 2386 .user = OCP_USER_MPU | OCP_USER_SDMA, 2387 .flags = OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE, 2388 }; 2389 2390 /* l4_wkup -> 32ksync_counter */ 2391 2392 2393 static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__counter_32k = { 2394 .master = &omap3xxx_l4_wkup_hwmod, 2395 .slave = &omap3xxx_counter_32k_hwmod, 2396 .clk = "omap_32ksync_ick", 2397 .user = OCP_USER_MPU | OCP_USER_SDMA, 2398 }; 2399 2400 /* am35xx has Davinci MDIO & EMAC */ 2401 static struct omap_hwmod_class am35xx_mdio_class = { 2402 .name = "davinci_mdio", 2403 }; 2404 2405 static struct omap_hwmod am35xx_mdio_hwmod = { 2406 .name = "davinci_mdio", 2407 .class = &am35xx_mdio_class, 2408 .flags = HWMOD_NO_IDLEST, 2409 }; 2410 2411 /* 2412 * XXX Should be connected to an IPSS hwmod, not the L3 directly; 2413 * but this will probably require some additional hwmod core support, 2414 * so is left as a future to-do item. 2415 */ 2416 static struct omap_hwmod_ocp_if am35xx_mdio__l3 = { 2417 .master = &am35xx_mdio_hwmod, 2418 .slave = &omap3xxx_l3_main_hwmod, 2419 .clk = "emac_fck", 2420 .user = OCP_USER_MPU, 2421 }; 2422 2423 /* l4_core -> davinci mdio */ 2424 /* 2425 * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly; 2426 * but this will probably require some additional hwmod core support, 2427 * so is left as a future to-do item. 2428 */ 2429 static struct omap_hwmod_ocp_if am35xx_l4_core__mdio = { 2430 .master = &omap3xxx_l4_core_hwmod, 2431 .slave = &am35xx_mdio_hwmod, 2432 .clk = "emac_fck", 2433 .user = OCP_USER_MPU, 2434 }; 2435 2436 static struct omap_hwmod_class am35xx_emac_class = { 2437 .name = "davinci_emac", 2438 }; 2439 2440 static struct omap_hwmod am35xx_emac_hwmod = { 2441 .name = "davinci_emac", 2442 .class = &am35xx_emac_class, 2443 /* 2444 * According to Mark Greer, the MPU will not return from WFI 2445 * when the EMAC signals an interrupt. 2446 * http://www.spinics.net/lists/arm-kernel/msg174734.html 2447 */ 2448 .flags = (HWMOD_NO_IDLEST | HWMOD_BLOCK_WFI), 2449 }; 2450 2451 /* l3_core -> davinci emac interface */ 2452 /* 2453 * XXX Should be connected to an IPSS hwmod, not the L3 directly; 2454 * but this will probably require some additional hwmod core support, 2455 * so is left as a future to-do item. 2456 */ 2457 static struct omap_hwmod_ocp_if am35xx_emac__l3 = { 2458 .master = &am35xx_emac_hwmod, 2459 .slave = &omap3xxx_l3_main_hwmod, 2460 .clk = "emac_ick", 2461 .user = OCP_USER_MPU, 2462 }; 2463 2464 /* l4_core -> davinci emac */ 2465 /* 2466 * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly; 2467 * but this will probably require some additional hwmod core support, 2468 * so is left as a future to-do item. 2469 */ 2470 static struct omap_hwmod_ocp_if am35xx_l4_core__emac = { 2471 .master = &omap3xxx_l4_core_hwmod, 2472 .slave = &am35xx_emac_hwmod, 2473 .clk = "emac_ick", 2474 .user = OCP_USER_MPU, 2475 }; 2476 2477 static struct omap_hwmod_ocp_if omap3xxx_l3_main__gpmc = { 2478 .master = &omap3xxx_l3_main_hwmod, 2479 .slave = &omap3xxx_gpmc_hwmod, 2480 .clk = "core_l3_ick", 2481 .user = OCP_USER_MPU | OCP_USER_SDMA, 2482 }; 2483 2484 /* l4_core -> SHAM2 (SHA1/MD5) (similar to omap24xx) */ 2485 static struct omap_hwmod_class_sysconfig omap3_sham_sysc = { 2486 .rev_offs = 0x5c, 2487 .sysc_offs = 0x60, 2488 .syss_offs = 0x64, 2489 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | 2490 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), 2491 .sysc_fields = &omap3_sham_sysc_fields, 2492 }; 2493 2494 static struct omap_hwmod_class omap3xxx_sham_class = { 2495 .name = "sham", 2496 .sysc = &omap3_sham_sysc, 2497 }; 2498 2499 2500 2501 static struct omap_hwmod omap3xxx_sham_hwmod = { 2502 .name = "sham", 2503 .main_clk = "sha12_ick", 2504 .prcm = { 2505 .omap2 = { 2506 .module_offs = CORE_MOD, 2507 .idlest_reg_id = 1, 2508 .idlest_idle_bit = OMAP3430_ST_SHA12_SHIFT, 2509 }, 2510 }, 2511 .class = &omap3xxx_sham_class, 2512 }; 2513 2514 2515 static struct omap_hwmod_ocp_if omap3xxx_l4_core__sham = { 2516 .master = &omap3xxx_l4_core_hwmod, 2517 .slave = &omap3xxx_sham_hwmod, 2518 .clk = "sha12_ick", 2519 .user = OCP_USER_MPU | OCP_USER_SDMA, 2520 }; 2521 2522 /* l4_core -> AES */ 2523 static struct omap_hwmod_class_sysconfig omap3_aes_sysc = { 2524 .rev_offs = 0x44, 2525 .sysc_offs = 0x48, 2526 .syss_offs = 0x4c, 2527 .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | 2528 SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS), 2529 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 2530 .sysc_fields = &omap3xxx_aes_sysc_fields, 2531 }; 2532 2533 static struct omap_hwmod_class omap3xxx_aes_class = { 2534 .name = "aes", 2535 .sysc = &omap3_aes_sysc, 2536 }; 2537 2538 2539 static struct omap_hwmod omap3xxx_aes_hwmod = { 2540 .name = "aes", 2541 .main_clk = "aes2_ick", 2542 .prcm = { 2543 .omap2 = { 2544 .module_offs = CORE_MOD, 2545 .idlest_reg_id = 1, 2546 .idlest_idle_bit = OMAP3430_ST_AES2_SHIFT, 2547 }, 2548 }, 2549 .class = &omap3xxx_aes_class, 2550 }; 2551 2552 2553 static struct omap_hwmod_ocp_if omap3xxx_l4_core__aes = { 2554 .master = &omap3xxx_l4_core_hwmod, 2555 .slave = &omap3xxx_aes_hwmod, 2556 .clk = "aes2_ick", 2557 .user = OCP_USER_MPU | OCP_USER_SDMA, 2558 }; 2559 2560 /* 2561 * 'ssi' class 2562 * synchronous serial interface (multichannel and full-duplex serial if) 2563 */ 2564 2565 static struct omap_hwmod_class_sysconfig omap34xx_ssi_sysc = { 2566 .rev_offs = 0x0000, 2567 .sysc_offs = 0x0010, 2568 .syss_offs = 0x0014, 2569 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_MIDLEMODE | 2570 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET), 2571 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART), 2572 .sysc_fields = &omap_hwmod_sysc_type1, 2573 }; 2574 2575 static struct omap_hwmod_class omap3xxx_ssi_hwmod_class = { 2576 .name = "ssi", 2577 .sysc = &omap34xx_ssi_sysc, 2578 }; 2579 2580 static struct omap_hwmod omap3xxx_ssi_hwmod = { 2581 .name = "ssi", 2582 .class = &omap3xxx_ssi_hwmod_class, 2583 .clkdm_name = "core_l4_clkdm", 2584 .main_clk = "ssi_ssr_fck", 2585 .prcm = { 2586 .omap2 = { 2587 .module_offs = CORE_MOD, 2588 .idlest_reg_id = 1, 2589 .idlest_idle_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT, 2590 }, 2591 }, 2592 }; 2593 2594 /* L4 CORE -> SSI */ 2595 static struct omap_hwmod_ocp_if omap3xxx_l4_core__ssi = { 2596 .master = &omap3xxx_l4_core_hwmod, 2597 .slave = &omap3xxx_ssi_hwmod, 2598 .clk = "ssi_ick", 2599 .user = OCP_USER_MPU | OCP_USER_SDMA, 2600 }; 2601 2602 static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = { 2603 &omap3xxx_l3_main__l4_core, 2604 &omap3xxx_l3_main__l4_per, 2605 &omap3xxx_mpu__l3_main, 2606 &omap3xxx_l3_main__l4_debugss, 2607 &omap3xxx_l4_core__l4_wkup, 2608 &omap3xxx_l4_core__mmc3, 2609 &omap3_l4_core__uart1, 2610 &omap3_l4_core__uart2, 2611 &omap3_l4_per__uart3, 2612 &omap3_l4_core__i2c1, 2613 &omap3_l4_core__i2c2, 2614 &omap3_l4_core__i2c3, 2615 &omap3xxx_l4_wkup__l4_sec, 2616 &omap3xxx_l4_wkup__timer1, 2617 &omap3xxx_l4_per__timer2, 2618 &omap3xxx_l4_per__timer3, 2619 &omap3xxx_l4_per__timer4, 2620 &omap3xxx_l4_per__timer5, 2621 &omap3xxx_l4_per__timer6, 2622 &omap3xxx_l4_per__timer7, 2623 &omap3xxx_l4_per__timer8, 2624 &omap3xxx_l4_per__timer9, 2625 &omap3xxx_l4_core__timer10, 2626 &omap3xxx_l4_core__timer11, 2627 &omap3xxx_l4_wkup__wd_timer2, 2628 &omap3xxx_l4_wkup__gpio1, 2629 &omap3xxx_l4_per__gpio2, 2630 &omap3xxx_l4_per__gpio3, 2631 &omap3xxx_l4_per__gpio4, 2632 &omap3xxx_l4_per__gpio5, 2633 &omap3xxx_l4_per__gpio6, 2634 &omap3xxx_dma_system__l3, 2635 &omap3xxx_l4_core__dma_system, 2636 &omap3xxx_l4_core__mcbsp1, 2637 &omap3xxx_l4_per__mcbsp2, 2638 &omap3xxx_l4_per__mcbsp3, 2639 &omap3xxx_l4_per__mcbsp4, 2640 &omap3xxx_l4_core__mcbsp5, 2641 &omap3xxx_l4_per__mcbsp2_sidetone, 2642 &omap3xxx_l4_per__mcbsp3_sidetone, 2643 &omap34xx_l4_core__mcspi1, 2644 &omap34xx_l4_core__mcspi2, 2645 &omap34xx_l4_core__mcspi3, 2646 &omap34xx_l4_core__mcspi4, 2647 &omap3xxx_l4_wkup__counter_32k, 2648 &omap3xxx_l3_main__gpmc, 2649 NULL, 2650 }; 2651 2652 /* GP-only hwmod links */ 2653 static struct omap_hwmod_ocp_if *omap34xx_gp_hwmod_ocp_ifs[] __initdata = { 2654 &omap3xxx_l4_sec__timer12, 2655 NULL, 2656 }; 2657 2658 static struct omap_hwmod_ocp_if *omap36xx_gp_hwmod_ocp_ifs[] __initdata = { 2659 &omap3xxx_l4_sec__timer12, 2660 NULL, 2661 }; 2662 2663 static struct omap_hwmod_ocp_if *am35xx_gp_hwmod_ocp_ifs[] __initdata = { 2664 &omap3xxx_l4_sec__timer12, 2665 NULL, 2666 }; 2667 2668 /* crypto hwmod links */ 2669 static struct omap_hwmod_ocp_if *omap34xx_sham_hwmod_ocp_ifs[] __initdata = { 2670 &omap3xxx_l4_core__sham, 2671 NULL, 2672 }; 2673 2674 static struct omap_hwmod_ocp_if *omap34xx_aes_hwmod_ocp_ifs[] __initdata = { 2675 &omap3xxx_l4_core__aes, 2676 NULL, 2677 }; 2678 2679 static struct omap_hwmod_ocp_if *omap36xx_sham_hwmod_ocp_ifs[] __initdata = { 2680 &omap3xxx_l4_core__sham, 2681 NULL 2682 }; 2683 2684 static struct omap_hwmod_ocp_if *omap36xx_aes_hwmod_ocp_ifs[] __initdata = { 2685 &omap3xxx_l4_core__aes, 2686 NULL 2687 }; 2688 2689 /* 2690 * Apparently the SHA/MD5 and AES accelerator IP blocks are 2691 * only present on some AM35xx chips, and no one knows which 2692 * ones. See 2693 * http://www.spinics.net/lists/arm-kernel/msg215466.html So 2694 * if you need these IP blocks on an AM35xx, try uncommenting 2695 * the following lines. 2696 */ 2697 static struct omap_hwmod_ocp_if *am35xx_sham_hwmod_ocp_ifs[] __initdata = { 2698 /* &omap3xxx_l4_core__sham, */ 2699 NULL 2700 }; 2701 2702 static struct omap_hwmod_ocp_if *am35xx_aes_hwmod_ocp_ifs[] __initdata = { 2703 /* &omap3xxx_l4_core__aes, */ 2704 NULL, 2705 }; 2706 2707 /* 3430ES1-only hwmod links */ 2708 static struct omap_hwmod_ocp_if *omap3430es1_hwmod_ocp_ifs[] __initdata = { 2709 &omap3430es1_dss__l3, 2710 &omap3430es1_l4_core__dss, 2711 NULL, 2712 }; 2713 2714 /* 3430ES2+-only hwmod links */ 2715 static struct omap_hwmod_ocp_if *omap3430es2plus_hwmod_ocp_ifs[] __initdata = { 2716 &omap3xxx_dss__l3, 2717 &omap3xxx_l4_core__dss, 2718 &omap3xxx_usbhsotg__l3, 2719 &omap3xxx_l4_core__usbhsotg, 2720 &omap3xxx_usb_host_hs__l3_main_2, 2721 &omap3xxx_l4_core__usb_host_hs, 2722 &omap3xxx_l4_core__usb_tll_hs, 2723 NULL, 2724 }; 2725 2726 /* <= 3430ES3-only hwmod links */ 2727 static struct omap_hwmod_ocp_if *omap3430_pre_es3_hwmod_ocp_ifs[] __initdata = { 2728 &omap3xxx_l4_core__pre_es3_mmc1, 2729 &omap3xxx_l4_core__pre_es3_mmc2, 2730 NULL, 2731 }; 2732 2733 /* 3430ES3+-only hwmod links */ 2734 static struct omap_hwmod_ocp_if *omap3430_es3plus_hwmod_ocp_ifs[] __initdata = { 2735 &omap3xxx_l4_core__es3plus_mmc1, 2736 &omap3xxx_l4_core__es3plus_mmc2, 2737 NULL, 2738 }; 2739 2740 /* 34xx-only hwmod links (all ES revisions) */ 2741 static struct omap_hwmod_ocp_if *omap34xx_hwmod_ocp_ifs[] __initdata = { 2742 &omap3xxx_l3__iva, 2743 &omap34xx_l4_core__sr1, 2744 &omap34xx_l4_core__sr2, 2745 &omap3xxx_l4_core__mailbox, 2746 &omap3xxx_l4_core__hdq1w, 2747 &omap3xxx_sad2d__l3, 2748 &omap3xxx_l4_core__mmu_isp, 2749 &omap3xxx_l3_main__mmu_iva, 2750 &omap3xxx_l4_core__ssi, 2751 NULL, 2752 }; 2753 2754 /* 36xx-only hwmod links (all ES revisions) */ 2755 static struct omap_hwmod_ocp_if *omap36xx_hwmod_ocp_ifs[] __initdata = { 2756 &omap3xxx_l3__iva, 2757 &omap36xx_l4_per__uart4, 2758 &omap3xxx_dss__l3, 2759 &omap3xxx_l4_core__dss, 2760 &omap36xx_l4_core__sr1, 2761 &omap36xx_l4_core__sr2, 2762 &omap3xxx_usbhsotg__l3, 2763 &omap3xxx_l4_core__usbhsotg, 2764 &omap3xxx_l4_core__mailbox, 2765 &omap3xxx_usb_host_hs__l3_main_2, 2766 &omap3xxx_l4_core__usb_host_hs, 2767 &omap3xxx_l4_core__usb_tll_hs, 2768 &omap3xxx_l4_core__es3plus_mmc1, 2769 &omap3xxx_l4_core__es3plus_mmc2, 2770 &omap3xxx_l4_core__hdq1w, 2771 &omap3xxx_sad2d__l3, 2772 &omap3xxx_l4_core__mmu_isp, 2773 &omap3xxx_l3_main__mmu_iva, 2774 &omap3xxx_l4_core__ssi, 2775 NULL, 2776 }; 2777 2778 static struct omap_hwmod_ocp_if *am35xx_hwmod_ocp_ifs[] __initdata = { 2779 &omap3xxx_dss__l3, 2780 &omap3xxx_l4_core__dss, 2781 &am35xx_usbhsotg__l3, 2782 &am35xx_l4_core__usbhsotg, 2783 &am35xx_l4_core__uart4, 2784 &omap3xxx_usb_host_hs__l3_main_2, 2785 &omap3xxx_l4_core__usb_host_hs, 2786 &omap3xxx_l4_core__usb_tll_hs, 2787 &omap3xxx_l4_core__es3plus_mmc1, 2788 &omap3xxx_l4_core__es3plus_mmc2, 2789 &omap3xxx_l4_core__hdq1w, 2790 &am35xx_mdio__l3, 2791 &am35xx_l4_core__mdio, 2792 &am35xx_emac__l3, 2793 &am35xx_l4_core__emac, 2794 NULL, 2795 }; 2796 2797 static struct omap_hwmod_ocp_if *omap3xxx_dss_hwmod_ocp_ifs[] __initdata = { 2798 &omap3xxx_l4_core__dss_dispc, 2799 &omap3xxx_l4_core__dss_dsi1, 2800 &omap3xxx_l4_core__dss_rfbi, 2801 &omap3xxx_l4_core__dss_venc, 2802 NULL, 2803 }; 2804 2805 /** 2806 * omap3xxx_hwmod_is_hs_ip_block_usable - is a security IP block accessible? 2807 * @bus: struct device_node * for the top-level OMAP DT data 2808 * @dev_name: device name used in the DT file 2809 * 2810 * Determine whether a "secure" IP block @dev_name is usable by Linux. 2811 * There doesn't appear to be a 100% reliable way to determine this, 2812 * so we rely on heuristics. If @bus is null, meaning there's no DT 2813 * data, then we only assume the IP block is accessible if the OMAP is 2814 * fused as a 'general-purpose' SoC. If however DT data is present, 2815 * test to see if the IP block is described in the DT data and set to 2816 * 'status = "okay"'. If so then we assume the ODM has configured the 2817 * OMAP firewalls to allow access to the IP block. 2818 * 2819 * Return: 0 if device named @dev_name is not likely to be accessible, 2820 * or 1 if it is likely to be accessible. 2821 */ 2822 static bool __init omap3xxx_hwmod_is_hs_ip_block_usable(struct device_node *bus, 2823 const char *dev_name) 2824 { 2825 struct device_node *node; 2826 bool available; 2827 2828 if (!bus) 2829 return omap_type() == OMAP2_DEVICE_TYPE_GP; 2830 2831 node = of_get_child_by_name(bus, dev_name); 2832 available = of_device_is_available(node); 2833 of_node_put(node); 2834 2835 return available; 2836 } 2837 2838 int __init omap3xxx_hwmod_init(void) 2839 { 2840 int r; 2841 struct omap_hwmod_ocp_if **h = NULL, **h_gp = NULL, **h_sham = NULL; 2842 struct omap_hwmod_ocp_if **h_aes = NULL; 2843 struct device_node *bus; 2844 unsigned int rev; 2845 2846 omap_hwmod_init(); 2847 2848 /* Register hwmod links common to all OMAP3 */ 2849 r = omap_hwmod_register_links(omap3xxx_hwmod_ocp_ifs); 2850 if (r < 0) 2851 return r; 2852 2853 rev = omap_rev(); 2854 2855 /* 2856 * Register hwmod links common to individual OMAP3 families, all 2857 * silicon revisions (e.g., 34xx, or AM3505/3517, or 36xx) 2858 * All possible revisions should be included in this conditional. 2859 */ 2860 if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 || 2861 rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 || 2862 rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) { 2863 h = omap34xx_hwmod_ocp_ifs; 2864 h_gp = omap34xx_gp_hwmod_ocp_ifs; 2865 h_sham = omap34xx_sham_hwmod_ocp_ifs; 2866 h_aes = omap34xx_aes_hwmod_ocp_ifs; 2867 } else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { 2868 h = am35xx_hwmod_ocp_ifs; 2869 h_gp = am35xx_gp_hwmod_ocp_ifs; 2870 h_sham = am35xx_sham_hwmod_ocp_ifs; 2871 h_aes = am35xx_aes_hwmod_ocp_ifs; 2872 } else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 || 2873 rev == OMAP3630_REV_ES1_2) { 2874 h = omap36xx_hwmod_ocp_ifs; 2875 h_gp = omap36xx_gp_hwmod_ocp_ifs; 2876 h_sham = omap36xx_sham_hwmod_ocp_ifs; 2877 h_aes = omap36xx_aes_hwmod_ocp_ifs; 2878 } else { 2879 WARN(1, "OMAP3 hwmod family init: unknown chip type\n"); 2880 return -EINVAL; 2881 } 2882 2883 r = omap_hwmod_register_links(h); 2884 if (r < 0) 2885 return r; 2886 2887 /* Register GP-only hwmod links. */ 2888 if (h_gp && omap_type() == OMAP2_DEVICE_TYPE_GP) { 2889 r = omap_hwmod_register_links(h_gp); 2890 if (r < 0) 2891 return r; 2892 } 2893 2894 /* 2895 * Register crypto hwmod links only if they are not disabled in DT. 2896 * If DT information is missing, enable them only for GP devices. 2897 */ 2898 2899 bus = of_find_node_by_name(NULL, "ocp"); 2900 2901 if (h_sham && omap3xxx_hwmod_is_hs_ip_block_usable(bus, "sham")) { 2902 r = omap_hwmod_register_links(h_sham); 2903 if (r < 0) 2904 goto put_node; 2905 } 2906 2907 if (h_aes && omap3xxx_hwmod_is_hs_ip_block_usable(bus, "aes")) { 2908 r = omap_hwmod_register_links(h_aes); 2909 if (r < 0) 2910 goto put_node; 2911 } 2912 of_node_put(bus); 2913 2914 /* 2915 * Register hwmod links specific to certain ES levels of a 2916 * particular family of silicon (e.g., 34xx ES1.0) 2917 */ 2918 h = NULL; 2919 if (rev == OMAP3430_REV_ES1_0) { 2920 h = omap3430es1_hwmod_ocp_ifs; 2921 } else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 || 2922 rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 || 2923 rev == OMAP3430_REV_ES3_1_2) { 2924 h = omap3430es2plus_hwmod_ocp_ifs; 2925 } 2926 2927 if (h) { 2928 r = omap_hwmod_register_links(h); 2929 if (r < 0) 2930 return r; 2931 } 2932 2933 h = NULL; 2934 if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 || 2935 rev == OMAP3430_REV_ES2_1) { 2936 h = omap3430_pre_es3_hwmod_ocp_ifs; 2937 } else if (rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 || 2938 rev == OMAP3430_REV_ES3_1_2) { 2939 h = omap3430_es3plus_hwmod_ocp_ifs; 2940 } 2941 2942 if (h) 2943 r = omap_hwmod_register_links(h); 2944 if (r < 0) 2945 return r; 2946 2947 /* 2948 * DSS code presumes that dss_core hwmod is handled first, 2949 * _before_ any other DSS related hwmods so register common 2950 * DSS hwmod links last to ensure that dss_core is already 2951 * registered. Otherwise some change things may happen, for 2952 * ex. if dispc is handled before dss_core and DSS is enabled 2953 * in bootloader DISPC will be reset with outputs enabled 2954 * which sometimes leads to unrecoverable L3 error. XXX The 2955 * long-term fix to this is to ensure hwmods are set up in 2956 * dependency order in the hwmod core code. 2957 */ 2958 r = omap_hwmod_register_links(omap3xxx_dss_hwmod_ocp_ifs); 2959 2960 return r; 2961 2962 put_node: 2963 of_node_put(bus); 2964 return r; 2965 } 2966