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