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