linux/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
<<
>>
Prefs
   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
  53static 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 */
  60static 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 */
  67static 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 */
  74static 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 */
  81static 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
  89static struct omap_hwmod omap3xxx_mpu_hwmod = {
  90        .name           = "mpu",
  91        .class          = &mpu_hwmod_class,
  92        .main_clk       = "arm_fck",
  93};
  94
  95/* IVA2 (IVA2) */
  96static 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
 102static 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
 123static struct omap_hwmod_class omap3xxx_debugss_hwmod_class = {
 124        .name   = "debugss",
 125};
 126
 127/* debugss */
 128static 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 */
 137static 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
 149static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
 150        .name = "timer",
 151        .sysc = &omap3xxx_timer_sysc,
 152};
 153
 154/* timer1 */
 155static 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 */
 170static 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 */
 185static 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 */
 200static 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 */
 215static 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 */
 230static 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 */
 245static 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 */
 260static 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 */
 275static 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 */
 290static 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 */
 305static 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 */
 320static 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
 340static 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 */
 353static 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
 364static 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
 371static 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 */
 390static 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 */
 405static 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 */
 420static 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
 438static 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 */
 464static struct omap_hwmod_opt_clk am35xx_uart4_opt_clks[] = {
 465        { .role = "softreset_uart1_fck", .clk = "uart1_fck" },
 466};
 467
 468static 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
 484static 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 */
 492static 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
 503static 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
 518static 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
 539static 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
 551static struct omap_hwmod_class omap3_dispc_hwmod_class = {
 552        .name   = "dispc",
 553        .sysc   = &omap3_dispc_sysc,
 554};
 555
 556static 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
 574static 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
 585static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = {
 586        .name = "dsi",
 587        .sysc   = &omap3xxx_dsi_sysc,
 588};
 589
 590/* dss_dsi1 */
 591static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = {
 592        { .role = "sys_clk", .clk = "dss2_alwon_fck" },
 593};
 594
 595static 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
 609static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
 610        { .role = "ick", .clk = "dss_ick" },
 611};
 612
 613static 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
 627static 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
 632static 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 */
 647static 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 */
 662static 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 */
 677static 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
 696static 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
 707static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = {
 708        .name = "gpio",
 709        .sysc = &omap3xxx_gpio_sysc,
 710        .rev = 1,
 711};
 712
 713/* gpio1 */
 714static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
 715        { .role = "dbclk", .clk = "gpio1_dbck", },
 716};
 717
 718static 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 */
 735static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
 736        { .role = "dbclk", .clk = "gpio2_dbck", },
 737};
 738
 739static 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 */
 756static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
 757        { .role = "dbclk", .clk = "gpio3_dbck", },
 758};
 759
 760static 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 */
 777static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
 778        { .role = "dbclk", .clk = "gpio4_dbck", },
 779};
 780
 781static 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
 799static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
 800        { .role = "dbclk", .clk = "gpio5_dbck", },
 801};
 802
 803static 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
 821static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
 822        { .role = "dbclk", .clk = "gpio6_dbck", },
 823};
 824
 825static 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 */
 842static 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
 848static 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
 861static struct omap_hwmod_class omap3xxx_dma_hwmod_class = {
 862        .name = "dma",
 863        .sysc = &omap3xxx_dma_sysc,
 864};
 865
 866/* dma_system */
 867static 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
 887static 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
 896static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {
 897        .name = "mcbsp",
 898        .sysc = &omap3xxx_mcbsp_sysc,
 899};
 900
 901/* McBSP functional clock mapping */
 902static 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
 907static 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 */
 913static 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 */
 929static 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 */
 945static 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 */
 961static 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 */
 977static 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 */
 993static 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
