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