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