1000static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = {
1001        .name = "mcbsp_sidetone",
1002        .sysc = &omap3xxx_mcbsp_sidetone_sysc,
1003};
1004
1005/* mcbsp2_sidetone */
1006static 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 */
1014static 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 */
1022static 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
1029static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = {
1030        .name = "smartreflex",
1031        .sysc = &omap34xx_sr_sysc,
1032        .rev  = 1,
1033};
1034
1035static 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
1044static struct omap_hwmod_class omap36xx_smartreflex_hwmod_class = {
1045        .name = "smartreflex",
1046        .sysc = &omap36xx_sr_sysc,
1047        .rev  = 2,
1048};
1049
1050/* SR1 */
1051static struct omap_smartreflex_dev_attr sr1_dev_attr = {
1052        .sensor_voltdm_name   = "mpu_iva",
1053};
1054
1055
1056static 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
1071static 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 */
1086static struct omap_smartreflex_dev_attr sr2_dev_attr = {
1087        .sensor_voltdm_name     = "core",
1088};
1089
1090
1091static 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
1106static 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
1126static 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
1136static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
1137        .name = "mailbox",
1138        .sysc = &omap3xxx_mailbox_sysc,
1139};
1140
1141static 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
1160static 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
1171static struct omap_hwmod_class omap34xx_mcspi_class = {
1172        .name = "mcspi",
1173        .sysc = &omap34xx_mcspi_sysc,
1174};
1175
1176/* mcspi1 */
1177static 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 */
1191static 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 */
1205static 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 */
1219static 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 */
1233static 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
1245static struct omap_hwmod_class usbotg_class = {
1246        .name = "usbotg",
1247        .sysc = &omap3xxx_usbhsotg_sysc,
1248};
1249
1250/* usb_otg_hs */
1251
1252static 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
1280static struct omap_hwmod_class am35xx_usbotg_class = {
1281        .name = "am35xx_usbotg",
1282};
1283
1284static 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 */
1292static 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
1303static struct omap_hwmod_class omap34xx_mmc_class = {
1304        .name = "mmc",
1305        .sysc = &omap34xx_mmc_sysc,
1306};
1307
1308/* MMC/SD/SDIO1 */
1309
1310
1311
1312static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = {
1313        { .role = "dbck", .clk = "omap_32k_fck", },
1314};
1315
1316static 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 */
1321static 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
1326static 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
1342static 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
1362static 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 */
1367static struct omap_hsmmc_dev_attr mmc2_pre_es3_dev_attr = {
1368        .flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ,
1369};
1370
1371static 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
1387static 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
1406static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = {
1407        { .role = "dbck", .clk = "omap_32k_fck", },
1408};
1409
1410static 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
1430static 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
1443static 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
1449static 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 */
1507static 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
1518static 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
1524static 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
1538static 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 */
1552static 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
1557static struct omap_hwmod_class omap3xxx_sad2d_class = {
1558        .name                   = "sad2d",
1559};
1560
1561static 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 */
1580static 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
1588static struct omap_hwmod_class omap3xxx_counter_hwmod_class = {
1589        .name   = "counter",
1590        .sysc   = &omap3xxx_counter_sysc,
1591};
1592
1593static 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
1613static 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
1623static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = {
1624        .name   = "gpmc",
1625        .sysc   = &omap3xxx_gpmc_sysc,
1626};
1627
1628static 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 */
1642static 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 */
1649static 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 */
1657static 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 */
1665static 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 */
1672static 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
1678static 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 */
1691static 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 */
1699static 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 */
1707static 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 */
1715static 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 */
1722static 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
1730static 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 */
1739static 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
1747static 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
1757static 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
1767static 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
1776static 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
1785static 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
1794static 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
1803static 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 */
1811static 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 */
1826static 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
1842static 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 */
1857static 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
1864static 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
1873static 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
1880static 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  */
1889static 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  */
1898static 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 */
1906static 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 */
1913static 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 */
1922static 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 */
1931static 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 */
1940static 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 */
1949static 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 */
1958static 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 */
1967static 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 */
1976static 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 */
1985static 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 */
1994static 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 */
2002static 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 */
2010static 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 */
2019static 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
2028static 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 */
2036static 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
2050static 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 */
2065static 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 */
2080static 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 */
2095static 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 */
2110static 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
2127static 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
2135static 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
2143static 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
2155static 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
2165static struct omap_hwmod_class omap3xxx_mmu_hwmod_class = {
2166        .name = "mmu",
2167        .sysc = &mmu_sysc,
2168};
2169
2170/* mmu isp */
2171static struct omap_hwmod omap3xxx_mmu_isp_hwmod;
2172
2173/* l4_core -> mmu isp */
2174static 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
2180static 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
2189static struct omap_hwmod omap3xxx_mmu_iva_hwmod;
2190
2191static 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 */
2196static 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
2202static 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
2221static 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
2229static 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
2237static 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 */
2244static 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 */
2252static 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 */
2261static 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 */
2270static 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 */
2279static 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 */
2288static 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 */
2297static 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 */
2306static 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 */
2315static 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 */
2323static 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 */
2330static 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 */
2338static 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 */
2346static 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
2355static 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
2362static 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
2370static 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
2378static 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 */
2386static 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
2397static 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 */
2405static struct omap_hwmod_class am35xx_mdio_class = {
2406        .name = "davinci_mdio",
2407};
2408
2409static 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 */
2420static 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 */
2433static 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
2440static struct omap_hwmod_class am35xx_emac_class = {
2441        .name = "davinci_emac",
2442};
2443
2444static 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 */
2461static 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 */
2474static 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
2481static 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) */
2489static 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
2498static struct omap_hwmod_class omap3xxx_sham_class = {
2499        .name   = "sham",
2500        .sysc   = &omap3_sham_sysc,
2501};
2502
2503
2504
2505static 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
2519static 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 */
2527static 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
2537static struct omap_hwmod_class omap3xxx_aes_class = {
2538        .name   = "aes",
2539        .sysc   = &omap3_aes_sysc,
2540};
2541
2542
2543static 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
2557static 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
2569static 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
2579static struct omap_hwmod_class omap3xxx_ssi_hwmod_class = {
2580        .name   = "ssi",
2581        .sysc   = &omap34xx_ssi_sysc,
2582};
2583
2584static 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 */
2599static 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
2606static 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 */
2657static struct omap_hwmod_ocp_if *omap34xx_gp_hwmod_ocp_ifs[] __initdata = {
2658        &omap3xxx_l4_sec__timer12,
2659        NULL,
2660};
2661
2662static struct omap_hwmod_ocp_if *omap36xx_gp_hwmod_ocp_ifs[] __initdata = {
2663        &omap3xxx_l4_sec__timer12,
2664        NULL,
2665};
2666
2667static struct omap_hwmod_ocp_if *am35xx_gp_hwmod_ocp_ifs[] __initdata = {
2668        &omap3xxx_l4_sec__timer12,
2669        NULL,
2670};
2671
2672/* crypto hwmod links */
2673static struct omap_hwmod_ocp_if *omap34xx_sham_hwmod_ocp_ifs[] __initdata = {
2674        &omap3xxx_l4_core__sham,
2675        NULL,
2676};
2677
2678static struct omap_hwmod_ocp_if *omap34xx_aes_hwmod_ocp_ifs[] __initdata = {
2679        &omap3xxx_l4_core__aes,
2680        NULL,
2681};
2682
2683static struct omap_hwmod_ocp_if *omap36xx_sham_hwmod_ocp_ifs[] __initdata = {
2684        &omap3xxx_l4_core__sham,
2685        NULL
2686};
2687
2688static 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 */
2701static struct omap_hwmod_ocp_if *am35xx_sham_hwmod_ocp_ifs[] __initdata = {
2702        /* &omap3xxx_l4_core__sham, */
2703        NULL
2704};
2705
2706static 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 */
2712static 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 */
2719static 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 */
2731static 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 */
2738static 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) */
2745static 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) */
2759static 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
2782static 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
2801static 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 */
2826static 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
2842int __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
2966put_node:
2967        of_node_put(bus);
2968        return r;
2969}
2970