Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * omap_hwmod_3xxx_data.c - hardware modules present on the OMAP3xxx chips
   4 *
   5 * Copyright (C) 2009-2011 Nokia Corporation
   6 * Copyright (C) 2012 Texas Instruments, Inc.
   7 * Paul Walmsley
   8 *
   9 * The data in this file should be completely autogeneratable from
  10 * the TI hardware database or other technical documentation.
  11 *
  12 * XXX these should be marked initdata for multi-OMAP kernels
  13 */
  14
  15#include <linux/platform_data/i2c-omap.h>
  16#include <linux/power/smartreflex.h>
  17#include <linux/platform_data/hsmmc-omap.h>
  18
  19#include "l3_3xxx.h"
  20#include "l4_3xxx.h"
  21
  22#include "soc.h"
  23#include "omap_hwmod.h"
  24#include "omap_hwmod_common_data.h"
  25#include "prm-regbits-34xx.h"
  26#include "cm-regbits-34xx.h"
  27
  28#include "i2c.h"
  29#include "wd_timer.h"
 
  30
  31/*
  32 * OMAP3xxx hardware module integration data
  33 *
  34 * All of the data in this section should be autogeneratable from the
  35 * TI hardware database or other technical documentation.  Data that
  36 * is driver-specific or driver-kernel integration-specific belongs
  37 * elsewhere.
  38 */
  39
  40#define AM35XX_IPSS_USBOTGSS_BASE      0x5C040000
  41
  42/*
  43 * IP blocks
  44 */
  45
  46/* L3 */
  47
  48static struct omap_hwmod omap3xxx_l3_main_hwmod = {
  49	.name		= "l3_main",
  50	.class		= &l3_hwmod_class,
  51	.flags		= HWMOD_NO_IDLEST,
  52};
  53
  54/* L4 CORE */
  55static struct omap_hwmod omap3xxx_l4_core_hwmod = {
  56	.name		= "l4_core",
  57	.class		= &l4_hwmod_class,
  58	.flags		= HWMOD_NO_IDLEST,
  59};
  60
  61/* L4 PER */
  62static struct omap_hwmod omap3xxx_l4_per_hwmod = {
  63	.name		= "l4_per",
  64	.class		= &l4_hwmod_class,
  65	.flags		= HWMOD_NO_IDLEST,
  66};
  67
  68/* L4 WKUP */
  69static struct omap_hwmod omap3xxx_l4_wkup_hwmod = {
  70	.name		= "l4_wkup",
  71	.class		= &l4_hwmod_class,
  72	.flags		= HWMOD_NO_IDLEST,
  73};
  74
  75/* L4 SEC */
  76static struct omap_hwmod omap3xxx_l4_sec_hwmod = {
  77	.name		= "l4_sec",
  78	.class		= &l4_hwmod_class,
  79	.flags		= HWMOD_NO_IDLEST,
  80};
  81
  82/* MPU */
  83
  84static struct omap_hwmod omap3xxx_mpu_hwmod = {
  85	.name		= "mpu",
  86	.class		= &mpu_hwmod_class,
  87	.main_clk	= "arm_fck",
  88};
  89
  90/* IVA2 (IVA2) */
  91static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = {
  92	{ .name = "logic", .rst_shift = 0, .st_shift = 8 },
  93	{ .name = "seq0", .rst_shift = 1, .st_shift = 9 },
  94	{ .name = "seq1", .rst_shift = 2, .st_shift = 10 },
  95};
  96
  97static struct omap_hwmod omap3xxx_iva_hwmod = {
  98	.name		= "iva",
  99	.class		= &iva_hwmod_class,
 100	.clkdm_name	= "iva2_clkdm",
 101	.rst_lines	= omap3xxx_iva_resets,
 102	.rst_lines_cnt	= ARRAY_SIZE(omap3xxx_iva_resets),
 103	.main_clk	= "iva2_ck",
 104	.prcm = {
 105		.omap2 = {
 106			.module_offs = OMAP3430_IVA2_MOD,
 107			.idlest_reg_id = 1,
 108			.idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT,
 109		},
 110	},
 111};
 112
 113/*
 114 * 'debugss' class
 115 * debug and emulation sub system
 116 */
 117
 118static struct omap_hwmod_class omap3xxx_debugss_hwmod_class = {
 119	.name	= "debugss",
 120};
 121
 122/* debugss */
 123static struct omap_hwmod omap3xxx_debugss_hwmod = {
 124	.name		= "debugss",
 125	.class		= &omap3xxx_debugss_hwmod_class,
 126	.clkdm_name	= "emu_clkdm",
 127	.main_clk	= "emu_src_ck",
 128	.flags		= HWMOD_NO_IDLEST,
 129};
 130
 131/* timer class */
 132static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = {
 133	.rev_offs	= 0x0000,
 134	.sysc_offs	= 0x0010,
 135	.syss_offs	= 0x0014,
 136	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
 137			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
 138			   SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE |
 139			   SYSS_HAS_RESET_STATUS),
 140	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 141	.sysc_fields	= &omap_hwmod_sysc_type1,
 142};
 143
 144static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
 145	.name = "timer",
 146	.sysc = &omap3xxx_timer_sysc,
 147};
 148
 149/* timer3 */
 150static struct omap_hwmod omap3xxx_timer3_hwmod = {
 151	.name		= "timer3",
 152	.main_clk	= "gpt3_fck",
 153	.prcm		= {
 154		.omap2 = {
 155			.module_offs = OMAP3430_PER_MOD,
 156			.idlest_reg_id = 1,
 157			.idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT,
 158		},
 159	},
 160	.class		= &omap3xxx_timer_hwmod_class,
 161	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 162};
 163
 164/* timer4 */
 165static struct omap_hwmod omap3xxx_timer4_hwmod = {
 166	.name		= "timer4",
 167	.main_clk	= "gpt4_fck",
 168	.prcm		= {
 169		.omap2 = {
 170			.module_offs = OMAP3430_PER_MOD,
 171			.idlest_reg_id = 1,
 172			.idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,
 173		},
 174	},
 175	.class		= &omap3xxx_timer_hwmod_class,
 176	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 177};
 178
 179/* timer5 */
 180static struct omap_hwmod omap3xxx_timer5_hwmod = {
 181	.name		= "timer5",
 182	.main_clk	= "gpt5_fck",
 183	.prcm		= {
 184		.omap2 = {
 185			.module_offs = OMAP3430_PER_MOD,
 186			.idlest_reg_id = 1,
 187			.idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,
 188		},
 189	},
 190	.class		= &omap3xxx_timer_hwmod_class,
 191	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 192};
 193
 194/* timer6 */
 195static struct omap_hwmod omap3xxx_timer6_hwmod = {
 196	.name		= "timer6",
 197	.main_clk	= "gpt6_fck",
 198	.prcm		= {
 199		.omap2 = {
 200			.module_offs = OMAP3430_PER_MOD,
 201			.idlest_reg_id = 1,
 202			.idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,
 203		},
 204	},
 205	.class		= &omap3xxx_timer_hwmod_class,
 206	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 207};
 208
 209/* timer7 */
 210static struct omap_hwmod omap3xxx_timer7_hwmod = {
 211	.name		= "timer7",
 212	.main_clk	= "gpt7_fck",
 213	.prcm		= {
 214		.omap2 = {
 215			.module_offs = OMAP3430_PER_MOD,
 216			.idlest_reg_id = 1,
 217			.idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT,
 218		},
 219	},
 220	.class		= &omap3xxx_timer_hwmod_class,
 221	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 222};
 223
 224/* timer8 */
 225static struct omap_hwmod omap3xxx_timer8_hwmod = {
 226	.name		= "timer8",
 227	.main_clk	= "gpt8_fck",
 228	.prcm		= {
 229		.omap2 = {
 230			.module_offs = OMAP3430_PER_MOD,
 231			.idlest_reg_id = 1,
 232			.idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT,
 233		},
 234	},
 235	.class		= &omap3xxx_timer_hwmod_class,
 236	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 237};
 238
 239/* timer9 */
 240static struct omap_hwmod omap3xxx_timer9_hwmod = {
 241	.name		= "timer9",
 242	.main_clk	= "gpt9_fck",
 243	.prcm		= {
 244		.omap2 = {
 245			.module_offs = OMAP3430_PER_MOD,
 246			.idlest_reg_id = 1,
 247			.idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT,
 248		},
 249	},
 250	.class		= &omap3xxx_timer_hwmod_class,
 251	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 252};
 253
 254/* timer10 */
 255static struct omap_hwmod omap3xxx_timer10_hwmod = {
 256	.name		= "timer10",
 257	.main_clk	= "gpt10_fck",
 258	.prcm		= {
 259		.omap2 = {
 260			.module_offs = CORE_MOD,
 261			.idlest_reg_id = 1,
 262			.idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT,
 263		},
 264	},
 265	.class		= &omap3xxx_timer_hwmod_class,
 266	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 267};
 268
 269/* timer11 */
 270static struct omap_hwmod omap3xxx_timer11_hwmod = {
 271	.name		= "timer11",
 272	.main_clk	= "gpt11_fck",
 273	.prcm		= {
 274		.omap2 = {
 275			.module_offs = CORE_MOD,
 276			.idlest_reg_id = 1,
 277			.idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT,
 278		},
 279	},
 280	.class		= &omap3xxx_timer_hwmod_class,
 281	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 282};
 283
 284/*
 285 * 'wd_timer' class
 286 * 32-bit watchdog upward counter that generates a pulse on the reset pin on
 287 * overflow condition
 288 */
 289
 290static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = {
 291	.rev_offs	= 0x0000,
 292	.sysc_offs	= 0x0010,
 293	.syss_offs	= 0x0014,
 294	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE |
 295			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
 296			   SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
 297			   SYSS_HAS_RESET_STATUS),
 298	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 299	.sysc_fields    = &omap_hwmod_sysc_type1,
 300};
 301
 302/* I2C common */
 303static struct omap_hwmod_class_sysconfig i2c_sysc = {
 304	.rev_offs	= 0x00,
 305	.sysc_offs	= 0x20,
 306	.syss_offs	= 0x10,
 307	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
 308			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
 309			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
 310	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 311	.sysc_fields    = &omap_hwmod_sysc_type1,
 312};
 313
 314static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = {
 315	.name		= "wd_timer",
 316	.sysc		= &omap3xxx_wd_timer_sysc,
 317	.pre_shutdown	= &omap2_wd_timer_disable,
 318	.reset		= &omap2_wd_timer_reset,
 319};
 320
 321static struct omap_hwmod omap3xxx_wd_timer2_hwmod = {
 322	.name		= "wd_timer2",
 323	.class		= &omap3xxx_wd_timer_hwmod_class,
 324	.main_clk	= "wdt2_fck",
 325	.prcm		= {
 326		.omap2 = {
 327			.module_offs = WKUP_MOD,
 328			.idlest_reg_id = 1,
 329			.idlest_idle_bit = OMAP3430_ST_WDT2_SHIFT,
 330		},
 331	},
 332	/*
 333	 * XXX: Use software supervised mode, HW supervised smartidle seems to
 334	 * block CORE power domain idle transitions. Maybe a HW bug in wdt2?
 335	 */
 336	.flags		= HWMOD_SWSUP_SIDLE,
 337};
 338
 339/* UART1 */
 340static struct omap_hwmod omap3xxx_uart1_hwmod = {
 341	.name		= "uart1",
 342	.main_clk	= "uart1_fck",
 343	.flags		= DEBUG_TI81XXUART1_FLAGS | HWMOD_SWSUP_SIDLE,
 344	.prcm		= {
 345		.omap2 = {
 346			.module_offs = CORE_MOD,
 347			.idlest_reg_id = 1,
 348			.idlest_idle_bit = OMAP3430_EN_UART1_SHIFT,
 349		},
 350	},
 351	.class		= &omap2_uart_class,
 352};
 353
 354/* UART2 */
 355static struct omap_hwmod omap3xxx_uart2_hwmod = {
 356	.name		= "uart2",
 357	.main_clk	= "uart2_fck",
 358	.flags		= DEBUG_TI81XXUART2_FLAGS | HWMOD_SWSUP_SIDLE,
 359	.prcm		= {
 360		.omap2 = {
 361			.module_offs = CORE_MOD,
 362			.idlest_reg_id = 1,
 363			.idlest_idle_bit = OMAP3430_EN_UART2_SHIFT,
 364		},
 365	},
 366	.class		= &omap2_uart_class,
 367};
 368
 369/* UART3 */
 370static struct omap_hwmod omap3xxx_uart3_hwmod = {
 371	.name		= "uart3",
 372	.main_clk	= "uart3_fck",
 373	.flags		= DEBUG_OMAP3UART3_FLAGS | DEBUG_TI81XXUART3_FLAGS |
 374				HWMOD_SWSUP_SIDLE,
 375	.prcm		= {
 376		.omap2 = {
 377			.module_offs = OMAP3430_PER_MOD,
 378			.idlest_reg_id = 1,
 379			.idlest_idle_bit = OMAP3430_EN_UART3_SHIFT,
 380		},
 381	},
 382	.class		= &omap2_uart_class,
 383};
 384
 385/* UART4 */
 386
 387
 388static struct omap_hwmod omap36xx_uart4_hwmod = {
 389	.name		= "uart4",
 390	.main_clk	= "uart4_fck",
 391	.flags		= DEBUG_OMAP3UART4_FLAGS | HWMOD_SWSUP_SIDLE,
 392	.prcm		= {
 393		.omap2 = {
 394			.module_offs = OMAP3430_PER_MOD,
 395			.idlest_reg_id = 1,
 396			.idlest_idle_bit = OMAP3630_EN_UART4_SHIFT,
 397		},
 398	},
 399	.class		= &omap2_uart_class,
 400};
 401
 402
 403
 404/*
 405 * XXX AM35xx UART4 cannot complete its softreset without uart1_fck or
 406 * uart2_fck being enabled.  So we add uart1_fck as an optional clock,
 407 * below, and set the HWMOD_CONTROL_OPT_CLKS_IN_RESET.  This really
 408 * should not be needed.  The functional clock structure of the AM35xx
 409 * UART4 is extremely unclear and opaque; it is unclear what the role
 410 * of uart1/2_fck is for the UART4.  Any clarification from either
 411 * empirical testing or the AM3505/3517 hardware designers would be
 412 * most welcome.
 413 */
 414static struct omap_hwmod_opt_clk am35xx_uart4_opt_clks[] = {
 415	{ .role = "softreset_uart1_fck", .clk = "uart1_fck" },
 416};
 417
 418static struct omap_hwmod am35xx_uart4_hwmod = {
 419	.name		= "uart4",
 420	.main_clk	= "uart4_fck",
 421	.prcm		= {
 422		.omap2 = {
 423			.module_offs = CORE_MOD,
 424			.idlest_reg_id = 1,
 425			.idlest_idle_bit = AM35XX_ST_UART4_SHIFT,
 426		},
 427	},
 428	.opt_clks	= am35xx_uart4_opt_clks,
 429	.opt_clks_cnt	= ARRAY_SIZE(am35xx_uart4_opt_clks),
 430	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 431	.class		= &omap2_uart_class,
 432};
 433
 434static struct omap_hwmod_class i2c_class = {
 435	.name	= "i2c",
 436	.sysc	= &i2c_sysc,
 437	.reset	= &omap_i2c_reset,
 438};
 439
 440/* dss */
 441static struct omap_hwmod_opt_clk dss_opt_clks[] = {
 442	/*
 443	 * The DSS HW needs all DSS clocks enabled during reset. The dss_core
 444	 * driver does not use these clocks.
 445	 */
 446	{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
 447	{ .role = "tv_clk", .clk = "dss_tv_fck" },
 448	/* required only on OMAP3430 */
 449	{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
 450};
 451
 452static struct omap_hwmod omap3430es1_dss_core_hwmod = {
 453	.name		= "dss_core",
 454	.class		= &omap2_dss_hwmod_class,
 455	.main_clk	= "dss1_alwon_fck", /* instead of dss_fck */
 456	.prcm		= {
 457		.omap2 = {
 458			.module_offs = OMAP3430_DSS_MOD,
 459			.idlest_reg_id = 1,
 460		},
 461	},
 462	.opt_clks	= dss_opt_clks,
 463	.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
 464	.flags		= HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 465};
 466
 467static struct omap_hwmod omap3xxx_dss_core_hwmod = {
 468	.name		= "dss_core",
 469	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 470	.class		= &omap2_dss_hwmod_class,
 471	.main_clk	= "dss1_alwon_fck", /* instead of dss_fck */
 472	.prcm		= {
 473		.omap2 = {
 474			.module_offs = OMAP3430_DSS_MOD,
 475			.idlest_reg_id = 1,
 476			.idlest_idle_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT,
 477		},
 478	},
 479	.opt_clks	= dss_opt_clks,
 480	.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
 481};
 482
 483/*
 484 * 'dispc' class
 485 * display controller
 486 */
 487
 488static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = {
 489	.rev_offs	= 0x0000,
 490	.sysc_offs	= 0x0010,
 491	.syss_offs	= 0x0014,
 492	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
 493			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
 494			   SYSC_HAS_ENAWAKEUP),
 495	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
 496			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
 497	.sysc_fields	= &omap_hwmod_sysc_type1,
 498};
 499
 500static struct omap_hwmod_class omap3_dispc_hwmod_class = {
 501	.name	= "dispc",
 502	.sysc	= &omap3_dispc_sysc,
 503};
 504
 505static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {
 506	.name		= "dss_dispc",
 507	.class		= &omap3_dispc_hwmod_class,
 508	.main_clk	= "dss1_alwon_fck",
 509	.prcm		= {
 510		.omap2 = {
 511			.module_offs = OMAP3430_DSS_MOD,
 512		},
 513	},
 514	.flags		= HWMOD_NO_IDLEST,
 515	.dev_attr	= &omap2_3_dss_dispc_dev_attr,
 516};
 517
 518/*
 519 * 'dsi' class
 520 * display serial interface controller
 521 */
 522
 523static struct omap_hwmod_class_sysconfig omap3xxx_dsi_sysc = {
 524	.rev_offs	= 0x0000,
 525	.sysc_offs	= 0x0010,
 526	.syss_offs	= 0x0014,
 527	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
 528			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
 529			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
 530	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 531	.sysc_fields	= &omap_hwmod_sysc_type1,
 532};
 533
 534static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = {
 535	.name = "dsi",
 536	.sysc	= &omap3xxx_dsi_sysc,
 537};
 538
 539/* dss_dsi1 */
 540static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = {
 541	{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
 542};
 543
 544static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = {
 545	.name		= "dss_dsi1",
 546	.class		= &omap3xxx_dsi_hwmod_class,
 547	.main_clk	= "dss1_alwon_fck",
 548	.prcm		= {
 549		.omap2 = {
 550			.module_offs = OMAP3430_DSS_MOD,
 551		},
 552	},
 553	.opt_clks	= dss_dsi1_opt_clks,
 554	.opt_clks_cnt	= ARRAY_SIZE(dss_dsi1_opt_clks),
 555	.flags		= HWMOD_NO_IDLEST,
 556};
 557
 558static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
 559	{ .role = "ick", .clk = "dss_ick" },
 560};
 561
 562static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = {
 563	.name		= "dss_rfbi",
 564	.class		= &omap2_rfbi_hwmod_class,
 565	.main_clk	= "dss1_alwon_fck",
 566	.prcm		= {
 567		.omap2 = {
 568			.module_offs = OMAP3430_DSS_MOD,
 569		},
 570	},
 571	.opt_clks	= dss_rfbi_opt_clks,
 572	.opt_clks_cnt	= ARRAY_SIZE(dss_rfbi_opt_clks),
 573	.flags		= HWMOD_NO_IDLEST,
 574};
 575
 576static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = {
 577	/* required only on OMAP3430 */
 578	{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
 579};
 580
 581static struct omap_hwmod omap3xxx_dss_venc_hwmod = {
 582	.name		= "dss_venc",
 583	.class		= &omap2_venc_hwmod_class,
 584	.main_clk	= "dss_tv_fck",
 585	.prcm		= {
 586		.omap2 = {
 587			.module_offs = OMAP3430_DSS_MOD,
 588		},
 589	},
 590	.opt_clks	= dss_venc_opt_clks,
 591	.opt_clks_cnt	= ARRAY_SIZE(dss_venc_opt_clks),
 592	.flags		= HWMOD_NO_IDLEST,
 593};
 594
 595/* I2C1 */
 596static struct omap_hwmod omap3xxx_i2c1_hwmod = {
 597	.name		= "i2c1",
 598	.flags		= HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
 599	.main_clk	= "i2c1_fck",
 600	.prcm		= {
 601		.omap2 = {
 602			.module_offs = CORE_MOD,
 603			.idlest_reg_id = 1,
 604			.idlest_idle_bit = OMAP3430_ST_I2C1_SHIFT,
 605		},
 606	},
 607	.class		= &i2c_class,
 608};
 609
 610/* I2C2 */
 611static struct omap_hwmod omap3xxx_i2c2_hwmod = {
 612	.name		= "i2c2",
 613	.flags		= HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
 614	.main_clk	= "i2c2_fck",
 615	.prcm		= {
 616		.omap2 = {
 617			.module_offs = CORE_MOD,
 618			.idlest_reg_id = 1,
 619			.idlest_idle_bit = OMAP3430_ST_I2C2_SHIFT,
 620		},
 621	},
 622	.class		= &i2c_class,
 623};
 624
 625/* I2C3 */
 626static struct omap_hwmod omap3xxx_i2c3_hwmod = {
 627	.name		= "i2c3",
 628	.flags		= HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
 629	.main_clk	= "i2c3_fck",
 630	.prcm		= {
 631		.omap2 = {
 632			.module_offs = CORE_MOD,
 633			.idlest_reg_id = 1,
 634			.idlest_idle_bit = OMAP3430_ST_I2C3_SHIFT,
 635		},
 636	},
 637	.class		= &i2c_class,
 638};
 639
 640/*
 641 * 'gpio' class
 642 * general purpose io module
 643 */
 644
 645static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = {
 646	.rev_offs	= 0x0000,
 647	.sysc_offs	= 0x0010,
 648	.syss_offs	= 0x0014,
 649	.sysc_flags	= (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
 650			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
 651			   SYSS_HAS_RESET_STATUS),
 652	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 653	.sysc_fields    = &omap_hwmod_sysc_type1,
 654};
 655
 656static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = {
 657	.name = "gpio",
 658	.sysc = &omap3xxx_gpio_sysc,
 659};
 660
 661/* gpio1 */
 662static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
 663	{ .role = "dbclk", .clk = "gpio1_dbck", },
 664};
 665
 666static struct omap_hwmod omap3xxx_gpio1_hwmod = {
 667	.name		= "gpio1",
 668	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 669	.main_clk	= "gpio1_ick",
 670	.opt_clks	= gpio1_opt_clks,
 671	.opt_clks_cnt	= ARRAY_SIZE(gpio1_opt_clks),
 672	.prcm		= {
 673		.omap2 = {
 674			.module_offs = WKUP_MOD,
 675			.idlest_reg_id = 1,
 676			.idlest_idle_bit = OMAP3430_ST_GPIO1_SHIFT,
 677		},
 678	},
 679	.class		= &omap3xxx_gpio_hwmod_class,
 680};
 681
 682/* gpio2 */
 683static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
 684	{ .role = "dbclk", .clk = "gpio2_dbck", },
 685};
 686
 687static struct omap_hwmod omap3xxx_gpio2_hwmod = {
 688	.name		= "gpio2",
 689	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 690	.main_clk	= "gpio2_ick",
 691	.opt_clks	= gpio2_opt_clks,
 692	.opt_clks_cnt	= ARRAY_SIZE(gpio2_opt_clks),
 693	.prcm		= {
 694		.omap2 = {
 695			.module_offs = OMAP3430_PER_MOD,
 696			.idlest_reg_id = 1,
 697			.idlest_idle_bit = OMAP3430_ST_GPIO2_SHIFT,
 698		},
 699	},
 700	.class		= &omap3xxx_gpio_hwmod_class,
 701};
 702
 703/* gpio3 */
 704static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
 705	{ .role = "dbclk", .clk = "gpio3_dbck", },
 706};
 707
 708static struct omap_hwmod omap3xxx_gpio3_hwmod = {
 709	.name		= "gpio3",
 710	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 711	.main_clk	= "gpio3_ick",
 712	.opt_clks	= gpio3_opt_clks,
 713	.opt_clks_cnt	= ARRAY_SIZE(gpio3_opt_clks),
 714	.prcm		= {
 715		.omap2 = {
 716			.module_offs = OMAP3430_PER_MOD,
 717			.idlest_reg_id = 1,
 718			.idlest_idle_bit = OMAP3430_ST_GPIO3_SHIFT,
 719		},
 720	},
 721	.class		= &omap3xxx_gpio_hwmod_class,
 722};
 723
 724/* gpio4 */
 725static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
 726	{ .role = "dbclk", .clk = "gpio4_dbck", },
 727};
 728
 729static struct omap_hwmod omap3xxx_gpio4_hwmod = {
 730	.name		= "gpio4",
 731	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 732	.main_clk	= "gpio4_ick",
 733	.opt_clks	= gpio4_opt_clks,
 734	.opt_clks_cnt	= ARRAY_SIZE(gpio4_opt_clks),
 735	.prcm		= {
 736		.omap2 = {
 737			.module_offs = OMAP3430_PER_MOD,
 738			.idlest_reg_id = 1,
 739			.idlest_idle_bit = OMAP3430_ST_GPIO4_SHIFT,
 740		},
 741	},
 742	.class		= &omap3xxx_gpio_hwmod_class,
 743};
 744
 745/* gpio5 */
 746
 747static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
 748	{ .role = "dbclk", .clk = "gpio5_dbck", },
 749};
 750
 751static struct omap_hwmod omap3xxx_gpio5_hwmod = {
 752	.name		= "gpio5",
 753	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 754	.main_clk	= "gpio5_ick",
 755	.opt_clks	= gpio5_opt_clks,
 756	.opt_clks_cnt	= ARRAY_SIZE(gpio5_opt_clks),
 757	.prcm		= {
 758		.omap2 = {
 759			.module_offs = OMAP3430_PER_MOD,
 760			.idlest_reg_id = 1,
 761			.idlest_idle_bit = OMAP3430_ST_GPIO5_SHIFT,
 762		},
 763	},
 764	.class		= &omap3xxx_gpio_hwmod_class,
 765};
 766
 767/* gpio6 */
 768
 769static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
 770	{ .role = "dbclk", .clk = "gpio6_dbck", },
 771};
 772
 773static struct omap_hwmod omap3xxx_gpio6_hwmod = {
 774	.name		= "gpio6",
 775	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 776	.main_clk	= "gpio6_ick",
 777	.opt_clks	= gpio6_opt_clks,
 778	.opt_clks_cnt	= ARRAY_SIZE(gpio6_opt_clks),
 779	.prcm		= {
 780		.omap2 = {
 781			.module_offs = OMAP3430_PER_MOD,
 782			.idlest_reg_id = 1,
 783			.idlest_idle_bit = OMAP3430_ST_GPIO6_SHIFT,
 784		},
 785	},
 786	.class		= &omap3xxx_gpio_hwmod_class,
 787};
 788
 789/*
 790 * 'mcbsp' class
 791 * multi channel buffered serial port controller
 792 */
 793
 794static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sysc = {
 795	.rev_offs	= -ENODEV,
 796	.sysc_offs	= 0x008c,
 797	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP |
 798			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
 799	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 800	.sysc_fields	= &omap_hwmod_sysc_type1,
 801};
 802
 803static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {
 804	.name = "mcbsp",
 805	.sysc = &omap3xxx_mcbsp_sysc,
 806};
 807
 808/* McBSP functional clock mapping */
 809static struct omap_hwmod_opt_clk mcbsp15_opt_clks[] = {
 810	{ .role = "pad_fck", .clk = "mcbsp_clks" },
 811	{ .role = "prcm_fck", .clk = "core_96m_fck" },
 812};
 813
 814static struct omap_hwmod_opt_clk mcbsp234_opt_clks[] = {
 815	{ .role = "pad_fck", .clk = "mcbsp_clks" },
 816	{ .role = "prcm_fck", .clk = "per_96m_fck" },
 817};
 818
 819/* mcbsp1 */
 820static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {
 821	.name		= "mcbsp1",
 822	.class		= &omap3xxx_mcbsp_hwmod_class,
 823	.main_clk	= "mcbsp1_fck",
 824	.prcm		= {
 825		.omap2 = {
 826			.module_offs = CORE_MOD,
 827			.idlest_reg_id = 1,
 828			.idlest_idle_bit = OMAP3430_ST_MCBSP1_SHIFT,
 829		},
 830	},
 831	.opt_clks	= mcbsp15_opt_clks,
 832	.opt_clks_cnt	= ARRAY_SIZE(mcbsp15_opt_clks),
 833};
 834
 835/* mcbsp2 */
 836static struct omap_hwmod omap3xxx_mcbsp2_hwmod = {
 837	.name		= "mcbsp2",
 838	.class		= &omap3xxx_mcbsp_hwmod_class,
 839	.main_clk	= "mcbsp2_fck",
 840	.prcm		= {
 841		.omap2 = {
 842			.module_offs = OMAP3430_PER_MOD,
 843			.idlest_reg_id = 1,
 844			.idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,
 845		},
 846	},
 847	.opt_clks	= mcbsp234_opt_clks,
 848	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),
 849};
 850
 851/* mcbsp3 */
 852static struct omap_hwmod omap3xxx_mcbsp3_hwmod = {
 853	.name		= "mcbsp3",
 854	.class		= &omap3xxx_mcbsp_hwmod_class,
 855	.main_clk	= "mcbsp3_fck",
 856	.prcm		= {
 857		.omap2 = {
 858			.module_offs = OMAP3430_PER_MOD,
 859			.idlest_reg_id = 1,
 860			.idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,
 861		},
 862	},
 863	.opt_clks	= mcbsp234_opt_clks,
 864	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),
 865};
 866
 867/* mcbsp4 */
 868static struct omap_hwmod omap3xxx_mcbsp4_hwmod = {
 869	.name		= "mcbsp4",
 870	.class		= &omap3xxx_mcbsp_hwmod_class,
 871	.main_clk	= "mcbsp4_fck",
 872	.prcm		= {
 873		.omap2 = {
 874			.module_offs = OMAP3430_PER_MOD,
 875			.idlest_reg_id = 1,
 876			.idlest_idle_bit = OMAP3430_ST_MCBSP4_SHIFT,
 877		},
 878	},
 879	.opt_clks	= mcbsp234_opt_clks,
 880	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),
 881};
 882
 883/* mcbsp5 */
 884static struct omap_hwmod omap3xxx_mcbsp5_hwmod = {
 885	.name		= "mcbsp5",
 886	.class		= &omap3xxx_mcbsp_hwmod_class,
 887	.main_clk	= "mcbsp5_fck",
 888	.prcm		= {
 889		.omap2 = {
 890			.module_offs = CORE_MOD,
 891			.idlest_reg_id = 1,
 892			.idlest_idle_bit = OMAP3430_ST_MCBSP5_SHIFT,
 893		},
 894	},
 895	.opt_clks	= mcbsp15_opt_clks,
 896	.opt_clks_cnt	= ARRAY_SIZE(mcbsp15_opt_clks),
 897};
 898
 899/* 'mcbsp sidetone' class */
 900static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sidetone_sysc = {
 901	.rev_offs	= -ENODEV,
 902	.sysc_offs	= 0x0010,
 903	.sysc_flags	= SYSC_HAS_AUTOIDLE,
 904	.sysc_fields	= &omap_hwmod_sysc_type1,
 905};
 906
 907static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = {
 908	.name = "mcbsp_sidetone",
 909	.sysc = &omap3xxx_mcbsp_sidetone_sysc,
 910};
 911
 912/* mcbsp2_sidetone */
 913static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = {
 914	.name		= "mcbsp2_sidetone",
 915	.class		= &omap3xxx_mcbsp_sidetone_hwmod_class,
 916	.main_clk	= "mcbsp2_ick",
 917	.flags		= HWMOD_NO_IDLEST,
 918};
 919
 920/* mcbsp3_sidetone */
 921static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = {
 922	.name		= "mcbsp3_sidetone",
 923	.class		= &omap3xxx_mcbsp_sidetone_hwmod_class,
 924	.main_clk	= "mcbsp3_ick",
 925	.flags		= HWMOD_NO_IDLEST,
 926};
 927
 928/* SR common */
 929static struct omap_hwmod_class_sysconfig omap34xx_sr_sysc = {
 930	.rev_offs	= -ENODEV,
 931	.sysc_offs	= 0x24,
 932	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_NO_CACHE),
 933	.sysc_fields	= &omap34xx_sr_sysc_fields,
 934};
 935
 936static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = {
 937	.name = "smartreflex",
 938	.sysc = &omap34xx_sr_sysc,
 939};
 940
 941static struct omap_hwmod_class_sysconfig omap36xx_sr_sysc = {
 942	.rev_offs	= -ENODEV,
 943	.sysc_offs	= 0x38,
 944	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 945	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
 946			SYSC_NO_CACHE),
 947	.sysc_fields	= &omap36xx_sr_sysc_fields,
 948};
 949
 950static struct omap_hwmod_class omap36xx_smartreflex_hwmod_class = {
 951	.name = "smartreflex",
 952	.sysc = &omap36xx_sr_sysc,
 953};
 954
 955/* SR1 */
 956static struct omap_smartreflex_dev_attr sr1_dev_attr = {
 957	.sensor_voltdm_name   = "mpu_iva",
 958};
 959
 960
 961static struct omap_hwmod omap34xx_sr1_hwmod = {
 962	.name		= "smartreflex_mpu_iva",
 963	.class		= &omap34xx_smartreflex_hwmod_class,
 964	.main_clk	= "sr1_fck",
 965	.prcm		= {
 966		.omap2 = {
 967			.module_offs = WKUP_MOD,
 968			.idlest_reg_id = 1,
 969			.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
 970		},
 971	},
 972	.dev_attr	= &sr1_dev_attr,
 973	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 974};
 975
 976static struct omap_hwmod omap36xx_sr1_hwmod = {
 977	.name		= "smartreflex_mpu_iva",
 978	.class		= &omap36xx_smartreflex_hwmod_class,
 979	.main_clk	= "sr1_fck",
 980	.prcm		= {
 981		.omap2 = {
 982			.module_offs = WKUP_MOD,
 983			.idlest_reg_id = 1,
 984			.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
 985		},
 986	},
 987	.dev_attr	= &sr1_dev_attr,
 988};
 989
 990/* SR2 */
 991static struct omap_smartreflex_dev_attr sr2_dev_attr = {
 992	.sensor_voltdm_name	= "core",
 993};
 994
 995
 996static struct omap_hwmod omap34xx_sr2_hwmod = {
 997	.name		= "smartreflex_core",
 998	.class		= &omap34xx_smartreflex_hwmod_class,
 999	.main_clk	= "sr2_fck",
1000	.prcm		= {
1001		.omap2 = {
1002			.module_offs = WKUP_MOD,
1003			.idlest_reg_id = 1,
1004			.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
1005		},
1006	},
1007	.dev_attr	= &sr2_dev_attr,
1008	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
1009};
1010
1011static struct omap_hwmod omap36xx_sr2_hwmod = {
1012	.name		= "smartreflex_core",
1013	.class		= &omap36xx_smartreflex_hwmod_class,
1014	.main_clk	= "sr2_fck",
1015	.prcm		= {
1016		.omap2 = {
1017			.module_offs = WKUP_MOD,
1018			.idlest_reg_id = 1,
1019			.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
1020		},
1021	},
1022	.dev_attr	= &sr2_dev_attr,
1023};
1024
1025/*
1026 * 'mailbox' class
1027 * mailbox module allowing communication between the on-chip processors
1028 * using a queued mailbox-interrupt mechanism.
1029 */
1030
1031static struct omap_hwmod_class_sysconfig omap3xxx_mailbox_sysc = {
1032	.rev_offs	= 0x000,
1033	.sysc_offs	= 0x010,
1034	.syss_offs	= 0x014,
1035	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1036				SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
1037	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1038	.sysc_fields	= &omap_hwmod_sysc_type1,
1039};
1040
1041static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
1042	.name = "mailbox",
1043	.sysc = &omap3xxx_mailbox_sysc,
1044};
1045
1046static struct omap_hwmod omap3xxx_mailbox_hwmod = {
1047	.name		= "mailbox",
1048	.class		= &omap3xxx_mailbox_hwmod_class,
1049	.main_clk	= "mailboxes_ick",
1050	.prcm		= {
1051		.omap2 = {
1052			.module_offs = CORE_MOD,
1053			.idlest_reg_id = 1,
1054			.idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT,
1055		},
1056	},
1057};
1058
1059/*
1060 * 'mcspi' class
1061 * multichannel serial port interface (mcspi) / master/slave synchronous serial
1062 * bus
1063 */
1064
1065static struct omap_hwmod_class_sysconfig omap34xx_mcspi_sysc = {
1066	.rev_offs	= 0x0000,
1067	.sysc_offs	= 0x0010,
1068	.syss_offs	= 0x0014,
1069	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1070				SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1071				SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
1072	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1073	.sysc_fields    = &omap_hwmod_sysc_type1,
1074};
1075
1076static struct omap_hwmod_class omap34xx_mcspi_class = {
1077	.name = "mcspi",
1078	.sysc = &omap34xx_mcspi_sysc,
1079};
1080
1081/* mcspi1 */
1082static struct omap_hwmod omap34xx_mcspi1 = {
1083	.name		= "mcspi1",
1084	.main_clk	= "mcspi1_fck",
1085	.prcm		= {
1086		.omap2 = {
1087			.module_offs = CORE_MOD,
1088			.idlest_reg_id = 1,
1089			.idlest_idle_bit = OMAP3430_ST_MCSPI1_SHIFT,
1090		},
1091	},
1092	.class		= &omap34xx_mcspi_class,
1093};
1094
1095/* mcspi2 */
1096static struct omap_hwmod omap34xx_mcspi2 = {
1097	.name		= "mcspi2",
1098	.main_clk	= "mcspi2_fck",
1099	.prcm		= {
1100		.omap2 = {
1101			.module_offs = CORE_MOD,
1102			.idlest_reg_id = 1,
1103			.idlest_idle_bit = OMAP3430_ST_MCSPI2_SHIFT,
1104		},
1105	},
1106	.class		= &omap34xx_mcspi_class,
1107};
1108
1109/* mcspi3 */
1110static struct omap_hwmod omap34xx_mcspi3 = {
1111	.name		= "mcspi3",
1112	.main_clk	= "mcspi3_fck",
1113	.prcm		= {
1114		.omap2 = {
1115			.module_offs = CORE_MOD,
1116			.idlest_reg_id = 1,
1117			.idlest_idle_bit = OMAP3430_ST_MCSPI3_SHIFT,
1118		},
1119	},
1120	.class		= &omap34xx_mcspi_class,
1121};
1122
1123/* mcspi4 */
1124static struct omap_hwmod omap34xx_mcspi4 = {
1125	.name		= "mcspi4",
1126	.main_clk	= "mcspi4_fck",
1127	.prcm		= {
1128		.omap2 = {
1129			.module_offs = CORE_MOD,
1130			.idlest_reg_id = 1,
1131			.idlest_idle_bit = OMAP3430_ST_MCSPI4_SHIFT,
1132		},
1133	},
1134	.class		= &omap34xx_mcspi_class,
1135};
1136
1137/* MMC/SD/SDIO common */
1138static struct omap_hwmod_class_sysconfig omap34xx_mmc_sysc = {
1139	.rev_offs	= 0x1fc,
1140	.sysc_offs	= 0x10,
1141	.syss_offs	= 0x14,
1142	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1143			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1144			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
1145	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1146	.sysc_fields    = &omap_hwmod_sysc_type1,
1147};
1148
1149static struct omap_hwmod_class omap34xx_mmc_class = {
1150	.name = "mmc",
1151	.sysc = &omap34xx_mmc_sysc,
1152};
1153
1154/* MMC/SD/SDIO1 */
1155
1156
1157
1158static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = {
1159	{ .role = "dbck", .clk = "omap_32k_fck", },
1160};
1161
1162static struct omap_hsmmc_dev_attr mmc1_dev_attr = {
1163	.flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
1164};
1165
1166/* See 35xx errata 2.1.1.128 in SPRZ278F */
1167static struct omap_hsmmc_dev_attr mmc1_pre_es3_dev_attr = {
1168	.flags = (OMAP_HSMMC_SUPPORTS_DUAL_VOLT |
1169		  OMAP_HSMMC_BROKEN_MULTIBLOCK_READ),
1170};
1171
1172static struct omap_hwmod omap3xxx_pre_es3_mmc1_hwmod = {
1173	.name		= "mmc1",
1174	.opt_clks	= omap34xx_mmc1_opt_clks,
1175	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc1_opt_clks),
1176	.main_clk	= "mmchs1_fck",
1177	.prcm		= {
1178		.omap2 = {
1179			.module_offs = CORE_MOD,
1180			.idlest_reg_id = 1,
1181			.idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
1182		},
1183	},
1184	.dev_attr	= &mmc1_pre_es3_dev_attr,
1185	.class		= &omap34xx_mmc_class,
1186};
1187
1188static struct omap_hwmod omap3xxx_es3plus_mmc1_hwmod = {
1189	.name		= "mmc1",
1190	.opt_clks	= omap34xx_mmc1_opt_clks,
1191	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc1_opt_clks),
1192	.main_clk	= "mmchs1_fck",
1193	.prcm		= {
1194		.omap2 = {
1195			.module_offs = CORE_MOD,
1196			.idlest_reg_id = 1,
1197			.idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
1198		},
1199	},
1200	.dev_attr	= &mmc1_dev_attr,
1201	.class		= &omap34xx_mmc_class,
1202};
1203
1204/* MMC/SD/SDIO2 */
1205
1206
1207
1208static struct omap_hwmod_opt_clk omap34xx_mmc2_opt_clks[] = {
1209	{ .role = "dbck", .clk = "omap_32k_fck", },
1210};
1211
1212/* See 35xx errata 2.1.1.128 in SPRZ278F */
1213static struct omap_hsmmc_dev_attr mmc2_pre_es3_dev_attr = {
1214	.flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ,
1215};
1216
1217static struct omap_hwmod omap3xxx_pre_es3_mmc2_hwmod = {
1218	.name		= "mmc2",
1219	.opt_clks	= omap34xx_mmc2_opt_clks,
1220	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc2_opt_clks),
1221	.main_clk	= "mmchs2_fck",
1222	.prcm		= {
1223		.omap2 = {
1224			.module_offs = CORE_MOD,
1225			.idlest_reg_id = 1,
1226			.idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
1227		},
1228	},
1229	.dev_attr	= &mmc2_pre_es3_dev_attr,
1230	.class		= &omap34xx_mmc_class,
1231};
1232
1233static struct omap_hwmod omap3xxx_es3plus_mmc2_hwmod = {
1234	.name		= "mmc2",
1235	.opt_clks	= omap34xx_mmc2_opt_clks,
1236	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc2_opt_clks),
1237	.main_clk	= "mmchs2_fck",
1238	.prcm		= {
1239		.omap2 = {
1240			.module_offs = CORE_MOD,
1241			.idlest_reg_id = 1,
1242			.idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
1243		},
1244	},
1245	.class		= &omap34xx_mmc_class,
1246};
1247
1248/* MMC/SD/SDIO3 */
1249
1250
1251
1252static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = {
1253	{ .role = "dbck", .clk = "omap_32k_fck", },
1254};
1255
1256static struct omap_hwmod omap3xxx_mmc3_hwmod = {
1257	.name		= "mmc3",
1258	.opt_clks	= omap34xx_mmc3_opt_clks,
1259	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc3_opt_clks),
1260	.main_clk	= "mmchs3_fck",
1261	.prcm		= {
1262		.omap2 = {
1263			.module_offs = CORE_MOD,
1264			.idlest_reg_id = 1,
1265			.idlest_idle_bit = OMAP3430_ST_MMC3_SHIFT,
1266		},
1267	},
1268	.class		= &omap34xx_mmc_class,
1269};
1270
1271/*
1272 * 'usb_host_hs' class
1273 * high-speed multi-port usb host controller
1274 */
1275
1276static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = {
1277	.rev_offs	= 0x0000,
1278	.sysc_offs	= 0x0010,
1279	.syss_offs	= 0x0014,
1280	.sysc_flags	= (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
1281			   SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
1282			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
1283			   SYSS_HAS_RESET_STATUS),
1284	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1285			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
1286	.sysc_fields	= &omap_hwmod_sysc_type1,
1287};
1288
1289static struct omap_hwmod_class omap3xxx_usb_host_hs_hwmod_class = {
1290	.name = "usb_host_hs",
1291	.sysc = &omap3xxx_usb_host_hs_sysc,
1292};
1293
1294
1295static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
1296	.name		= "usb_host_hs",
1297	.class		= &omap3xxx_usb_host_hs_hwmod_class,
1298	.clkdm_name	= "usbhost_clkdm",
1299	.main_clk	= "usbhost_48m_fck",
1300	.prcm = {
1301		.omap2 = {
1302			.module_offs = OMAP3430ES2_USBHOST_MOD,
1303			.idlest_reg_id = 1,
1304			.idlest_idle_bit = OMAP3430ES2_ST_USBHOST_IDLE_SHIFT,
1305		},
1306	},
1307
1308	/*
1309	 * Errata: USBHOST Configured In Smart-Idle Can Lead To a Deadlock
1310	 * id: i660
1311	 *
1312	 * Description:
1313	 * In the following configuration :
1314	 * - USBHOST module is set to smart-idle mode
1315	 * - PRCM asserts idle_req to the USBHOST module ( This typically
1316	 *   happens when the system is going to a low power mode : all ports
1317	 *   have been suspended, the master part of the USBHOST module has
1318	 *   entered the standby state, and SW has cut the functional clocks)
1319	 * - an USBHOST interrupt occurs before the module is able to answer
1320	 *   idle_ack, typically a remote wakeup IRQ.
1321	 * Then the USB HOST module will enter a deadlock situation where it
1322	 * is no more accessible nor functional.
1323	 *
1324	 * Workaround:
1325	 * Don't use smart idle; use only force idle, hence HWMOD_SWSUP_SIDLE
1326	 */
1327
1328	/*
1329	 * Errata: USB host EHCI may stall when entering smart-standby mode
1330	 * Id: i571
1331	 *
1332	 * Description:
1333	 * When the USBHOST module is set to smart-standby mode, and when it is
1334	 * ready to enter the standby state (i.e. all ports are suspended and
1335	 * all attached devices are in suspend mode), then it can wrongly assert
1336	 * the Mstandby signal too early while there are still some residual OCP
1337	 * transactions ongoing. If this condition occurs, the internal state
1338	 * machine may go to an undefined state and the USB link may be stuck
1339	 * upon the next resume.
1340	 *
1341	 * Workaround:
1342	 * Don't use smart standby; use only force standby,
1343	 * hence HWMOD_SWSUP_MSTANDBY
1344	 */
1345
1346	.flags		= HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
1347};
1348
1349/*
1350 * 'usb_tll_hs' class
1351 * usb_tll_hs module is the adapter on the usb_host_hs ports
1352 */
1353static struct omap_hwmod_class_sysconfig omap3xxx_usb_tll_hs_sysc = {
1354	.rev_offs	= 0x0000,
1355	.sysc_offs	= 0x0010,
1356	.syss_offs	= 0x0014,
1357	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1358			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1359			   SYSC_HAS_AUTOIDLE),
1360	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1361	.sysc_fields	= &omap_hwmod_sysc_type1,
1362};
1363
1364static struct omap_hwmod_class omap3xxx_usb_tll_hs_hwmod_class = {
1365	.name = "usb_tll_hs",
1366	.sysc = &omap3xxx_usb_tll_hs_sysc,
1367};
1368
1369
1370static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = {
1371	.name		= "usb_tll_hs",
1372	.class		= &omap3xxx_usb_tll_hs_hwmod_class,
1373	.clkdm_name	= "core_l4_clkdm",
1374	.main_clk	= "usbtll_fck",
1375	.prcm = {
1376		.omap2 = {
1377			.module_offs = CORE_MOD,
1378			.idlest_reg_id = 3,
1379			.idlest_idle_bit = OMAP3430ES2_ST_USBTLL_SHIFT,
1380		},
1381	},
1382};
1383
1384static struct omap_hwmod omap3xxx_hdq1w_hwmod = {
1385	.name		= "hdq1w",
1386	.main_clk	= "hdq_fck",
1387	.prcm		= {
1388		.omap2 = {
1389			.module_offs = CORE_MOD,
1390			.idlest_reg_id = 1,
1391			.idlest_idle_bit = OMAP3430_ST_HDQ_SHIFT,
1392		},
1393	},
1394	.class		= &omap2_hdq1w_class,
1395};
1396
1397/* SAD2D */
1398static struct omap_hwmod_rst_info omap3xxx_sad2d_resets[] = {
1399	{ .name = "rst_modem_pwron_sw", .rst_shift = 0 },
1400	{ .name = "rst_modem_sw", .rst_shift = 1 },
1401};
1402
1403static struct omap_hwmod_class omap3xxx_sad2d_class = {
1404	.name			= "sad2d",
1405};
1406
1407static struct omap_hwmod omap3xxx_sad2d_hwmod = {
1408	.name		= "sad2d",
1409	.rst_lines	= omap3xxx_sad2d_resets,
1410	.rst_lines_cnt	= ARRAY_SIZE(omap3xxx_sad2d_resets),
1411	.main_clk	= "sad2d_ick",
1412	.prcm		= {
1413		.omap2 = {
1414			.module_offs = CORE_MOD,
1415			.idlest_reg_id = 1,
1416			.idlest_idle_bit = OMAP3430_ST_SAD2D_SHIFT,
1417		},
1418	},
1419	.class		= &omap3xxx_sad2d_class,
1420};
1421
1422/*
1423 * 'gpmc' class
1424 * general purpose memory controller
1425 */
1426
1427static struct omap_hwmod_class_sysconfig omap3xxx_gpmc_sysc = {
1428	.rev_offs	= 0x0000,
1429	.sysc_offs	= 0x0010,
1430	.syss_offs	= 0x0014,
1431	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
1432			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
1433	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1434	.sysc_fields	= &omap_hwmod_sysc_type1,
1435};
1436
1437static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = {
1438	.name	= "gpmc",
1439	.sysc	= &omap3xxx_gpmc_sysc,
1440};
1441
1442static struct omap_hwmod omap3xxx_gpmc_hwmod = {
1443	.name		= "gpmc",
1444	.class		= &omap3xxx_gpmc_hwmod_class,
1445	.clkdm_name	= "core_l3_clkdm",
1446	.main_clk	= "gpmc_fck",
1447	/* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */
1448	.flags		= HWMOD_NO_IDLEST | DEBUG_OMAP_GPMC_HWMOD_FLAGS,
1449};
1450
1451/*
1452 * interfaces
1453 */
1454
1455/* L3 -> L4_CORE interface */
1456static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
1457	.master	= &omap3xxx_l3_main_hwmod,
1458	.slave	= &omap3xxx_l4_core_hwmod,
1459	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1460};
1461
1462/* L3 -> L4_PER interface */
1463static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = {
1464	.master = &omap3xxx_l3_main_hwmod,
1465	.slave	= &omap3xxx_l4_per_hwmod,
1466	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1467};
1468
1469
1470/* MPU -> L3 interface */
1471static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = {
1472	.master   = &omap3xxx_mpu_hwmod,
1473	.slave    = &omap3xxx_l3_main_hwmod,
1474	.user	= OCP_USER_MPU,
1475};
1476
1477
1478/* l3 -> debugss */
1479static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_debugss = {
1480	.master		= &omap3xxx_l3_main_hwmod,
1481	.slave		= &omap3xxx_debugss_hwmod,
1482	.user		= OCP_USER_MPU,
1483};
1484
1485/* DSS -> l3 */
1486static struct omap_hwmod_ocp_if omap3430es1_dss__l3 = {
1487	.master		= &omap3430es1_dss_core_hwmod,
1488	.slave		= &omap3xxx_l3_main_hwmod,
1489	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1490};
1491
1492static struct omap_hwmod_ocp_if omap3xxx_dss__l3 = {
1493	.master		= &omap3xxx_dss_core_hwmod,
1494	.slave		= &omap3xxx_l3_main_hwmod,
1495	.fw = {
1496		.omap2 = {
1497			.l3_perm_bit  = OMAP3_L3_CORE_FW_INIT_ID_DSS,
1498			.flags	= OMAP_FIREWALL_L3,
1499		},
1500	},
1501	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1502};
1503
1504/* l3_core -> sad2d interface */
1505static struct omap_hwmod_ocp_if omap3xxx_sad2d__l3 = {
1506	.master		= &omap3xxx_sad2d_hwmod,
1507	.slave		= &omap3xxx_l3_main_hwmod,
1508	.clk		= "core_l3_ick",
1509	.user		= OCP_USER_MPU,
1510};
1511
1512/* L4_CORE -> L4_WKUP interface */
1513static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
1514	.master	= &omap3xxx_l4_core_hwmod,
1515	.slave	= &omap3xxx_l4_wkup_hwmod,
1516	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1517};
1518
1519/* L4 CORE -> MMC1 interface */
1520static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc1 = {
1521	.master		= &omap3xxx_l4_core_hwmod,
1522	.slave		= &omap3xxx_pre_es3_mmc1_hwmod,
1523	.clk		= "mmchs1_ick",
1524	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1525	.flags		= OMAP_FIREWALL_L4,
1526};
1527
1528static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc1 = {
1529	.master		= &omap3xxx_l4_core_hwmod,
1530	.slave		= &omap3xxx_es3plus_mmc1_hwmod,
1531	.clk		= "mmchs1_ick",
1532	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1533	.flags		= OMAP_FIREWALL_L4,
1534};
1535
1536/* L4 CORE -> MMC2 interface */
1537static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc2 = {
1538	.master		= &omap3xxx_l4_core_hwmod,
1539	.slave		= &omap3xxx_pre_es3_mmc2_hwmod,
1540	.clk		= "mmchs2_ick",
1541	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1542	.flags		= OMAP_FIREWALL_L4,
1543};
1544
1545static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc2 = {
1546	.master		= &omap3xxx_l4_core_hwmod,
1547	.slave		= &omap3xxx_es3plus_mmc2_hwmod,
1548	.clk		= "mmchs2_ick",
1549	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1550	.flags		= OMAP_FIREWALL_L4,
1551};
1552
1553/* L4 CORE -> MMC3 interface */
1554
1555static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc3 = {
1556	.master		= &omap3xxx_l4_core_hwmod,
1557	.slave		= &omap3xxx_mmc3_hwmod,
1558	.clk		= "mmchs3_ick",
1559	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1560	.flags		= OMAP_FIREWALL_L4,
1561};
1562
1563/* L4 CORE -> UART1 interface */
1564
1565static struct omap_hwmod_ocp_if omap3_l4_core__uart1 = {
1566	.master		= &omap3xxx_l4_core_hwmod,
1567	.slave		= &omap3xxx_uart1_hwmod,
1568	.clk		= "uart1_ick",
1569	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1570};
1571
1572/* L4 CORE -> UART2 interface */
1573
1574static struct omap_hwmod_ocp_if omap3_l4_core__uart2 = {
1575	.master		= &omap3xxx_l4_core_hwmod,
1576	.slave		= &omap3xxx_uart2_hwmod,
1577	.clk		= "uart2_ick",
1578	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1579};
1580
1581/* L4 PER -> UART3 interface */
1582
1583static struct omap_hwmod_ocp_if omap3_l4_per__uart3 = {
1584	.master		= &omap3xxx_l4_per_hwmod,
1585	.slave		= &omap3xxx_uart3_hwmod,
1586	.clk		= "uart3_ick",
1587	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1588};
1589
1590/* L4 PER -> UART4 interface */
1591
1592static struct omap_hwmod_ocp_if omap36xx_l4_per__uart4 = {
1593	.master		= &omap3xxx_l4_per_hwmod,
1594	.slave		= &omap36xx_uart4_hwmod,
1595	.clk		= "uart4_ick",
1596	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1597};
1598
1599/* AM35xx: L4 CORE -> UART4 interface */
1600
1601static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = {
1602	.master		= &omap3xxx_l4_core_hwmod,
1603	.slave		= &am35xx_uart4_hwmod,
1604	.clk		= "uart4_ick",
1605	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1606};
1607
1608/* L4 CORE -> I2C1 interface */
1609static struct omap_hwmod_ocp_if omap3_l4_core__i2c1 = {
1610	.master		= &omap3xxx_l4_core_hwmod,
1611	.slave		= &omap3xxx_i2c1_hwmod,
1612	.clk		= "i2c1_ick",
1613	.fw = {
1614		.omap2 = {
1615			.l4_fw_region  = OMAP3_L4_CORE_FW_I2C1_REGION,
1616			.l4_prot_group = 7,
1617			.flags	= OMAP_FIREWALL_L4,
1618		},
1619	},
1620	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1621};
1622
1623/* L4 CORE -> I2C2 interface */
1624static struct omap_hwmod_ocp_if omap3_l4_core__i2c2 = {
1625	.master		= &omap3xxx_l4_core_hwmod,
1626	.slave		= &omap3xxx_i2c2_hwmod,
1627	.clk		= "i2c2_ick",
1628	.fw = {
1629		.omap2 = {
1630			.l4_fw_region  = OMAP3_L4_CORE_FW_I2C2_REGION,
1631			.l4_prot_group = 7,
1632			.flags = OMAP_FIREWALL_L4,
1633		},
1634	},
1635	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1636};
1637
1638/* L4 CORE -> I2C3 interface */
1639
1640static struct omap_hwmod_ocp_if omap3_l4_core__i2c3 = {
1641	.master		= &omap3xxx_l4_core_hwmod,
1642	.slave		= &omap3xxx_i2c3_hwmod,
1643	.clk		= "i2c3_ick",
1644	.fw = {
1645		.omap2 = {
1646			.l4_fw_region  = OMAP3_L4_CORE_FW_I2C3_REGION,
1647			.l4_prot_group = 7,
1648			.flags = OMAP_FIREWALL_L4,
1649		},
1650	},
1651	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1652};
1653
1654/* L4 CORE -> SR1 interface */
1655static struct omap_hwmod_ocp_if omap34xx_l4_core__sr1 = {
1656	.master		= &omap3xxx_l4_core_hwmod,
1657	.slave		= &omap34xx_sr1_hwmod,
1658	.clk		= "sr_l4_ick",
1659	.user		= OCP_USER_MPU,
1660};
1661
1662static struct omap_hwmod_ocp_if omap36xx_l4_core__sr1 = {
1663	.master		= &omap3xxx_l4_core_hwmod,
1664	.slave		= &omap36xx_sr1_hwmod,
1665	.clk		= "sr_l4_ick",
1666	.user		= OCP_USER_MPU,
1667};
1668
1669/* L4 CORE -> SR2 interface */
1670
1671static struct omap_hwmod_ocp_if omap34xx_l4_core__sr2 = {
1672	.master		= &omap3xxx_l4_core_hwmod,
1673	.slave		= &omap34xx_sr2_hwmod,
1674	.clk		= "sr_l4_ick",
1675	.user		= OCP_USER_MPU,
1676};
1677
1678static struct omap_hwmod_ocp_if omap36xx_l4_core__sr2 = {
1679	.master		= &omap3xxx_l4_core_hwmod,
1680	.slave		= &omap36xx_sr2_hwmod,
1681	.clk		= "sr_l4_ick",
1682	.user		= OCP_USER_MPU,
1683};
1684
1685/* L4_WKUP -> L4_SEC interface */
1686static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__l4_sec = {
1687	.master = &omap3xxx_l4_wkup_hwmod,
1688	.slave	= &omap3xxx_l4_sec_hwmod,
1689	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1690};
1691
1692/* IVA2 <- L3 interface */
1693static struct omap_hwmod_ocp_if omap3xxx_l3__iva = {
1694	.master		= &omap3xxx_l3_main_hwmod,
1695	.slave		= &omap3xxx_iva_hwmod,
1696	.clk		= "core_l3_ick",
1697	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1698};
1699
1700/* l4_per -> timer3 */
1701static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer3 = {
1702	.master		= &omap3xxx_l4_per_hwmod,
1703	.slave		= &omap3xxx_timer3_hwmod,
1704	.clk		= "gpt3_ick",
1705	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1706};
1707
1708
1709/* l4_per -> timer4 */
1710static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer4 = {
1711	.master		= &omap3xxx_l4_per_hwmod,
1712	.slave		= &omap3xxx_timer4_hwmod,
1713	.clk		= "gpt4_ick",
1714	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1715};
1716
1717
1718/* l4_per -> timer5 */
1719static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer5 = {
1720	.master		= &omap3xxx_l4_per_hwmod,
1721	.slave		= &omap3xxx_timer5_hwmod,
1722	.clk		= "gpt5_ick",
1723	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1724};
1725
1726
1727/* l4_per -> timer6 */
1728static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer6 = {
1729	.master		= &omap3xxx_l4_per_hwmod,
1730	.slave		= &omap3xxx_timer6_hwmod,
1731	.clk		= "gpt6_ick",
1732	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1733};
1734
1735
1736/* l4_per -> timer7 */
1737static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer7 = {
1738	.master		= &omap3xxx_l4_per_hwmod,
1739	.slave		= &omap3xxx_timer7_hwmod,
1740	.clk		= "gpt7_ick",
1741	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1742};
1743
1744
1745/* l4_per -> timer8 */
1746static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer8 = {
1747	.master		= &omap3xxx_l4_per_hwmod,
1748	.slave		= &omap3xxx_timer8_hwmod,
1749	.clk		= "gpt8_ick",
1750	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1751};
1752
1753
1754/* l4_per -> timer9 */
1755static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer9 = {
1756	.master		= &omap3xxx_l4_per_hwmod,
1757	.slave		= &omap3xxx_timer9_hwmod,
1758	.clk		= "gpt9_ick",
1759	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1760};
1761
1762/* l4_core -> timer10 */
1763static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer10 = {
1764	.master		= &omap3xxx_l4_core_hwmod,
1765	.slave		= &omap3xxx_timer10_hwmod,
1766	.clk		= "gpt10_ick",
1767	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1768};
1769
1770/* l4_core -> timer11 */
1771static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer11 = {
1772	.master		= &omap3xxx_l4_core_hwmod,
1773	.slave		= &omap3xxx_timer11_hwmod,
1774	.clk		= "gpt11_ick",
1775	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1776};
1777
1778/* l4_wkup -> wd_timer2 */
1779
1780static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = {
1781	.master		= &omap3xxx_l4_wkup_hwmod,
1782	.slave		= &omap3xxx_wd_timer2_hwmod,
1783	.clk		= "wdt2_ick",
1784	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1785};
1786
1787/* l4_core -> dss */
1788static struct omap_hwmod_ocp_if omap3430es1_l4_core__dss = {
1789	.master		= &omap3xxx_l4_core_hwmod,
1790	.slave		= &omap3430es1_dss_core_hwmod,
1791	.clk		= "dss_ick",
1792	.fw = {
1793		.omap2 = {
1794			.l4_fw_region  = OMAP3ES1_L4_CORE_FW_DSS_CORE_REGION,
1795			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1796			.flags	= OMAP_FIREWALL_L4,
1797		},
1798	},
1799	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1800};
1801
1802static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss = {
1803	.master		= &omap3xxx_l4_core_hwmod,
1804	.slave		= &omap3xxx_dss_core_hwmod,
1805	.clk		= "dss_ick",
1806	.fw = {
1807		.omap2 = {
1808			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_CORE_REGION,
1809			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1810			.flags	= OMAP_FIREWALL_L4,
1811		},
1812	},
1813	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1814};
1815
1816/* l4_core -> dss_dispc */
1817static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = {
1818	.master		= &omap3xxx_l4_core_hwmod,
1819	.slave		= &omap3xxx_dss_dispc_hwmod,
1820	.clk		= "dss_ick",
1821	.fw = {
1822		.omap2 = {
1823			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_DISPC_REGION,
1824			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1825			.flags	= OMAP_FIREWALL_L4,
1826		},
1827	},
1828	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1829};
1830
1831/* l4_core -> dss_dsi1 */
1832static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dsi1 = {
1833	.master		= &omap3xxx_l4_core_hwmod,
1834	.slave		= &omap3xxx_dss_dsi1_hwmod,
1835	.clk		= "dss_ick",
1836	.fw = {
1837		.omap2 = {
1838			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_DSI_REGION,
1839			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1840			.flags	= OMAP_FIREWALL_L4,
1841		},
1842	},
1843	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1844};
1845
1846/* l4_core -> dss_rfbi */
1847static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_rfbi = {
1848	.master		= &omap3xxx_l4_core_hwmod,
1849	.slave		= &omap3xxx_dss_rfbi_hwmod,
1850	.clk		= "dss_ick",
1851	.fw = {
1852		.omap2 = {
1853			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_RFBI_REGION,
1854			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1855			.flags	= OMAP_FIREWALL_L4,
1856		},
1857	},
1858	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1859};
1860
1861/* l4_core -> dss_venc */
1862static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = {
1863	.master		= &omap3xxx_l4_core_hwmod,
1864	.slave		= &omap3xxx_dss_venc_hwmod,
1865	.clk		= "dss_ick",
1866	.fw = {
1867		.omap2 = {
1868			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_VENC_REGION,
1869			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1870			.flags	= OMAP_FIREWALL_L4,
1871		},
1872	},
1873	.flags		= OCPIF_SWSUP_IDLE,
1874	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1875};
1876
1877/* l4_wkup -> gpio1 */
1878
1879static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__gpio1 = {
1880	.master		= &omap3xxx_l4_wkup_hwmod,
1881	.slave		= &omap3xxx_gpio1_hwmod,
1882	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1883};
1884
1885/* l4_per -> gpio2 */
1886
1887static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio2 = {
1888	.master		= &omap3xxx_l4_per_hwmod,
1889	.slave		= &omap3xxx_gpio2_hwmod,
1890	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1891};
1892
1893/* l4_per -> gpio3 */
1894
1895static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio3 = {
1896	.master		= &omap3xxx_l4_per_hwmod,
1897	.slave		= &omap3xxx_gpio3_hwmod,
1898	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1899};
1900
1901/*
1902 * 'mmu' class
1903 * The memory management unit performs virtual to physical address translation
1904 * for its requestors.
1905 */
1906
1907static struct omap_hwmod_class_sysconfig mmu_sysc = {
1908	.rev_offs	= 0x000,
1909	.sysc_offs	= 0x010,
1910	.syss_offs	= 0x014,
1911	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1912			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
1913	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1914	.sysc_fields	= &omap_hwmod_sysc_type1,
1915};
1916
1917static struct omap_hwmod_class omap3xxx_mmu_hwmod_class = {
1918	.name = "mmu",
1919	.sysc = &mmu_sysc,
1920};
1921
1922/* mmu isp */
1923static struct omap_hwmod omap3xxx_mmu_isp_hwmod;
1924
1925/* l4_core -> mmu isp */
1926static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmu_isp = {
1927	.master		= &omap3xxx_l4_core_hwmod,
1928	.slave		= &omap3xxx_mmu_isp_hwmod,
1929	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1930};
1931
1932static struct omap_hwmod omap3xxx_mmu_isp_hwmod = {
1933	.name		= "mmu_isp",
1934	.class		= &omap3xxx_mmu_hwmod_class,
1935	.main_clk	= "cam_ick",
1936	.flags		= HWMOD_NO_IDLEST,
1937};
1938
1939/* mmu iva */
1940
1941static struct omap_hwmod omap3xxx_mmu_iva_hwmod;
1942
1943static struct omap_hwmod_rst_info omap3xxx_mmu_iva_resets[] = {
1944	{ .name = "mmu", .rst_shift = 1, .st_shift = 9 },
1945};
1946
1947/* l3_main -> iva mmu */
1948static struct omap_hwmod_ocp_if omap3xxx_l3_main__mmu_iva = {
1949	.master		= &omap3xxx_l3_main_hwmod,
1950	.slave		= &omap3xxx_mmu_iva_hwmod,
1951	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1952};
1953
1954static struct omap_hwmod omap3xxx_mmu_iva_hwmod = {
1955	.name		= "mmu_iva",
1956	.class		= &omap3xxx_mmu_hwmod_class,
1957	.clkdm_name	= "iva2_clkdm",
1958	.rst_lines	= omap3xxx_mmu_iva_resets,
1959	.rst_lines_cnt	= ARRAY_SIZE(omap3xxx_mmu_iva_resets),
1960	.main_clk	= "iva2_ck",
1961	.prcm = {
1962		.omap2 = {
1963			.module_offs = OMAP3430_IVA2_MOD,
1964			.idlest_reg_id = 1,
1965			.idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT,
1966		},
1967	},
1968	.flags		= HWMOD_NO_IDLEST,
1969};
1970
1971/* l4_per -> gpio4 */
1972
1973static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio4 = {
1974	.master		= &omap3xxx_l4_per_hwmod,
1975	.slave		= &omap3xxx_gpio4_hwmod,
1976	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1977};
1978
1979/* l4_per -> gpio5 */
1980
1981static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio5 = {
1982	.master		= &omap3xxx_l4_per_hwmod,
1983	.slave		= &omap3xxx_gpio5_hwmod,
1984	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1985};
1986
1987/* l4_per -> gpio6 */
1988
1989static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = {
1990	.master		= &omap3xxx_l4_per_hwmod,
1991	.slave		= &omap3xxx_gpio6_hwmod,
1992	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1993};
1994
1995/* l4_core -> mcbsp1 */
1996static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp1 = {
1997	.master		= &omap3xxx_l4_core_hwmod,
1998	.slave		= &omap3xxx_mcbsp1_hwmod,
1999	.clk		= "mcbsp1_ick",
2000	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2001};
2002
2003
2004/* l4_per -> mcbsp2 */
2005static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2 = {
2006	.master		= &omap3xxx_l4_per_hwmod,
2007	.slave		= &omap3xxx_mcbsp2_hwmod,
2008	.clk		= "mcbsp2_ick",
2009	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2010};
2011
2012
2013/* l4_per -> mcbsp3 */
2014static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3 = {
2015	.master		= &omap3xxx_l4_per_hwmod,
2016	.slave		= &omap3xxx_mcbsp3_hwmod,
2017	.clk		= "mcbsp3_ick",
2018	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2019};
2020
2021
2022/* l4_per -> mcbsp4 */
2023static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp4 = {
2024	.master		= &omap3xxx_l4_per_hwmod,
2025	.slave		= &omap3xxx_mcbsp4_hwmod,
2026	.clk		= "mcbsp4_ick",
2027	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2028};
2029
2030
2031/* l4_core -> mcbsp5 */
2032static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp5 = {
2033	.master		= &omap3xxx_l4_core_hwmod,
2034	.slave		= &omap3xxx_mcbsp5_hwmod,
2035	.clk		= "mcbsp5_ick",
2036	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2037};
2038
2039
2040/* l4_per -> mcbsp2_sidetone */
2041static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2_sidetone = {
2042	.master		= &omap3xxx_l4_per_hwmod,
2043	.slave		= &omap3xxx_mcbsp2_sidetone_hwmod,
2044	.clk		= "mcbsp2_ick",
2045	.user		= OCP_USER_MPU,
2046};
2047
2048
2049/* l4_per -> mcbsp3_sidetone */
2050static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3_sidetone = {
2051	.master		= &omap3xxx_l4_per_hwmod,
2052	.slave		= &omap3xxx_mcbsp3_sidetone_hwmod,
2053	.clk		= "mcbsp3_ick",
2054	.user		= OCP_USER_MPU,
2055};
2056
2057/* l4_core -> mailbox */
2058static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = {
2059	.master		= &omap3xxx_l4_core_hwmod,
2060	.slave		= &omap3xxx_mailbox_hwmod,
2061	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2062};
2063
2064/* l4 core -> mcspi1 interface */
2065static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi1 = {
2066	.master		= &omap3xxx_l4_core_hwmod,
2067	.slave		= &omap34xx_mcspi1,
2068	.clk		= "mcspi1_ick",
2069	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2070};
2071
2072/* l4 core -> mcspi2 interface */
2073static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi2 = {
2074	.master		= &omap3xxx_l4_core_hwmod,
2075	.slave		= &omap34xx_mcspi2,
2076	.clk		= "mcspi2_ick",
2077	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2078};
2079
2080/* l4 core -> mcspi3 interface */
2081static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi3 = {
2082	.master		= &omap3xxx_l4_core_hwmod,
2083	.slave		= &omap34xx_mcspi3,
2084	.clk		= "mcspi3_ick",
2085	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2086};
2087
2088/* l4 core -> mcspi4 interface */
2089
2090static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi4 = {
2091	.master		= &omap3xxx_l4_core_hwmod,
2092	.slave		= &omap34xx_mcspi4,
2093	.clk		= "mcspi4_ick",
2094	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2095};
2096
2097static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = {
2098	.master		= &omap3xxx_usb_host_hs_hwmod,
2099	.slave		= &omap3xxx_l3_main_hwmod,
2100	.clk		= "core_l3_ick",
2101	.user		= OCP_USER_MPU,
2102};
2103
2104
2105static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_host_hs = {
2106	.master		= &omap3xxx_l4_core_hwmod,
2107	.slave		= &omap3xxx_usb_host_hs_hwmod,
2108	.clk		= "usbhost_ick",
2109	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2110};
2111
2112
2113static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = {
2114	.master		= &omap3xxx_l4_core_hwmod,
2115	.slave		= &omap3xxx_usb_tll_hs_hwmod,
2116	.clk		= "usbtll_ick",
2117	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2118};
2119
2120/* l4_core -> hdq1w interface */
2121static struct omap_hwmod_ocp_if omap3xxx_l4_core__hdq1w = {
2122	.master		= &omap3xxx_l4_core_hwmod,
2123	.slave		= &omap3xxx_hdq1w_hwmod,
2124	.clk		= "hdq_ick",
2125	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2126	.flags		= OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE,
2127};
2128
2129/* am35xx has Davinci MDIO & EMAC */
2130static struct omap_hwmod_class am35xx_mdio_class = {
2131	.name = "davinci_mdio",
2132};
2133
2134static struct omap_hwmod am35xx_mdio_hwmod = {
2135	.name		= "davinci_mdio",
2136	.class		= &am35xx_mdio_class,
2137	.flags		= HWMOD_NO_IDLEST,
2138};
2139
2140/*
2141 * XXX Should be connected to an IPSS hwmod, not the L3 directly;
2142 * but this will probably require some additional hwmod core support,
2143 * so is left as a future to-do item.
2144 */
2145static struct omap_hwmod_ocp_if am35xx_mdio__l3 = {
2146	.master		= &am35xx_mdio_hwmod,
2147	.slave		= &omap3xxx_l3_main_hwmod,
2148	.clk		= "emac_fck",
2149	.user		= OCP_USER_MPU,
2150};
2151
2152/* l4_core -> davinci mdio  */
2153/*
2154 * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly;
2155 * but this will probably require some additional hwmod core support,
2156 * so is left as a future to-do item.
2157 */
2158static struct omap_hwmod_ocp_if am35xx_l4_core__mdio = {
2159	.master		= &omap3xxx_l4_core_hwmod,
2160	.slave		= &am35xx_mdio_hwmod,
2161	.clk		= "emac_fck",
2162	.user		= OCP_USER_MPU,
2163};
2164
2165static struct omap_hwmod_class am35xx_emac_class = {
2166	.name = "davinci_emac",
2167};
2168
2169static struct omap_hwmod am35xx_emac_hwmod = {
2170	.name		= "davinci_emac",
2171	.class		= &am35xx_emac_class,
2172	/*
2173	 * According to Mark Greer, the MPU will not return from WFI
2174	 * when the EMAC signals an interrupt.
2175	 * https://lore.kernel.org/all/1336770778-23044-3-git-send-email-mgreer@animalcreek.com/
2176	 */
2177	.flags		= (HWMOD_NO_IDLEST | HWMOD_BLOCK_WFI),
2178};
2179
2180/* l3_core -> davinci emac interface */
2181/*
2182 * XXX Should be connected to an IPSS hwmod, not the L3 directly;
2183 * but this will probably require some additional hwmod core support,
2184 * so is left as a future to-do item.
2185 */
2186static struct omap_hwmod_ocp_if am35xx_emac__l3 = {
2187	.master		= &am35xx_emac_hwmod,
2188	.slave		= &omap3xxx_l3_main_hwmod,
2189	.clk		= "emac_ick",
2190	.user		= OCP_USER_MPU,
2191};
2192
2193/* l4_core -> davinci emac  */
2194/*
2195 * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly;
2196 * but this will probably require some additional hwmod core support,
2197 * so is left as a future to-do item.
2198 */
2199static struct omap_hwmod_ocp_if am35xx_l4_core__emac = {
2200	.master		= &omap3xxx_l4_core_hwmod,
2201	.slave		= &am35xx_emac_hwmod,
2202	.clk		= "emac_ick",
2203	.user		= OCP_USER_MPU,
2204};
2205
2206static struct omap_hwmod_ocp_if omap3xxx_l3_main__gpmc = {
2207	.master		= &omap3xxx_l3_main_hwmod,
2208	.slave		= &omap3xxx_gpmc_hwmod,
2209	.clk		= "core_l3_ick",
2210	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2211};
2212
2213/* l4_core -> SHAM2 (SHA1/MD5) (similar to omap24xx) */
2214static struct omap_hwmod_class_sysconfig omap3_sham_sysc = {
2215	.rev_offs	= 0x5c,
2216	.sysc_offs	= 0x60,
2217	.syss_offs	= 0x64,
2218	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
2219			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
2220	.sysc_fields	= &omap3_sham_sysc_fields,
2221};
2222
2223static struct omap_hwmod_class omap3xxx_sham_class = {
2224	.name	= "sham",
2225	.sysc	= &omap3_sham_sysc,
2226};
2227
2228
2229
2230static struct omap_hwmod omap3xxx_sham_hwmod = {
2231	.name		= "sham",
2232	.main_clk	= "sha12_ick",
2233	.prcm		= {
2234		.omap2 = {
2235			.module_offs = CORE_MOD,
2236			.idlest_reg_id = 1,
2237			.idlest_idle_bit = OMAP3430_ST_SHA12_SHIFT,
2238		},
2239	},
2240	.class		= &omap3xxx_sham_class,
2241};
2242
2243
2244static struct omap_hwmod_ocp_if omap3xxx_l4_core__sham = {
2245	.master		= &omap3xxx_l4_core_hwmod,
2246	.slave		= &omap3xxx_sham_hwmod,
2247	.clk		= "sha12_ick",
2248	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2249};
2250
2251/*
2252 * 'ssi' class
2253 * synchronous serial interface (multichannel and full-duplex serial if)
2254 */
2255
2256static struct omap_hwmod_class_sysconfig omap34xx_ssi_sysc = {
2257	.rev_offs	= 0x0000,
2258	.sysc_offs	= 0x0010,
2259	.syss_offs	= 0x0014,
2260	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_MIDLEMODE |
2261			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
2262	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
2263	.sysc_fields	= &omap_hwmod_sysc_type1,
2264};
2265
2266static struct omap_hwmod_class omap3xxx_ssi_hwmod_class = {
2267	.name	= "ssi",
2268	.sysc	= &omap34xx_ssi_sysc,
2269};
2270
2271static struct omap_hwmod omap3xxx_ssi_hwmod = {
2272	.name		= "ssi",
2273	.class		= &omap3xxx_ssi_hwmod_class,
2274	.clkdm_name	= "core_l4_clkdm",
2275	.main_clk	= "ssi_ssr_fck",
2276	.prcm		= {
2277		.omap2 = {
2278			.module_offs		= CORE_MOD,
2279			.idlest_reg_id		= 1,
2280			.idlest_idle_bit	= OMAP3430ES2_ST_SSI_IDLE_SHIFT,
2281		},
2282	},
2283};
2284
2285/* L4 CORE -> SSI */
2286static struct omap_hwmod_ocp_if omap3xxx_l4_core__ssi = {
2287	.master		= &omap3xxx_l4_core_hwmod,
2288	.slave		= &omap3xxx_ssi_hwmod,
2289	.clk		= "ssi_ick",
2290	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2291};
2292
2293static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
2294	&omap3xxx_l3_main__l4_core,
2295	&omap3xxx_l3_main__l4_per,
2296	&omap3xxx_mpu__l3_main,
2297	&omap3xxx_l3_main__l4_debugss,
2298	&omap3xxx_l4_core__l4_wkup,
2299	&omap3xxx_l4_core__mmc3,
2300	&omap3_l4_core__uart1,
2301	&omap3_l4_core__uart2,
2302	&omap3_l4_per__uart3,
2303	&omap3_l4_core__i2c1,
2304	&omap3_l4_core__i2c2,
2305	&omap3_l4_core__i2c3,
2306	&omap3xxx_l4_wkup__l4_sec,
2307	&omap3xxx_l4_per__timer3,
2308	&omap3xxx_l4_per__timer4,
2309	&omap3xxx_l4_per__timer5,
2310	&omap3xxx_l4_per__timer6,
2311	&omap3xxx_l4_per__timer7,
2312	&omap3xxx_l4_per__timer8,
2313	&omap3xxx_l4_per__timer9,
2314	&omap3xxx_l4_core__timer10,
2315	&omap3xxx_l4_core__timer11,
2316	&omap3xxx_l4_wkup__wd_timer2,
2317	&omap3xxx_l4_wkup__gpio1,
2318	&omap3xxx_l4_per__gpio2,
2319	&omap3xxx_l4_per__gpio3,
2320	&omap3xxx_l4_per__gpio4,
2321	&omap3xxx_l4_per__gpio5,
2322	&omap3xxx_l4_per__gpio6,
2323	&omap3xxx_l4_core__mcbsp1,
2324	&omap3xxx_l4_per__mcbsp2,
2325	&omap3xxx_l4_per__mcbsp3,
2326	&omap3xxx_l4_per__mcbsp4,
2327	&omap3xxx_l4_core__mcbsp5,
2328	&omap3xxx_l4_per__mcbsp2_sidetone,
2329	&omap3xxx_l4_per__mcbsp3_sidetone,
2330	&omap34xx_l4_core__mcspi1,
2331	&omap34xx_l4_core__mcspi2,
2332	&omap34xx_l4_core__mcspi3,
2333	&omap34xx_l4_core__mcspi4,
2334	&omap3xxx_l3_main__gpmc,
2335	NULL,
2336};
2337
2338/* crypto hwmod links */
2339static struct omap_hwmod_ocp_if *omap34xx_sham_hwmod_ocp_ifs[] __initdata = {
2340	&omap3xxx_l4_core__sham,
2341	NULL,
2342};
2343
2344static struct omap_hwmod_ocp_if *omap36xx_sham_hwmod_ocp_ifs[] __initdata = {
2345	&omap3xxx_l4_core__sham,
2346	NULL
2347};
2348
 
2349/*
2350 * Apparently the SHA/MD5 and AES accelerator IP blocks are
2351 * only present on some AM35xx chips, and no one knows which
2352 * ones.
2353 * See https://lore.kernel.org/all/20130108203853.GB1876@animalcreek.com/
2354 * So if you need these IP blocks on an AM35xx, try uncommenting
2355 * the following lines.
2356 */
2357static struct omap_hwmod_ocp_if *am35xx_sham_hwmod_ocp_ifs[] __initdata = {
2358	/* &omap3xxx_l4_core__sham, */
2359	NULL
2360};
2361
2362/* 3430ES1-only hwmod links */
2363static struct omap_hwmod_ocp_if *omap3430es1_hwmod_ocp_ifs[] __initdata = {
2364	&omap3430es1_dss__l3,
2365	&omap3430es1_l4_core__dss,
2366	NULL,
2367};
2368
2369/* 3430ES2+-only hwmod links */
2370static struct omap_hwmod_ocp_if *omap3430es2plus_hwmod_ocp_ifs[] __initdata = {
2371	&omap3xxx_dss__l3,
2372	&omap3xxx_l4_core__dss,
2373	&omap3xxx_usb_host_hs__l3_main_2,
2374	&omap3xxx_l4_core__usb_host_hs,
2375	&omap3xxx_l4_core__usb_tll_hs,
2376	NULL,
2377};
2378
2379/* <= 3430ES3-only hwmod links */
2380static struct omap_hwmod_ocp_if *omap3430_pre_es3_hwmod_ocp_ifs[] __initdata = {
2381	&omap3xxx_l4_core__pre_es3_mmc1,
2382	&omap3xxx_l4_core__pre_es3_mmc2,
2383	NULL,
2384};
2385
2386/* 3430ES3+-only hwmod links */
2387static struct omap_hwmod_ocp_if *omap3430_es3plus_hwmod_ocp_ifs[] __initdata = {
2388	&omap3xxx_l4_core__es3plus_mmc1,
2389	&omap3xxx_l4_core__es3plus_mmc2,
2390	NULL,
2391};
2392
2393/* 34xx-only hwmod links (all ES revisions) */
2394static struct omap_hwmod_ocp_if *omap34xx_hwmod_ocp_ifs[] __initdata = {
2395	&omap3xxx_l3__iva,
2396	&omap34xx_l4_core__sr1,
2397	&omap34xx_l4_core__sr2,
2398	&omap3xxx_l4_core__mailbox,
2399	&omap3xxx_l4_core__hdq1w,
2400	&omap3xxx_sad2d__l3,
2401	&omap3xxx_l4_core__mmu_isp,
2402	&omap3xxx_l3_main__mmu_iva,
2403	&omap3xxx_l4_core__ssi,
2404	NULL,
2405};
2406
2407/* 36xx-only hwmod links (all ES revisions) */
2408static struct omap_hwmod_ocp_if *omap36xx_hwmod_ocp_ifs[] __initdata = {
2409	&omap3xxx_l3__iva,
2410	&omap36xx_l4_per__uart4,
2411	&omap3xxx_dss__l3,
2412	&omap3xxx_l4_core__dss,
2413	&omap36xx_l4_core__sr1,
2414	&omap36xx_l4_core__sr2,
2415	&omap3xxx_l4_core__mailbox,
2416	&omap3xxx_usb_host_hs__l3_main_2,
2417	&omap3xxx_l4_core__usb_host_hs,
2418	&omap3xxx_l4_core__usb_tll_hs,
2419	&omap3xxx_l4_core__es3plus_mmc1,
2420	&omap3xxx_l4_core__es3plus_mmc2,
2421	&omap3xxx_l4_core__hdq1w,
2422	&omap3xxx_sad2d__l3,
2423	&omap3xxx_l4_core__mmu_isp,
2424	&omap3xxx_l3_main__mmu_iva,
2425	&omap3xxx_l4_core__ssi,
2426	NULL,
2427};
2428
2429static struct omap_hwmod_ocp_if *am35xx_hwmod_ocp_ifs[] __initdata = {
2430	&omap3xxx_dss__l3,
2431	&omap3xxx_l4_core__dss,
2432	&am35xx_l4_core__uart4,
2433	&omap3xxx_usb_host_hs__l3_main_2,
2434	&omap3xxx_l4_core__usb_host_hs,
2435	&omap3xxx_l4_core__usb_tll_hs,
2436	&omap3xxx_l4_core__es3plus_mmc1,
2437	&omap3xxx_l4_core__es3plus_mmc2,
2438	&omap3xxx_l4_core__hdq1w,
2439	&am35xx_mdio__l3,
2440	&am35xx_l4_core__mdio,
2441	&am35xx_emac__l3,
2442	&am35xx_l4_core__emac,
2443	NULL,
2444};
2445
2446static struct omap_hwmod_ocp_if *omap3xxx_dss_hwmod_ocp_ifs[] __initdata = {
2447	&omap3xxx_l4_core__dss_dispc,
2448	&omap3xxx_l4_core__dss_dsi1,
2449	&omap3xxx_l4_core__dss_rfbi,
2450	&omap3xxx_l4_core__dss_venc,
2451	NULL,
2452};
2453
2454/**
2455 * omap3xxx_hwmod_is_hs_ip_block_usable - is a security IP block accessible?
2456 * @bus: struct device_node * for the top-level OMAP DT data
2457 * @dev_name: device name used in the DT file
2458 *
2459 * Determine whether a "secure" IP block @dev_name is usable by Linux.
2460 * There doesn't appear to be a 100% reliable way to determine this,
2461 * so we rely on heuristics.  If @bus is null, meaning there's no DT
2462 * data, then we only assume the IP block is accessible if the OMAP is
2463 * fused as a 'general-purpose' SoC.  If however DT data is present,
2464 * test to see if the IP block is described in the DT data and set to
2465 * 'status = "okay"'.  If so then we assume the ODM has configured the
2466 * OMAP firewalls to allow access to the IP block.
2467 *
2468 * Return: 0 if device named @dev_name is not likely to be accessible,
2469 * or 1 if it is likely to be accessible.
2470 */
2471static bool __init omap3xxx_hwmod_is_hs_ip_block_usable(struct device_node *bus,
2472							const char *dev_name)
2473{
2474	struct device_node *node;
2475	bool available;
2476
2477	if (!bus)
2478		return omap_type() == OMAP2_DEVICE_TYPE_GP;
2479
2480	node = of_get_child_by_name(bus, dev_name);
2481	available = of_device_is_available(node);
2482	of_node_put(node);
2483
2484	return available;
2485}
2486
2487int __init omap3xxx_hwmod_init(void)
2488{
2489	int r;
2490	struct omap_hwmod_ocp_if **h = NULL, **h_sham = NULL;
2491	struct device_node *bus;
2492	unsigned int rev;
2493
2494	omap_hwmod_init();
2495
2496	/* Register hwmod links common to all OMAP3 */
2497	r = omap_hwmod_register_links(omap3xxx_hwmod_ocp_ifs);
2498	if (r < 0)
2499		return r;
2500
2501	rev = omap_rev();
2502
2503	/*
2504	 * Register hwmod links common to individual OMAP3 families, all
2505	 * silicon revisions (e.g., 34xx, or AM3505/3517, or 36xx)
2506	 * All possible revisions should be included in this conditional.
2507	 */
2508	if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 ||
2509	    rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 ||
2510	    rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) {
2511		h = omap34xx_hwmod_ocp_ifs;
2512		h_sham = omap34xx_sham_hwmod_ocp_ifs;
2513	} else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
2514		h = am35xx_hwmod_ocp_ifs;
2515		h_sham = am35xx_sham_hwmod_ocp_ifs;
2516	} else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 ||
2517		   rev == OMAP3630_REV_ES1_2) {
2518		h = omap36xx_hwmod_ocp_ifs;
2519		h_sham = omap36xx_sham_hwmod_ocp_ifs;
2520	} else {
2521		WARN(1, "OMAP3 hwmod family init: unknown chip type\n");
2522		return -EINVAL;
2523	}
2524
2525	r = omap_hwmod_register_links(h);
2526	if (r < 0)
2527		return r;
2528
2529	/*
2530	 * Register crypto hwmod links only if they are not disabled in DT.
2531	 * If DT information is missing, enable them only for GP devices.
2532	 */
2533
2534	bus = of_find_node_by_name(NULL, "ocp");
2535
2536	if (h_sham && omap3xxx_hwmod_is_hs_ip_block_usable(bus, "sham")) {
2537		r = omap_hwmod_register_links(h_sham);
2538		if (r < 0)
2539			goto put_node;
2540	}
2541
2542	of_node_put(bus);
2543
2544	/*
2545	 * Register hwmod links specific to certain ES levels of a
2546	 * particular family of silicon (e.g., 34xx ES1.0)
2547	 */
2548	h = NULL;
2549	if (rev == OMAP3430_REV_ES1_0) {
2550		h = omap3430es1_hwmod_ocp_ifs;
2551	} else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 ||
2552		   rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 ||
2553		   rev == OMAP3430_REV_ES3_1_2) {
2554		h = omap3430es2plus_hwmod_ocp_ifs;
2555	}
2556
2557	if (h) {
2558		r = omap_hwmod_register_links(h);
2559		if (r < 0)
2560			return r;
2561	}
2562
2563	h = NULL;
2564	if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 ||
2565	    rev == OMAP3430_REV_ES2_1) {
2566		h = omap3430_pre_es3_hwmod_ocp_ifs;
2567	} else if (rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 ||
2568		   rev == OMAP3430_REV_ES3_1_2) {
2569		h = omap3430_es3plus_hwmod_ocp_ifs;
2570	}
2571
2572	if (h)
2573		r = omap_hwmod_register_links(h);
2574	if (r < 0)
2575		return r;
2576
2577	/*
2578	 * DSS code presumes that dss_core hwmod is handled first,
2579	 * _before_ any other DSS related hwmods so register common
2580	 * DSS hwmod links last to ensure that dss_core is already
2581	 * registered.  Otherwise some change things may happen, for
2582	 * ex. if dispc is handled before dss_core and DSS is enabled
2583	 * in bootloader DISPC will be reset with outputs enabled
2584	 * which sometimes leads to unrecoverable L3 error.  XXX The
2585	 * long-term fix to this is to ensure hwmods are set up in
2586	 * dependency order in the hwmod core code.
2587	 */
2588	r = omap_hwmod_register_links(omap3xxx_dss_hwmod_ocp_ifs);
2589
2590	return r;
2591
2592put_node:
2593	of_node_put(bus);
2594	return r;
2595}
v6.2
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * omap_hwmod_3xxx_data.c - hardware modules present on the OMAP3xxx chips
   4 *
   5 * Copyright (C) 2009-2011 Nokia Corporation
   6 * Copyright (C) 2012 Texas Instruments, Inc.
   7 * Paul Walmsley
   8 *
   9 * The data in this file should be completely autogeneratable from
  10 * the TI hardware database or other technical documentation.
  11 *
  12 * XXX these should be marked initdata for multi-OMAP kernels
  13 */
  14
  15#include <linux/platform_data/i2c-omap.h>
  16#include <linux/power/smartreflex.h>
  17#include <linux/platform_data/hsmmc-omap.h>
  18
  19#include "l3_3xxx.h"
  20#include "l4_3xxx.h"
  21
  22#include "soc.h"
  23#include "omap_hwmod.h"
  24#include "omap_hwmod_common_data.h"
  25#include "prm-regbits-34xx.h"
  26#include "cm-regbits-34xx.h"
  27
  28#include "i2c.h"
  29#include "wd_timer.h"
  30#include "serial.h"
  31
  32/*
  33 * OMAP3xxx hardware module integration data
  34 *
  35 * All of the data in this section should be autogeneratable from the
  36 * TI hardware database or other technical documentation.  Data that
  37 * is driver-specific or driver-kernel integration-specific belongs
  38 * elsewhere.
  39 */
  40
  41#define AM35XX_IPSS_USBOTGSS_BASE      0x5C040000
  42
  43/*
  44 * IP blocks
  45 */
  46
  47/* L3 */
  48
  49static struct omap_hwmod omap3xxx_l3_main_hwmod = {
  50	.name		= "l3_main",
  51	.class		= &l3_hwmod_class,
  52	.flags		= HWMOD_NO_IDLEST,
  53};
  54
  55/* L4 CORE */
  56static struct omap_hwmod omap3xxx_l4_core_hwmod = {
  57	.name		= "l4_core",
  58	.class		= &l4_hwmod_class,
  59	.flags		= HWMOD_NO_IDLEST,
  60};
  61
  62/* L4 PER */
  63static struct omap_hwmod omap3xxx_l4_per_hwmod = {
  64	.name		= "l4_per",
  65	.class		= &l4_hwmod_class,
  66	.flags		= HWMOD_NO_IDLEST,
  67};
  68
  69/* L4 WKUP */
  70static struct omap_hwmod omap3xxx_l4_wkup_hwmod = {
  71	.name		= "l4_wkup",
  72	.class		= &l4_hwmod_class,
  73	.flags		= HWMOD_NO_IDLEST,
  74};
  75
  76/* L4 SEC */
  77static struct omap_hwmod omap3xxx_l4_sec_hwmod = {
  78	.name		= "l4_sec",
  79	.class		= &l4_hwmod_class,
  80	.flags		= HWMOD_NO_IDLEST,
  81};
  82
  83/* MPU */
  84
  85static struct omap_hwmod omap3xxx_mpu_hwmod = {
  86	.name		= "mpu",
  87	.class		= &mpu_hwmod_class,
  88	.main_clk	= "arm_fck",
  89};
  90
  91/* IVA2 (IVA2) */
  92static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = {
  93	{ .name = "logic", .rst_shift = 0, .st_shift = 8 },
  94	{ .name = "seq0", .rst_shift = 1, .st_shift = 9 },
  95	{ .name = "seq1", .rst_shift = 2, .st_shift = 10 },
  96};
  97
  98static struct omap_hwmod omap3xxx_iva_hwmod = {
  99	.name		= "iva",
 100	.class		= &iva_hwmod_class,
 101	.clkdm_name	= "iva2_clkdm",
 102	.rst_lines	= omap3xxx_iva_resets,
 103	.rst_lines_cnt	= ARRAY_SIZE(omap3xxx_iva_resets),
 104	.main_clk	= "iva2_ck",
 105	.prcm = {
 106		.omap2 = {
 107			.module_offs = OMAP3430_IVA2_MOD,
 108			.idlest_reg_id = 1,
 109			.idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT,
 110		},
 111	},
 112};
 113
 114/*
 115 * 'debugss' class
 116 * debug and emulation sub system
 117 */
 118
 119static struct omap_hwmod_class omap3xxx_debugss_hwmod_class = {
 120	.name	= "debugss",
 121};
 122
 123/* debugss */
 124static struct omap_hwmod omap3xxx_debugss_hwmod = {
 125	.name		= "debugss",
 126	.class		= &omap3xxx_debugss_hwmod_class,
 127	.clkdm_name	= "emu_clkdm",
 128	.main_clk	= "emu_src_ck",
 129	.flags		= HWMOD_NO_IDLEST,
 130};
 131
 132/* timer class */
 133static struct omap_hwmod_class_sysconfig omap3xxx_timer_sysc = {
 134	.rev_offs	= 0x0000,
 135	.sysc_offs	= 0x0010,
 136	.syss_offs	= 0x0014,
 137	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
 138			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
 139			   SYSC_HAS_EMUFREE | SYSC_HAS_AUTOIDLE |
 140			   SYSS_HAS_RESET_STATUS),
 141	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 142	.sysc_fields	= &omap_hwmod_sysc_type1,
 143};
 144
 145static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
 146	.name = "timer",
 147	.sysc = &omap3xxx_timer_sysc,
 148};
 149
 150/* timer3 */
 151static struct omap_hwmod omap3xxx_timer3_hwmod = {
 152	.name		= "timer3",
 153	.main_clk	= "gpt3_fck",
 154	.prcm		= {
 155		.omap2 = {
 156			.module_offs = OMAP3430_PER_MOD,
 157			.idlest_reg_id = 1,
 158			.idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT,
 159		},
 160	},
 161	.class		= &omap3xxx_timer_hwmod_class,
 162	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 163};
 164
 165/* timer4 */
 166static struct omap_hwmod omap3xxx_timer4_hwmod = {
 167	.name		= "timer4",
 168	.main_clk	= "gpt4_fck",
 169	.prcm		= {
 170		.omap2 = {
 171			.module_offs = OMAP3430_PER_MOD,
 172			.idlest_reg_id = 1,
 173			.idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,
 174		},
 175	},
 176	.class		= &omap3xxx_timer_hwmod_class,
 177	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 178};
 179
 180/* timer5 */
 181static struct omap_hwmod omap3xxx_timer5_hwmod = {
 182	.name		= "timer5",
 183	.main_clk	= "gpt5_fck",
 184	.prcm		= {
 185		.omap2 = {
 186			.module_offs = OMAP3430_PER_MOD,
 187			.idlest_reg_id = 1,
 188			.idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,
 189		},
 190	},
 191	.class		= &omap3xxx_timer_hwmod_class,
 192	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 193};
 194
 195/* timer6 */
 196static struct omap_hwmod omap3xxx_timer6_hwmod = {
 197	.name		= "timer6",
 198	.main_clk	= "gpt6_fck",
 199	.prcm		= {
 200		.omap2 = {
 201			.module_offs = OMAP3430_PER_MOD,
 202			.idlest_reg_id = 1,
 203			.idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,
 204		},
 205	},
 206	.class		= &omap3xxx_timer_hwmod_class,
 207	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 208};
 209
 210/* timer7 */
 211static struct omap_hwmod omap3xxx_timer7_hwmod = {
 212	.name		= "timer7",
 213	.main_clk	= "gpt7_fck",
 214	.prcm		= {
 215		.omap2 = {
 216			.module_offs = OMAP3430_PER_MOD,
 217			.idlest_reg_id = 1,
 218			.idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT,
 219		},
 220	},
 221	.class		= &omap3xxx_timer_hwmod_class,
 222	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 223};
 224
 225/* timer8 */
 226static struct omap_hwmod omap3xxx_timer8_hwmod = {
 227	.name		= "timer8",
 228	.main_clk	= "gpt8_fck",
 229	.prcm		= {
 230		.omap2 = {
 231			.module_offs = OMAP3430_PER_MOD,
 232			.idlest_reg_id = 1,
 233			.idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT,
 234		},
 235	},
 236	.class		= &omap3xxx_timer_hwmod_class,
 237	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 238};
 239
 240/* timer9 */
 241static struct omap_hwmod omap3xxx_timer9_hwmod = {
 242	.name		= "timer9",
 243	.main_clk	= "gpt9_fck",
 244	.prcm		= {
 245		.omap2 = {
 246			.module_offs = OMAP3430_PER_MOD,
 247			.idlest_reg_id = 1,
 248			.idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT,
 249		},
 250	},
 251	.class		= &omap3xxx_timer_hwmod_class,
 252	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 253};
 254
 255/* timer10 */
 256static struct omap_hwmod omap3xxx_timer10_hwmod = {
 257	.name		= "timer10",
 258	.main_clk	= "gpt10_fck",
 259	.prcm		= {
 260		.omap2 = {
 261			.module_offs = CORE_MOD,
 262			.idlest_reg_id = 1,
 263			.idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT,
 264		},
 265	},
 266	.class		= &omap3xxx_timer_hwmod_class,
 267	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 268};
 269
 270/* timer11 */
 271static struct omap_hwmod omap3xxx_timer11_hwmod = {
 272	.name		= "timer11",
 273	.main_clk	= "gpt11_fck",
 274	.prcm		= {
 275		.omap2 = {
 276			.module_offs = CORE_MOD,
 277			.idlest_reg_id = 1,
 278			.idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT,
 279		},
 280	},
 281	.class		= &omap3xxx_timer_hwmod_class,
 282	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 283};
 284
 285/*
 286 * 'wd_timer' class
 287 * 32-bit watchdog upward counter that generates a pulse on the reset pin on
 288 * overflow condition
 289 */
 290
 291static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = {
 292	.rev_offs	= 0x0000,
 293	.sysc_offs	= 0x0010,
 294	.syss_offs	= 0x0014,
 295	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE |
 296			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
 297			   SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
 298			   SYSS_HAS_RESET_STATUS),
 299	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 300	.sysc_fields    = &omap_hwmod_sysc_type1,
 301};
 302
 303/* I2C common */
 304static struct omap_hwmod_class_sysconfig i2c_sysc = {
 305	.rev_offs	= 0x00,
 306	.sysc_offs	= 0x20,
 307	.syss_offs	= 0x10,
 308	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
 309			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
 310			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
 311	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 312	.sysc_fields    = &omap_hwmod_sysc_type1,
 313};
 314
 315static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = {
 316	.name		= "wd_timer",
 317	.sysc		= &omap3xxx_wd_timer_sysc,
 318	.pre_shutdown	= &omap2_wd_timer_disable,
 319	.reset		= &omap2_wd_timer_reset,
 320};
 321
 322static struct omap_hwmod omap3xxx_wd_timer2_hwmod = {
 323	.name		= "wd_timer2",
 324	.class		= &omap3xxx_wd_timer_hwmod_class,
 325	.main_clk	= "wdt2_fck",
 326	.prcm		= {
 327		.omap2 = {
 328			.module_offs = WKUP_MOD,
 329			.idlest_reg_id = 1,
 330			.idlest_idle_bit = OMAP3430_ST_WDT2_SHIFT,
 331		},
 332	},
 333	/*
 334	 * XXX: Use software supervised mode, HW supervised smartidle seems to
 335	 * block CORE power domain idle transitions. Maybe a HW bug in wdt2?
 336	 */
 337	.flags		= HWMOD_SWSUP_SIDLE,
 338};
 339
 340/* UART1 */
 341static struct omap_hwmod omap3xxx_uart1_hwmod = {
 342	.name		= "uart1",
 343	.main_clk	= "uart1_fck",
 344	.flags		= DEBUG_TI81XXUART1_FLAGS | HWMOD_SWSUP_SIDLE,
 345	.prcm		= {
 346		.omap2 = {
 347			.module_offs = CORE_MOD,
 348			.idlest_reg_id = 1,
 349			.idlest_idle_bit = OMAP3430_EN_UART1_SHIFT,
 350		},
 351	},
 352	.class		= &omap2_uart_class,
 353};
 354
 355/* UART2 */
 356static struct omap_hwmod omap3xxx_uart2_hwmod = {
 357	.name		= "uart2",
 358	.main_clk	= "uart2_fck",
 359	.flags		= DEBUG_TI81XXUART2_FLAGS | HWMOD_SWSUP_SIDLE,
 360	.prcm		= {
 361		.omap2 = {
 362			.module_offs = CORE_MOD,
 363			.idlest_reg_id = 1,
 364			.idlest_idle_bit = OMAP3430_EN_UART2_SHIFT,
 365		},
 366	},
 367	.class		= &omap2_uart_class,
 368};
 369
 370/* UART3 */
 371static struct omap_hwmod omap3xxx_uart3_hwmod = {
 372	.name		= "uart3",
 373	.main_clk	= "uart3_fck",
 374	.flags		= DEBUG_OMAP3UART3_FLAGS | DEBUG_TI81XXUART3_FLAGS |
 375				HWMOD_SWSUP_SIDLE,
 376	.prcm		= {
 377		.omap2 = {
 378			.module_offs = OMAP3430_PER_MOD,
 379			.idlest_reg_id = 1,
 380			.idlest_idle_bit = OMAP3430_EN_UART3_SHIFT,
 381		},
 382	},
 383	.class		= &omap2_uart_class,
 384};
 385
 386/* UART4 */
 387
 388
 389static struct omap_hwmod omap36xx_uart4_hwmod = {
 390	.name		= "uart4",
 391	.main_clk	= "uart4_fck",
 392	.flags		= DEBUG_OMAP3UART4_FLAGS | HWMOD_SWSUP_SIDLE,
 393	.prcm		= {
 394		.omap2 = {
 395			.module_offs = OMAP3430_PER_MOD,
 396			.idlest_reg_id = 1,
 397			.idlest_idle_bit = OMAP3630_EN_UART4_SHIFT,
 398		},
 399	},
 400	.class		= &omap2_uart_class,
 401};
 402
 403
 404
 405/*
 406 * XXX AM35xx UART4 cannot complete its softreset without uart1_fck or
 407 * uart2_fck being enabled.  So we add uart1_fck as an optional clock,
 408 * below, and set the HWMOD_CONTROL_OPT_CLKS_IN_RESET.  This really
 409 * should not be needed.  The functional clock structure of the AM35xx
 410 * UART4 is extremely unclear and opaque; it is unclear what the role
 411 * of uart1/2_fck is for the UART4.  Any clarification from either
 412 * empirical testing or the AM3505/3517 hardware designers would be
 413 * most welcome.
 414 */
 415static struct omap_hwmod_opt_clk am35xx_uart4_opt_clks[] = {
 416	{ .role = "softreset_uart1_fck", .clk = "uart1_fck" },
 417};
 418
 419static struct omap_hwmod am35xx_uart4_hwmod = {
 420	.name		= "uart4",
 421	.main_clk	= "uart4_fck",
 422	.prcm		= {
 423		.omap2 = {
 424			.module_offs = CORE_MOD,
 425			.idlest_reg_id = 1,
 426			.idlest_idle_bit = AM35XX_ST_UART4_SHIFT,
 427		},
 428	},
 429	.opt_clks	= am35xx_uart4_opt_clks,
 430	.opt_clks_cnt	= ARRAY_SIZE(am35xx_uart4_opt_clks),
 431	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 432	.class		= &omap2_uart_class,
 433};
 434
 435static struct omap_hwmod_class i2c_class = {
 436	.name	= "i2c",
 437	.sysc	= &i2c_sysc,
 438	.reset	= &omap_i2c_reset,
 439};
 440
 441/* dss */
 442static struct omap_hwmod_opt_clk dss_opt_clks[] = {
 443	/*
 444	 * The DSS HW needs all DSS clocks enabled during reset. The dss_core
 445	 * driver does not use these clocks.
 446	 */
 447	{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
 448	{ .role = "tv_clk", .clk = "dss_tv_fck" },
 449	/* required only on OMAP3430 */
 450	{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
 451};
 452
 453static struct omap_hwmod omap3430es1_dss_core_hwmod = {
 454	.name		= "dss_core",
 455	.class		= &omap2_dss_hwmod_class,
 456	.main_clk	= "dss1_alwon_fck", /* instead of dss_fck */
 457	.prcm		= {
 458		.omap2 = {
 459			.module_offs = OMAP3430_DSS_MOD,
 460			.idlest_reg_id = 1,
 461		},
 462	},
 463	.opt_clks	= dss_opt_clks,
 464	.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
 465	.flags		= HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 466};
 467
 468static struct omap_hwmod omap3xxx_dss_core_hwmod = {
 469	.name		= "dss_core",
 470	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 471	.class		= &omap2_dss_hwmod_class,
 472	.main_clk	= "dss1_alwon_fck", /* instead of dss_fck */
 473	.prcm		= {
 474		.omap2 = {
 475			.module_offs = OMAP3430_DSS_MOD,
 476			.idlest_reg_id = 1,
 477			.idlest_idle_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT,
 478		},
 479	},
 480	.opt_clks	= dss_opt_clks,
 481	.opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
 482};
 483
 484/*
 485 * 'dispc' class
 486 * display controller
 487 */
 488
 489static struct omap_hwmod_class_sysconfig omap3_dispc_sysc = {
 490	.rev_offs	= 0x0000,
 491	.sysc_offs	= 0x0010,
 492	.syss_offs	= 0x0014,
 493	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
 494			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
 495			   SYSC_HAS_ENAWAKEUP),
 496	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
 497			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
 498	.sysc_fields	= &omap_hwmod_sysc_type1,
 499};
 500
 501static struct omap_hwmod_class omap3_dispc_hwmod_class = {
 502	.name	= "dispc",
 503	.sysc	= &omap3_dispc_sysc,
 504};
 505
 506static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {
 507	.name		= "dss_dispc",
 508	.class		= &omap3_dispc_hwmod_class,
 509	.main_clk	= "dss1_alwon_fck",
 510	.prcm		= {
 511		.omap2 = {
 512			.module_offs = OMAP3430_DSS_MOD,
 513		},
 514	},
 515	.flags		= HWMOD_NO_IDLEST,
 516	.dev_attr	= &omap2_3_dss_dispc_dev_attr,
 517};
 518
 519/*
 520 * 'dsi' class
 521 * display serial interface controller
 522 */
 523
 524static struct omap_hwmod_class_sysconfig omap3xxx_dsi_sysc = {
 525	.rev_offs	= 0x0000,
 526	.sysc_offs	= 0x0010,
 527	.syss_offs	= 0x0014,
 528	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
 529			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
 530			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
 531	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 532	.sysc_fields	= &omap_hwmod_sysc_type1,
 533};
 534
 535static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = {
 536	.name = "dsi",
 537	.sysc	= &omap3xxx_dsi_sysc,
 538};
 539
 540/* dss_dsi1 */
 541static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = {
 542	{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
 543};
 544
 545static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = {
 546	.name		= "dss_dsi1",
 547	.class		= &omap3xxx_dsi_hwmod_class,
 548	.main_clk	= "dss1_alwon_fck",
 549	.prcm		= {
 550		.omap2 = {
 551			.module_offs = OMAP3430_DSS_MOD,
 552		},
 553	},
 554	.opt_clks	= dss_dsi1_opt_clks,
 555	.opt_clks_cnt	= ARRAY_SIZE(dss_dsi1_opt_clks),
 556	.flags		= HWMOD_NO_IDLEST,
 557};
 558
 559static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
 560	{ .role = "ick", .clk = "dss_ick" },
 561};
 562
 563static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = {
 564	.name		= "dss_rfbi",
 565	.class		= &omap2_rfbi_hwmod_class,
 566	.main_clk	= "dss1_alwon_fck",
 567	.prcm		= {
 568		.omap2 = {
 569			.module_offs = OMAP3430_DSS_MOD,
 570		},
 571	},
 572	.opt_clks	= dss_rfbi_opt_clks,
 573	.opt_clks_cnt	= ARRAY_SIZE(dss_rfbi_opt_clks),
 574	.flags		= HWMOD_NO_IDLEST,
 575};
 576
 577static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = {
 578	/* required only on OMAP3430 */
 579	{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
 580};
 581
 582static struct omap_hwmod omap3xxx_dss_venc_hwmod = {
 583	.name		= "dss_venc",
 584	.class		= &omap2_venc_hwmod_class,
 585	.main_clk	= "dss_tv_fck",
 586	.prcm		= {
 587		.omap2 = {
 588			.module_offs = OMAP3430_DSS_MOD,
 589		},
 590	},
 591	.opt_clks	= dss_venc_opt_clks,
 592	.opt_clks_cnt	= ARRAY_SIZE(dss_venc_opt_clks),
 593	.flags		= HWMOD_NO_IDLEST,
 594};
 595
 596/* I2C1 */
 597static struct omap_hwmod omap3xxx_i2c1_hwmod = {
 598	.name		= "i2c1",
 599	.flags		= HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
 600	.main_clk	= "i2c1_fck",
 601	.prcm		= {
 602		.omap2 = {
 603			.module_offs = CORE_MOD,
 604			.idlest_reg_id = 1,
 605			.idlest_idle_bit = OMAP3430_ST_I2C1_SHIFT,
 606		},
 607	},
 608	.class		= &i2c_class,
 609};
 610
 611/* I2C2 */
 612static struct omap_hwmod omap3xxx_i2c2_hwmod = {
 613	.name		= "i2c2",
 614	.flags		= HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
 615	.main_clk	= "i2c2_fck",
 616	.prcm		= {
 617		.omap2 = {
 618			.module_offs = CORE_MOD,
 619			.idlest_reg_id = 1,
 620			.idlest_idle_bit = OMAP3430_ST_I2C2_SHIFT,
 621		},
 622	},
 623	.class		= &i2c_class,
 624};
 625
 626/* I2C3 */
 627static struct omap_hwmod omap3xxx_i2c3_hwmod = {
 628	.name		= "i2c3",
 629	.flags		= HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
 630	.main_clk	= "i2c3_fck",
 631	.prcm		= {
 632		.omap2 = {
 633			.module_offs = CORE_MOD,
 634			.idlest_reg_id = 1,
 635			.idlest_idle_bit = OMAP3430_ST_I2C3_SHIFT,
 636		},
 637	},
 638	.class		= &i2c_class,
 639};
 640
 641/*
 642 * 'gpio' class
 643 * general purpose io module
 644 */
 645
 646static struct omap_hwmod_class_sysconfig omap3xxx_gpio_sysc = {
 647	.rev_offs	= 0x0000,
 648	.sysc_offs	= 0x0010,
 649	.syss_offs	= 0x0014,
 650	.sysc_flags	= (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
 651			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
 652			   SYSS_HAS_RESET_STATUS),
 653	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 654	.sysc_fields    = &omap_hwmod_sysc_type1,
 655};
 656
 657static struct omap_hwmod_class omap3xxx_gpio_hwmod_class = {
 658	.name = "gpio",
 659	.sysc = &omap3xxx_gpio_sysc,
 660};
 661
 662/* gpio1 */
 663static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
 664	{ .role = "dbclk", .clk = "gpio1_dbck", },
 665};
 666
 667static struct omap_hwmod omap3xxx_gpio1_hwmod = {
 668	.name		= "gpio1",
 669	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 670	.main_clk	= "gpio1_ick",
 671	.opt_clks	= gpio1_opt_clks,
 672	.opt_clks_cnt	= ARRAY_SIZE(gpio1_opt_clks),
 673	.prcm		= {
 674		.omap2 = {
 675			.module_offs = WKUP_MOD,
 676			.idlest_reg_id = 1,
 677			.idlest_idle_bit = OMAP3430_ST_GPIO1_SHIFT,
 678		},
 679	},
 680	.class		= &omap3xxx_gpio_hwmod_class,
 681};
 682
 683/* gpio2 */
 684static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
 685	{ .role = "dbclk", .clk = "gpio2_dbck", },
 686};
 687
 688static struct omap_hwmod omap3xxx_gpio2_hwmod = {
 689	.name		= "gpio2",
 690	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 691	.main_clk	= "gpio2_ick",
 692	.opt_clks	= gpio2_opt_clks,
 693	.opt_clks_cnt	= ARRAY_SIZE(gpio2_opt_clks),
 694	.prcm		= {
 695		.omap2 = {
 696			.module_offs = OMAP3430_PER_MOD,
 697			.idlest_reg_id = 1,
 698			.idlest_idle_bit = OMAP3430_ST_GPIO2_SHIFT,
 699		},
 700	},
 701	.class		= &omap3xxx_gpio_hwmod_class,
 702};
 703
 704/* gpio3 */
 705static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
 706	{ .role = "dbclk", .clk = "gpio3_dbck", },
 707};
 708
 709static struct omap_hwmod omap3xxx_gpio3_hwmod = {
 710	.name		= "gpio3",
 711	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 712	.main_clk	= "gpio3_ick",
 713	.opt_clks	= gpio3_opt_clks,
 714	.opt_clks_cnt	= ARRAY_SIZE(gpio3_opt_clks),
 715	.prcm		= {
 716		.omap2 = {
 717			.module_offs = OMAP3430_PER_MOD,
 718			.idlest_reg_id = 1,
 719			.idlest_idle_bit = OMAP3430_ST_GPIO3_SHIFT,
 720		},
 721	},
 722	.class		= &omap3xxx_gpio_hwmod_class,
 723};
 724
 725/* gpio4 */
 726static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
 727	{ .role = "dbclk", .clk = "gpio4_dbck", },
 728};
 729
 730static struct omap_hwmod omap3xxx_gpio4_hwmod = {
 731	.name		= "gpio4",
 732	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 733	.main_clk	= "gpio4_ick",
 734	.opt_clks	= gpio4_opt_clks,
 735	.opt_clks_cnt	= ARRAY_SIZE(gpio4_opt_clks),
 736	.prcm		= {
 737		.omap2 = {
 738			.module_offs = OMAP3430_PER_MOD,
 739			.idlest_reg_id = 1,
 740			.idlest_idle_bit = OMAP3430_ST_GPIO4_SHIFT,
 741		},
 742	},
 743	.class		= &omap3xxx_gpio_hwmod_class,
 744};
 745
 746/* gpio5 */
 747
 748static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
 749	{ .role = "dbclk", .clk = "gpio5_dbck", },
 750};
 751
 752static struct omap_hwmod omap3xxx_gpio5_hwmod = {
 753	.name		= "gpio5",
 754	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 755	.main_clk	= "gpio5_ick",
 756	.opt_clks	= gpio5_opt_clks,
 757	.opt_clks_cnt	= ARRAY_SIZE(gpio5_opt_clks),
 758	.prcm		= {
 759		.omap2 = {
 760			.module_offs = OMAP3430_PER_MOD,
 761			.idlest_reg_id = 1,
 762			.idlest_idle_bit = OMAP3430_ST_GPIO5_SHIFT,
 763		},
 764	},
 765	.class		= &omap3xxx_gpio_hwmod_class,
 766};
 767
 768/* gpio6 */
 769
 770static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
 771	{ .role = "dbclk", .clk = "gpio6_dbck", },
 772};
 773
 774static struct omap_hwmod omap3xxx_gpio6_hwmod = {
 775	.name		= "gpio6",
 776	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,
 777	.main_clk	= "gpio6_ick",
 778	.opt_clks	= gpio6_opt_clks,
 779	.opt_clks_cnt	= ARRAY_SIZE(gpio6_opt_clks),
 780	.prcm		= {
 781		.omap2 = {
 782			.module_offs = OMAP3430_PER_MOD,
 783			.idlest_reg_id = 1,
 784			.idlest_idle_bit = OMAP3430_ST_GPIO6_SHIFT,
 785		},
 786	},
 787	.class		= &omap3xxx_gpio_hwmod_class,
 788};
 789
 790/*
 791 * 'mcbsp' class
 792 * multi channel buffered serial port controller
 793 */
 794
 795static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sysc = {
 796	.rev_offs	= -ENODEV,
 797	.sysc_offs	= 0x008c,
 798	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP |
 799			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
 800	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 801	.sysc_fields	= &omap_hwmod_sysc_type1,
 802};
 803
 804static struct omap_hwmod_class omap3xxx_mcbsp_hwmod_class = {
 805	.name = "mcbsp",
 806	.sysc = &omap3xxx_mcbsp_sysc,
 807};
 808
 809/* McBSP functional clock mapping */
 810static struct omap_hwmod_opt_clk mcbsp15_opt_clks[] = {
 811	{ .role = "pad_fck", .clk = "mcbsp_clks" },
 812	{ .role = "prcm_fck", .clk = "core_96m_fck" },
 813};
 814
 815static struct omap_hwmod_opt_clk mcbsp234_opt_clks[] = {
 816	{ .role = "pad_fck", .clk = "mcbsp_clks" },
 817	{ .role = "prcm_fck", .clk = "per_96m_fck" },
 818};
 819
 820/* mcbsp1 */
 821static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {
 822	.name		= "mcbsp1",
 823	.class		= &omap3xxx_mcbsp_hwmod_class,
 824	.main_clk	= "mcbsp1_fck",
 825	.prcm		= {
 826		.omap2 = {
 827			.module_offs = CORE_MOD,
 828			.idlest_reg_id = 1,
 829			.idlest_idle_bit = OMAP3430_ST_MCBSP1_SHIFT,
 830		},
 831	},
 832	.opt_clks	= mcbsp15_opt_clks,
 833	.opt_clks_cnt	= ARRAY_SIZE(mcbsp15_opt_clks),
 834};
 835
 836/* mcbsp2 */
 837static struct omap_hwmod omap3xxx_mcbsp2_hwmod = {
 838	.name		= "mcbsp2",
 839	.class		= &omap3xxx_mcbsp_hwmod_class,
 840	.main_clk	= "mcbsp2_fck",
 841	.prcm		= {
 842		.omap2 = {
 843			.module_offs = OMAP3430_PER_MOD,
 844			.idlest_reg_id = 1,
 845			.idlest_idle_bit = OMAP3430_ST_MCBSP2_SHIFT,
 846		},
 847	},
 848	.opt_clks	= mcbsp234_opt_clks,
 849	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),
 850};
 851
 852/* mcbsp3 */
 853static struct omap_hwmod omap3xxx_mcbsp3_hwmod = {
 854	.name		= "mcbsp3",
 855	.class		= &omap3xxx_mcbsp_hwmod_class,
 856	.main_clk	= "mcbsp3_fck",
 857	.prcm		= {
 858		.omap2 = {
 859			.module_offs = OMAP3430_PER_MOD,
 860			.idlest_reg_id = 1,
 861			.idlest_idle_bit = OMAP3430_ST_MCBSP3_SHIFT,
 862		},
 863	},
 864	.opt_clks	= mcbsp234_opt_clks,
 865	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),
 866};
 867
 868/* mcbsp4 */
 869static struct omap_hwmod omap3xxx_mcbsp4_hwmod = {
 870	.name		= "mcbsp4",
 871	.class		= &omap3xxx_mcbsp_hwmod_class,
 872	.main_clk	= "mcbsp4_fck",
 873	.prcm		= {
 874		.omap2 = {
 875			.module_offs = OMAP3430_PER_MOD,
 876			.idlest_reg_id = 1,
 877			.idlest_idle_bit = OMAP3430_ST_MCBSP4_SHIFT,
 878		},
 879	},
 880	.opt_clks	= mcbsp234_opt_clks,
 881	.opt_clks_cnt	= ARRAY_SIZE(mcbsp234_opt_clks),
 882};
 883
 884/* mcbsp5 */
 885static struct omap_hwmod omap3xxx_mcbsp5_hwmod = {
 886	.name		= "mcbsp5",
 887	.class		= &omap3xxx_mcbsp_hwmod_class,
 888	.main_clk	= "mcbsp5_fck",
 889	.prcm		= {
 890		.omap2 = {
 891			.module_offs = CORE_MOD,
 892			.idlest_reg_id = 1,
 893			.idlest_idle_bit = OMAP3430_ST_MCBSP5_SHIFT,
 894		},
 895	},
 896	.opt_clks	= mcbsp15_opt_clks,
 897	.opt_clks_cnt	= ARRAY_SIZE(mcbsp15_opt_clks),
 898};
 899
 900/* 'mcbsp sidetone' class */
 901static struct omap_hwmod_class_sysconfig omap3xxx_mcbsp_sidetone_sysc = {
 902	.rev_offs	= -ENODEV,
 903	.sysc_offs	= 0x0010,
 904	.sysc_flags	= SYSC_HAS_AUTOIDLE,
 905	.sysc_fields	= &omap_hwmod_sysc_type1,
 906};
 907
 908static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = {
 909	.name = "mcbsp_sidetone",
 910	.sysc = &omap3xxx_mcbsp_sidetone_sysc,
 911};
 912
 913/* mcbsp2_sidetone */
 914static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = {
 915	.name		= "mcbsp2_sidetone",
 916	.class		= &omap3xxx_mcbsp_sidetone_hwmod_class,
 917	.main_clk	= "mcbsp2_ick",
 918	.flags		= HWMOD_NO_IDLEST,
 919};
 920
 921/* mcbsp3_sidetone */
 922static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = {
 923	.name		= "mcbsp3_sidetone",
 924	.class		= &omap3xxx_mcbsp_sidetone_hwmod_class,
 925	.main_clk	= "mcbsp3_ick",
 926	.flags		= HWMOD_NO_IDLEST,
 927};
 928
 929/* SR common */
 930static struct omap_hwmod_class_sysconfig omap34xx_sr_sysc = {
 931	.rev_offs	= -ENODEV,
 932	.sysc_offs	= 0x24,
 933	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_NO_CACHE),
 934	.sysc_fields	= &omap34xx_sr_sysc_fields,
 935};
 936
 937static struct omap_hwmod_class omap34xx_smartreflex_hwmod_class = {
 938	.name = "smartreflex",
 939	.sysc = &omap34xx_sr_sysc,
 940};
 941
 942static struct omap_hwmod_class_sysconfig omap36xx_sr_sysc = {
 943	.rev_offs	= -ENODEV,
 944	.sysc_offs	= 0x38,
 945	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
 946	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
 947			SYSC_NO_CACHE),
 948	.sysc_fields	= &omap36xx_sr_sysc_fields,
 949};
 950
 951static struct omap_hwmod_class omap36xx_smartreflex_hwmod_class = {
 952	.name = "smartreflex",
 953	.sysc = &omap36xx_sr_sysc,
 954};
 955
 956/* SR1 */
 957static struct omap_smartreflex_dev_attr sr1_dev_attr = {
 958	.sensor_voltdm_name   = "mpu_iva",
 959};
 960
 961
 962static struct omap_hwmod omap34xx_sr1_hwmod = {
 963	.name		= "smartreflex_mpu_iva",
 964	.class		= &omap34xx_smartreflex_hwmod_class,
 965	.main_clk	= "sr1_fck",
 966	.prcm		= {
 967		.omap2 = {
 968			.module_offs = WKUP_MOD,
 969			.idlest_reg_id = 1,
 970			.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
 971		},
 972	},
 973	.dev_attr	= &sr1_dev_attr,
 974	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
 975};
 976
 977static struct omap_hwmod omap36xx_sr1_hwmod = {
 978	.name		= "smartreflex_mpu_iva",
 979	.class		= &omap36xx_smartreflex_hwmod_class,
 980	.main_clk	= "sr1_fck",
 981	.prcm		= {
 982		.omap2 = {
 983			.module_offs = WKUP_MOD,
 984			.idlest_reg_id = 1,
 985			.idlest_idle_bit = OMAP3430_EN_SR1_SHIFT,
 986		},
 987	},
 988	.dev_attr	= &sr1_dev_attr,
 989};
 990
 991/* SR2 */
 992static struct omap_smartreflex_dev_attr sr2_dev_attr = {
 993	.sensor_voltdm_name	= "core",
 994};
 995
 996
 997static struct omap_hwmod omap34xx_sr2_hwmod = {
 998	.name		= "smartreflex_core",
 999	.class		= &omap34xx_smartreflex_hwmod_class,
1000	.main_clk	= "sr2_fck",
1001	.prcm		= {
1002		.omap2 = {
1003			.module_offs = WKUP_MOD,
1004			.idlest_reg_id = 1,
1005			.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
1006		},
1007	},
1008	.dev_attr	= &sr2_dev_attr,
1009	.flags		= HWMOD_SET_DEFAULT_CLOCKACT,
1010};
1011
1012static struct omap_hwmod omap36xx_sr2_hwmod = {
1013	.name		= "smartreflex_core",
1014	.class		= &omap36xx_smartreflex_hwmod_class,
1015	.main_clk	= "sr2_fck",
1016	.prcm		= {
1017		.omap2 = {
1018			.module_offs = WKUP_MOD,
1019			.idlest_reg_id = 1,
1020			.idlest_idle_bit = OMAP3430_EN_SR2_SHIFT,
1021		},
1022	},
1023	.dev_attr	= &sr2_dev_attr,
1024};
1025
1026/*
1027 * 'mailbox' class
1028 * mailbox module allowing communication between the on-chip processors
1029 * using a queued mailbox-interrupt mechanism.
1030 */
1031
1032static struct omap_hwmod_class_sysconfig omap3xxx_mailbox_sysc = {
1033	.rev_offs	= 0x000,
1034	.sysc_offs	= 0x010,
1035	.syss_offs	= 0x014,
1036	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1037				SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
1038	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1039	.sysc_fields	= &omap_hwmod_sysc_type1,
1040};
1041
1042static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
1043	.name = "mailbox",
1044	.sysc = &omap3xxx_mailbox_sysc,
1045};
1046
1047static struct omap_hwmod omap3xxx_mailbox_hwmod = {
1048	.name		= "mailbox",
1049	.class		= &omap3xxx_mailbox_hwmod_class,
1050	.main_clk	= "mailboxes_ick",
1051	.prcm		= {
1052		.omap2 = {
1053			.module_offs = CORE_MOD,
1054			.idlest_reg_id = 1,
1055			.idlest_idle_bit = OMAP3430_ST_MAILBOXES_SHIFT,
1056		},
1057	},
1058};
1059
1060/*
1061 * 'mcspi' class
1062 * multichannel serial port interface (mcspi) / master/slave synchronous serial
1063 * bus
1064 */
1065
1066static struct omap_hwmod_class_sysconfig omap34xx_mcspi_sysc = {
1067	.rev_offs	= 0x0000,
1068	.sysc_offs	= 0x0010,
1069	.syss_offs	= 0x0014,
1070	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1071				SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1072				SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
1073	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1074	.sysc_fields    = &omap_hwmod_sysc_type1,
1075};
1076
1077static struct omap_hwmod_class omap34xx_mcspi_class = {
1078	.name = "mcspi",
1079	.sysc = &omap34xx_mcspi_sysc,
1080};
1081
1082/* mcspi1 */
1083static struct omap_hwmod omap34xx_mcspi1 = {
1084	.name		= "mcspi1",
1085	.main_clk	= "mcspi1_fck",
1086	.prcm		= {
1087		.omap2 = {
1088			.module_offs = CORE_MOD,
1089			.idlest_reg_id = 1,
1090			.idlest_idle_bit = OMAP3430_ST_MCSPI1_SHIFT,
1091		},
1092	},
1093	.class		= &omap34xx_mcspi_class,
1094};
1095
1096/* mcspi2 */
1097static struct omap_hwmod omap34xx_mcspi2 = {
1098	.name		= "mcspi2",
1099	.main_clk	= "mcspi2_fck",
1100	.prcm		= {
1101		.omap2 = {
1102			.module_offs = CORE_MOD,
1103			.idlest_reg_id = 1,
1104			.idlest_idle_bit = OMAP3430_ST_MCSPI2_SHIFT,
1105		},
1106	},
1107	.class		= &omap34xx_mcspi_class,
1108};
1109
1110/* mcspi3 */
1111static struct omap_hwmod omap34xx_mcspi3 = {
1112	.name		= "mcspi3",
1113	.main_clk	= "mcspi3_fck",
1114	.prcm		= {
1115		.omap2 = {
1116			.module_offs = CORE_MOD,
1117			.idlest_reg_id = 1,
1118			.idlest_idle_bit = OMAP3430_ST_MCSPI3_SHIFT,
1119		},
1120	},
1121	.class		= &omap34xx_mcspi_class,
1122};
1123
1124/* mcspi4 */
1125static struct omap_hwmod omap34xx_mcspi4 = {
1126	.name		= "mcspi4",
1127	.main_clk	= "mcspi4_fck",
1128	.prcm		= {
1129		.omap2 = {
1130			.module_offs = CORE_MOD,
1131			.idlest_reg_id = 1,
1132			.idlest_idle_bit = OMAP3430_ST_MCSPI4_SHIFT,
1133		},
1134	},
1135	.class		= &omap34xx_mcspi_class,
1136};
1137
1138/* MMC/SD/SDIO common */
1139static struct omap_hwmod_class_sysconfig omap34xx_mmc_sysc = {
1140	.rev_offs	= 0x1fc,
1141	.sysc_offs	= 0x10,
1142	.syss_offs	= 0x14,
1143	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1144			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1145			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
1146	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1147	.sysc_fields    = &omap_hwmod_sysc_type1,
1148};
1149
1150static struct omap_hwmod_class omap34xx_mmc_class = {
1151	.name = "mmc",
1152	.sysc = &omap34xx_mmc_sysc,
1153};
1154
1155/* MMC/SD/SDIO1 */
1156
1157
1158
1159static struct omap_hwmod_opt_clk omap34xx_mmc1_opt_clks[] = {
1160	{ .role = "dbck", .clk = "omap_32k_fck", },
1161};
1162
1163static struct omap_hsmmc_dev_attr mmc1_dev_attr = {
1164	.flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
1165};
1166
1167/* See 35xx errata 2.1.1.128 in SPRZ278F */
1168static struct omap_hsmmc_dev_attr mmc1_pre_es3_dev_attr = {
1169	.flags = (OMAP_HSMMC_SUPPORTS_DUAL_VOLT |
1170		  OMAP_HSMMC_BROKEN_MULTIBLOCK_READ),
1171};
1172
1173static struct omap_hwmod omap3xxx_pre_es3_mmc1_hwmod = {
1174	.name		= "mmc1",
1175	.opt_clks	= omap34xx_mmc1_opt_clks,
1176	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc1_opt_clks),
1177	.main_clk	= "mmchs1_fck",
1178	.prcm		= {
1179		.omap2 = {
1180			.module_offs = CORE_MOD,
1181			.idlest_reg_id = 1,
1182			.idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
1183		},
1184	},
1185	.dev_attr	= &mmc1_pre_es3_dev_attr,
1186	.class		= &omap34xx_mmc_class,
1187};
1188
1189static struct omap_hwmod omap3xxx_es3plus_mmc1_hwmod = {
1190	.name		= "mmc1",
1191	.opt_clks	= omap34xx_mmc1_opt_clks,
1192	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc1_opt_clks),
1193	.main_clk	= "mmchs1_fck",
1194	.prcm		= {
1195		.omap2 = {
1196			.module_offs = CORE_MOD,
1197			.idlest_reg_id = 1,
1198			.idlest_idle_bit = OMAP3430_ST_MMC1_SHIFT,
1199		},
1200	},
1201	.dev_attr	= &mmc1_dev_attr,
1202	.class		= &omap34xx_mmc_class,
1203};
1204
1205/* MMC/SD/SDIO2 */
1206
1207
1208
1209static struct omap_hwmod_opt_clk omap34xx_mmc2_opt_clks[] = {
1210	{ .role = "dbck", .clk = "omap_32k_fck", },
1211};
1212
1213/* See 35xx errata 2.1.1.128 in SPRZ278F */
1214static struct omap_hsmmc_dev_attr mmc2_pre_es3_dev_attr = {
1215	.flags = OMAP_HSMMC_BROKEN_MULTIBLOCK_READ,
1216};
1217
1218static struct omap_hwmod omap3xxx_pre_es3_mmc2_hwmod = {
1219	.name		= "mmc2",
1220	.opt_clks	= omap34xx_mmc2_opt_clks,
1221	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc2_opt_clks),
1222	.main_clk	= "mmchs2_fck",
1223	.prcm		= {
1224		.omap2 = {
1225			.module_offs = CORE_MOD,
1226			.idlest_reg_id = 1,
1227			.idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
1228		},
1229	},
1230	.dev_attr	= &mmc2_pre_es3_dev_attr,
1231	.class		= &omap34xx_mmc_class,
1232};
1233
1234static struct omap_hwmod omap3xxx_es3plus_mmc2_hwmod = {
1235	.name		= "mmc2",
1236	.opt_clks	= omap34xx_mmc2_opt_clks,
1237	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc2_opt_clks),
1238	.main_clk	= "mmchs2_fck",
1239	.prcm		= {
1240		.omap2 = {
1241			.module_offs = CORE_MOD,
1242			.idlest_reg_id = 1,
1243			.idlest_idle_bit = OMAP3430_ST_MMC2_SHIFT,
1244		},
1245	},
1246	.class		= &omap34xx_mmc_class,
1247};
1248
1249/* MMC/SD/SDIO3 */
1250
1251
1252
1253static struct omap_hwmod_opt_clk omap34xx_mmc3_opt_clks[] = {
1254	{ .role = "dbck", .clk = "omap_32k_fck", },
1255};
1256
1257static struct omap_hwmod omap3xxx_mmc3_hwmod = {
1258	.name		= "mmc3",
1259	.opt_clks	= omap34xx_mmc3_opt_clks,
1260	.opt_clks_cnt	= ARRAY_SIZE(omap34xx_mmc3_opt_clks),
1261	.main_clk	= "mmchs3_fck",
1262	.prcm		= {
1263		.omap2 = {
1264			.module_offs = CORE_MOD,
1265			.idlest_reg_id = 1,
1266			.idlest_idle_bit = OMAP3430_ST_MMC3_SHIFT,
1267		},
1268	},
1269	.class		= &omap34xx_mmc_class,
1270};
1271
1272/*
1273 * 'usb_host_hs' class
1274 * high-speed multi-port usb host controller
1275 */
1276
1277static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = {
1278	.rev_offs	= 0x0000,
1279	.sysc_offs	= 0x0010,
1280	.syss_offs	= 0x0014,
1281	.sysc_flags	= (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY |
1282			   SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
1283			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
1284			   SYSS_HAS_RESET_STATUS),
1285	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1286			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
1287	.sysc_fields	= &omap_hwmod_sysc_type1,
1288};
1289
1290static struct omap_hwmod_class omap3xxx_usb_host_hs_hwmod_class = {
1291	.name = "usb_host_hs",
1292	.sysc = &omap3xxx_usb_host_hs_sysc,
1293};
1294
1295
1296static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
1297	.name		= "usb_host_hs",
1298	.class		= &omap3xxx_usb_host_hs_hwmod_class,
1299	.clkdm_name	= "usbhost_clkdm",
1300	.main_clk	= "usbhost_48m_fck",
1301	.prcm = {
1302		.omap2 = {
1303			.module_offs = OMAP3430ES2_USBHOST_MOD,
1304			.idlest_reg_id = 1,
1305			.idlest_idle_bit = OMAP3430ES2_ST_USBHOST_IDLE_SHIFT,
1306		},
1307	},
1308
1309	/*
1310	 * Errata: USBHOST Configured In Smart-Idle Can Lead To a Deadlock
1311	 * id: i660
1312	 *
1313	 * Description:
1314	 * In the following configuration :
1315	 * - USBHOST module is set to smart-idle mode
1316	 * - PRCM asserts idle_req to the USBHOST module ( This typically
1317	 *   happens when the system is going to a low power mode : all ports
1318	 *   have been suspended, the master part of the USBHOST module has
1319	 *   entered the standby state, and SW has cut the functional clocks)
1320	 * - an USBHOST interrupt occurs before the module is able to answer
1321	 *   idle_ack, typically a remote wakeup IRQ.
1322	 * Then the USB HOST module will enter a deadlock situation where it
1323	 * is no more accessible nor functional.
1324	 *
1325	 * Workaround:
1326	 * Don't use smart idle; use only force idle, hence HWMOD_SWSUP_SIDLE
1327	 */
1328
1329	/*
1330	 * Errata: USB host EHCI may stall when entering smart-standby mode
1331	 * Id: i571
1332	 *
1333	 * Description:
1334	 * When the USBHOST module is set to smart-standby mode, and when it is
1335	 * ready to enter the standby state (i.e. all ports are suspended and
1336	 * all attached devices are in suspend mode), then it can wrongly assert
1337	 * the Mstandby signal too early while there are still some residual OCP
1338	 * transactions ongoing. If this condition occurs, the internal state
1339	 * machine may go to an undefined state and the USB link may be stuck
1340	 * upon the next resume.
1341	 *
1342	 * Workaround:
1343	 * Don't use smart standby; use only force standby,
1344	 * hence HWMOD_SWSUP_MSTANDBY
1345	 */
1346
1347	.flags		= HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
1348};
1349
1350/*
1351 * 'usb_tll_hs' class
1352 * usb_tll_hs module is the adapter on the usb_host_hs ports
1353 */
1354static struct omap_hwmod_class_sysconfig omap3xxx_usb_tll_hs_sysc = {
1355	.rev_offs	= 0x0000,
1356	.sysc_offs	= 0x0010,
1357	.syss_offs	= 0x0014,
1358	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1359			   SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
1360			   SYSC_HAS_AUTOIDLE),
1361	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1362	.sysc_fields	= &omap_hwmod_sysc_type1,
1363};
1364
1365static struct omap_hwmod_class omap3xxx_usb_tll_hs_hwmod_class = {
1366	.name = "usb_tll_hs",
1367	.sysc = &omap3xxx_usb_tll_hs_sysc,
1368};
1369
1370
1371static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = {
1372	.name		= "usb_tll_hs",
1373	.class		= &omap3xxx_usb_tll_hs_hwmod_class,
1374	.clkdm_name	= "core_l4_clkdm",
1375	.main_clk	= "usbtll_fck",
1376	.prcm = {
1377		.omap2 = {
1378			.module_offs = CORE_MOD,
1379			.idlest_reg_id = 3,
1380			.idlest_idle_bit = OMAP3430ES2_ST_USBTLL_SHIFT,
1381		},
1382	},
1383};
1384
1385static struct omap_hwmod omap3xxx_hdq1w_hwmod = {
1386	.name		= "hdq1w",
1387	.main_clk	= "hdq_fck",
1388	.prcm		= {
1389		.omap2 = {
1390			.module_offs = CORE_MOD,
1391			.idlest_reg_id = 1,
1392			.idlest_idle_bit = OMAP3430_ST_HDQ_SHIFT,
1393		},
1394	},
1395	.class		= &omap2_hdq1w_class,
1396};
1397
1398/* SAD2D */
1399static struct omap_hwmod_rst_info omap3xxx_sad2d_resets[] = {
1400	{ .name = "rst_modem_pwron_sw", .rst_shift = 0 },
1401	{ .name = "rst_modem_sw", .rst_shift = 1 },
1402};
1403
1404static struct omap_hwmod_class omap3xxx_sad2d_class = {
1405	.name			= "sad2d",
1406};
1407
1408static struct omap_hwmod omap3xxx_sad2d_hwmod = {
1409	.name		= "sad2d",
1410	.rst_lines	= omap3xxx_sad2d_resets,
1411	.rst_lines_cnt	= ARRAY_SIZE(omap3xxx_sad2d_resets),
1412	.main_clk	= "sad2d_ick",
1413	.prcm		= {
1414		.omap2 = {
1415			.module_offs = CORE_MOD,
1416			.idlest_reg_id = 1,
1417			.idlest_idle_bit = OMAP3430_ST_SAD2D_SHIFT,
1418		},
1419	},
1420	.class		= &omap3xxx_sad2d_class,
1421};
1422
1423/*
1424 * 'gpmc' class
1425 * general purpose memory controller
1426 */
1427
1428static struct omap_hwmod_class_sysconfig omap3xxx_gpmc_sysc = {
1429	.rev_offs	= 0x0000,
1430	.sysc_offs	= 0x0010,
1431	.syss_offs	= 0x0014,
1432	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
1433			   SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
1434	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1435	.sysc_fields	= &omap_hwmod_sysc_type1,
1436};
1437
1438static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = {
1439	.name	= "gpmc",
1440	.sysc	= &omap3xxx_gpmc_sysc,
1441};
1442
1443static struct omap_hwmod omap3xxx_gpmc_hwmod = {
1444	.name		= "gpmc",
1445	.class		= &omap3xxx_gpmc_hwmod_class,
1446	.clkdm_name	= "core_l3_clkdm",
1447	.main_clk	= "gpmc_fck",
1448	/* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */
1449	.flags		= HWMOD_NO_IDLEST | DEBUG_OMAP_GPMC_HWMOD_FLAGS,
1450};
1451
1452/*
1453 * interfaces
1454 */
1455
1456/* L3 -> L4_CORE interface */
1457static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
1458	.master	= &omap3xxx_l3_main_hwmod,
1459	.slave	= &omap3xxx_l4_core_hwmod,
1460	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1461};
1462
1463/* L3 -> L4_PER interface */
1464static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_per = {
1465	.master = &omap3xxx_l3_main_hwmod,
1466	.slave	= &omap3xxx_l4_per_hwmod,
1467	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1468};
1469
1470
1471/* MPU -> L3 interface */
1472static struct omap_hwmod_ocp_if omap3xxx_mpu__l3_main = {
1473	.master   = &omap3xxx_mpu_hwmod,
1474	.slave    = &omap3xxx_l3_main_hwmod,
1475	.user	= OCP_USER_MPU,
1476};
1477
1478
1479/* l3 -> debugss */
1480static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_debugss = {
1481	.master		= &omap3xxx_l3_main_hwmod,
1482	.slave		= &omap3xxx_debugss_hwmod,
1483	.user		= OCP_USER_MPU,
1484};
1485
1486/* DSS -> l3 */
1487static struct omap_hwmod_ocp_if omap3430es1_dss__l3 = {
1488	.master		= &omap3430es1_dss_core_hwmod,
1489	.slave		= &omap3xxx_l3_main_hwmod,
1490	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1491};
1492
1493static struct omap_hwmod_ocp_if omap3xxx_dss__l3 = {
1494	.master		= &omap3xxx_dss_core_hwmod,
1495	.slave		= &omap3xxx_l3_main_hwmod,
1496	.fw = {
1497		.omap2 = {
1498			.l3_perm_bit  = OMAP3_L3_CORE_FW_INIT_ID_DSS,
1499			.flags	= OMAP_FIREWALL_L3,
1500		},
1501	},
1502	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1503};
1504
1505/* l3_core -> sad2d interface */
1506static struct omap_hwmod_ocp_if omap3xxx_sad2d__l3 = {
1507	.master		= &omap3xxx_sad2d_hwmod,
1508	.slave		= &omap3xxx_l3_main_hwmod,
1509	.clk		= "core_l3_ick",
1510	.user		= OCP_USER_MPU,
1511};
1512
1513/* L4_CORE -> L4_WKUP interface */
1514static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
1515	.master	= &omap3xxx_l4_core_hwmod,
1516	.slave	= &omap3xxx_l4_wkup_hwmod,
1517	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1518};
1519
1520/* L4 CORE -> MMC1 interface */
1521static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc1 = {
1522	.master		= &omap3xxx_l4_core_hwmod,
1523	.slave		= &omap3xxx_pre_es3_mmc1_hwmod,
1524	.clk		= "mmchs1_ick",
1525	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1526	.flags		= OMAP_FIREWALL_L4,
1527};
1528
1529static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc1 = {
1530	.master		= &omap3xxx_l4_core_hwmod,
1531	.slave		= &omap3xxx_es3plus_mmc1_hwmod,
1532	.clk		= "mmchs1_ick",
1533	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1534	.flags		= OMAP_FIREWALL_L4,
1535};
1536
1537/* L4 CORE -> MMC2 interface */
1538static struct omap_hwmod_ocp_if omap3xxx_l4_core__pre_es3_mmc2 = {
1539	.master		= &omap3xxx_l4_core_hwmod,
1540	.slave		= &omap3xxx_pre_es3_mmc2_hwmod,
1541	.clk		= "mmchs2_ick",
1542	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1543	.flags		= OMAP_FIREWALL_L4,
1544};
1545
1546static struct omap_hwmod_ocp_if omap3xxx_l4_core__es3plus_mmc2 = {
1547	.master		= &omap3xxx_l4_core_hwmod,
1548	.slave		= &omap3xxx_es3plus_mmc2_hwmod,
1549	.clk		= "mmchs2_ick",
1550	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1551	.flags		= OMAP_FIREWALL_L4,
1552};
1553
1554/* L4 CORE -> MMC3 interface */
1555
1556static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmc3 = {
1557	.master		= &omap3xxx_l4_core_hwmod,
1558	.slave		= &omap3xxx_mmc3_hwmod,
1559	.clk		= "mmchs3_ick",
1560	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1561	.flags		= OMAP_FIREWALL_L4,
1562};
1563
1564/* L4 CORE -> UART1 interface */
1565
1566static struct omap_hwmod_ocp_if omap3_l4_core__uart1 = {
1567	.master		= &omap3xxx_l4_core_hwmod,
1568	.slave		= &omap3xxx_uart1_hwmod,
1569	.clk		= "uart1_ick",
1570	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1571};
1572
1573/* L4 CORE -> UART2 interface */
1574
1575static struct omap_hwmod_ocp_if omap3_l4_core__uart2 = {
1576	.master		= &omap3xxx_l4_core_hwmod,
1577	.slave		= &omap3xxx_uart2_hwmod,
1578	.clk		= "uart2_ick",
1579	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1580};
1581
1582/* L4 PER -> UART3 interface */
1583
1584static struct omap_hwmod_ocp_if omap3_l4_per__uart3 = {
1585	.master		= &omap3xxx_l4_per_hwmod,
1586	.slave		= &omap3xxx_uart3_hwmod,
1587	.clk		= "uart3_ick",
1588	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1589};
1590
1591/* L4 PER -> UART4 interface */
1592
1593static struct omap_hwmod_ocp_if omap36xx_l4_per__uart4 = {
1594	.master		= &omap3xxx_l4_per_hwmod,
1595	.slave		= &omap36xx_uart4_hwmod,
1596	.clk		= "uart4_ick",
1597	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1598};
1599
1600/* AM35xx: L4 CORE -> UART4 interface */
1601
1602static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = {
1603	.master		= &omap3xxx_l4_core_hwmod,
1604	.slave		= &am35xx_uart4_hwmod,
1605	.clk		= "uart4_ick",
1606	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1607};
1608
1609/* L4 CORE -> I2C1 interface */
1610static struct omap_hwmod_ocp_if omap3_l4_core__i2c1 = {
1611	.master		= &omap3xxx_l4_core_hwmod,
1612	.slave		= &omap3xxx_i2c1_hwmod,
1613	.clk		= "i2c1_ick",
1614	.fw = {
1615		.omap2 = {
1616			.l4_fw_region  = OMAP3_L4_CORE_FW_I2C1_REGION,
1617			.l4_prot_group = 7,
1618			.flags	= OMAP_FIREWALL_L4,
1619		},
1620	},
1621	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1622};
1623
1624/* L4 CORE -> I2C2 interface */
1625static struct omap_hwmod_ocp_if omap3_l4_core__i2c2 = {
1626	.master		= &omap3xxx_l4_core_hwmod,
1627	.slave		= &omap3xxx_i2c2_hwmod,
1628	.clk		= "i2c2_ick",
1629	.fw = {
1630		.omap2 = {
1631			.l4_fw_region  = OMAP3_L4_CORE_FW_I2C2_REGION,
1632			.l4_prot_group = 7,
1633			.flags = OMAP_FIREWALL_L4,
1634		},
1635	},
1636	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1637};
1638
1639/* L4 CORE -> I2C3 interface */
1640
1641static struct omap_hwmod_ocp_if omap3_l4_core__i2c3 = {
1642	.master		= &omap3xxx_l4_core_hwmod,
1643	.slave		= &omap3xxx_i2c3_hwmod,
1644	.clk		= "i2c3_ick",
1645	.fw = {
1646		.omap2 = {
1647			.l4_fw_region  = OMAP3_L4_CORE_FW_I2C3_REGION,
1648			.l4_prot_group = 7,
1649			.flags = OMAP_FIREWALL_L4,
1650		},
1651	},
1652	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1653};
1654
1655/* L4 CORE -> SR1 interface */
1656static struct omap_hwmod_ocp_if omap34xx_l4_core__sr1 = {
1657	.master		= &omap3xxx_l4_core_hwmod,
1658	.slave		= &omap34xx_sr1_hwmod,
1659	.clk		= "sr_l4_ick",
1660	.user		= OCP_USER_MPU,
1661};
1662
1663static struct omap_hwmod_ocp_if omap36xx_l4_core__sr1 = {
1664	.master		= &omap3xxx_l4_core_hwmod,
1665	.slave		= &omap36xx_sr1_hwmod,
1666	.clk		= "sr_l4_ick",
1667	.user		= OCP_USER_MPU,
1668};
1669
1670/* L4 CORE -> SR2 interface */
1671
1672static struct omap_hwmod_ocp_if omap34xx_l4_core__sr2 = {
1673	.master		= &omap3xxx_l4_core_hwmod,
1674	.slave		= &omap34xx_sr2_hwmod,
1675	.clk		= "sr_l4_ick",
1676	.user		= OCP_USER_MPU,
1677};
1678
1679static struct omap_hwmod_ocp_if omap36xx_l4_core__sr2 = {
1680	.master		= &omap3xxx_l4_core_hwmod,
1681	.slave		= &omap36xx_sr2_hwmod,
1682	.clk		= "sr_l4_ick",
1683	.user		= OCP_USER_MPU,
1684};
1685
1686/* L4_WKUP -> L4_SEC interface */
1687static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__l4_sec = {
1688	.master = &omap3xxx_l4_wkup_hwmod,
1689	.slave	= &omap3xxx_l4_sec_hwmod,
1690	.user	= OCP_USER_MPU | OCP_USER_SDMA,
1691};
1692
1693/* IVA2 <- L3 interface */
1694static struct omap_hwmod_ocp_if omap3xxx_l3__iva = {
1695	.master		= &omap3xxx_l3_main_hwmod,
1696	.slave		= &omap3xxx_iva_hwmod,
1697	.clk		= "core_l3_ick",
1698	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1699};
1700
1701/* l4_per -> timer3 */
1702static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer3 = {
1703	.master		= &omap3xxx_l4_per_hwmod,
1704	.slave		= &omap3xxx_timer3_hwmod,
1705	.clk		= "gpt3_ick",
1706	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1707};
1708
1709
1710/* l4_per -> timer4 */
1711static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer4 = {
1712	.master		= &omap3xxx_l4_per_hwmod,
1713	.slave		= &omap3xxx_timer4_hwmod,
1714	.clk		= "gpt4_ick",
1715	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1716};
1717
1718
1719/* l4_per -> timer5 */
1720static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer5 = {
1721	.master		= &omap3xxx_l4_per_hwmod,
1722	.slave		= &omap3xxx_timer5_hwmod,
1723	.clk		= "gpt5_ick",
1724	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1725};
1726
1727
1728/* l4_per -> timer6 */
1729static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer6 = {
1730	.master		= &omap3xxx_l4_per_hwmod,
1731	.slave		= &omap3xxx_timer6_hwmod,
1732	.clk		= "gpt6_ick",
1733	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1734};
1735
1736
1737/* l4_per -> timer7 */
1738static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer7 = {
1739	.master		= &omap3xxx_l4_per_hwmod,
1740	.slave		= &omap3xxx_timer7_hwmod,
1741	.clk		= "gpt7_ick",
1742	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1743};
1744
1745
1746/* l4_per -> timer8 */
1747static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer8 = {
1748	.master		= &omap3xxx_l4_per_hwmod,
1749	.slave		= &omap3xxx_timer8_hwmod,
1750	.clk		= "gpt8_ick",
1751	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1752};
1753
1754
1755/* l4_per -> timer9 */
1756static struct omap_hwmod_ocp_if omap3xxx_l4_per__timer9 = {
1757	.master		= &omap3xxx_l4_per_hwmod,
1758	.slave		= &omap3xxx_timer9_hwmod,
1759	.clk		= "gpt9_ick",
1760	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1761};
1762
1763/* l4_core -> timer10 */
1764static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer10 = {
1765	.master		= &omap3xxx_l4_core_hwmod,
1766	.slave		= &omap3xxx_timer10_hwmod,
1767	.clk		= "gpt10_ick",
1768	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1769};
1770
1771/* l4_core -> timer11 */
1772static struct omap_hwmod_ocp_if omap3xxx_l4_core__timer11 = {
1773	.master		= &omap3xxx_l4_core_hwmod,
1774	.slave		= &omap3xxx_timer11_hwmod,
1775	.clk		= "gpt11_ick",
1776	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1777};
1778
1779/* l4_wkup -> wd_timer2 */
1780
1781static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = {
1782	.master		= &omap3xxx_l4_wkup_hwmod,
1783	.slave		= &omap3xxx_wd_timer2_hwmod,
1784	.clk		= "wdt2_ick",
1785	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1786};
1787
1788/* l4_core -> dss */
1789static struct omap_hwmod_ocp_if omap3430es1_l4_core__dss = {
1790	.master		= &omap3xxx_l4_core_hwmod,
1791	.slave		= &omap3430es1_dss_core_hwmod,
1792	.clk		= "dss_ick",
1793	.fw = {
1794		.omap2 = {
1795			.l4_fw_region  = OMAP3ES1_L4_CORE_FW_DSS_CORE_REGION,
1796			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1797			.flags	= OMAP_FIREWALL_L4,
1798		},
1799	},
1800	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1801};
1802
1803static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss = {
1804	.master		= &omap3xxx_l4_core_hwmod,
1805	.slave		= &omap3xxx_dss_core_hwmod,
1806	.clk		= "dss_ick",
1807	.fw = {
1808		.omap2 = {
1809			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_CORE_REGION,
1810			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1811			.flags	= OMAP_FIREWALL_L4,
1812		},
1813	},
1814	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1815};
1816
1817/* l4_core -> dss_dispc */
1818static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dispc = {
1819	.master		= &omap3xxx_l4_core_hwmod,
1820	.slave		= &omap3xxx_dss_dispc_hwmod,
1821	.clk		= "dss_ick",
1822	.fw = {
1823		.omap2 = {
1824			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_DISPC_REGION,
1825			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1826			.flags	= OMAP_FIREWALL_L4,
1827		},
1828	},
1829	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1830};
1831
1832/* l4_core -> dss_dsi1 */
1833static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dsi1 = {
1834	.master		= &omap3xxx_l4_core_hwmod,
1835	.slave		= &omap3xxx_dss_dsi1_hwmod,
1836	.clk		= "dss_ick",
1837	.fw = {
1838		.omap2 = {
1839			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_DSI_REGION,
1840			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1841			.flags	= OMAP_FIREWALL_L4,
1842		},
1843	},
1844	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1845};
1846
1847/* l4_core -> dss_rfbi */
1848static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_rfbi = {
1849	.master		= &omap3xxx_l4_core_hwmod,
1850	.slave		= &omap3xxx_dss_rfbi_hwmod,
1851	.clk		= "dss_ick",
1852	.fw = {
1853		.omap2 = {
1854			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_RFBI_REGION,
1855			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP ,
1856			.flags	= OMAP_FIREWALL_L4,
1857		},
1858	},
1859	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1860};
1861
1862/* l4_core -> dss_venc */
1863static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = {
1864	.master		= &omap3xxx_l4_core_hwmod,
1865	.slave		= &omap3xxx_dss_venc_hwmod,
1866	.clk		= "dss_ick",
1867	.fw = {
1868		.omap2 = {
1869			.l4_fw_region  = OMAP3_L4_CORE_FW_DSS_VENC_REGION,
1870			.l4_prot_group = OMAP3_L4_CORE_FW_DSS_PROT_GROUP,
1871			.flags	= OMAP_FIREWALL_L4,
1872		},
1873	},
1874	.flags		= OCPIF_SWSUP_IDLE,
1875	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1876};
1877
1878/* l4_wkup -> gpio1 */
1879
1880static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__gpio1 = {
1881	.master		= &omap3xxx_l4_wkup_hwmod,
1882	.slave		= &omap3xxx_gpio1_hwmod,
1883	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1884};
1885
1886/* l4_per -> gpio2 */
1887
1888static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio2 = {
1889	.master		= &omap3xxx_l4_per_hwmod,
1890	.slave		= &omap3xxx_gpio2_hwmod,
1891	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1892};
1893
1894/* l4_per -> gpio3 */
1895
1896static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio3 = {
1897	.master		= &omap3xxx_l4_per_hwmod,
1898	.slave		= &omap3xxx_gpio3_hwmod,
1899	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1900};
1901
1902/*
1903 * 'mmu' class
1904 * The memory management unit performs virtual to physical address translation
1905 * for its requestors.
1906 */
1907
1908static struct omap_hwmod_class_sysconfig mmu_sysc = {
1909	.rev_offs	= 0x000,
1910	.sysc_offs	= 0x010,
1911	.syss_offs	= 0x014,
1912	.sysc_flags	= (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
1913			   SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
1914	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
1915	.sysc_fields	= &omap_hwmod_sysc_type1,
1916};
1917
1918static struct omap_hwmod_class omap3xxx_mmu_hwmod_class = {
1919	.name = "mmu",
1920	.sysc = &mmu_sysc,
1921};
1922
1923/* mmu isp */
1924static struct omap_hwmod omap3xxx_mmu_isp_hwmod;
1925
1926/* l4_core -> mmu isp */
1927static struct omap_hwmod_ocp_if omap3xxx_l4_core__mmu_isp = {
1928	.master		= &omap3xxx_l4_core_hwmod,
1929	.slave		= &omap3xxx_mmu_isp_hwmod,
1930	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1931};
1932
1933static struct omap_hwmod omap3xxx_mmu_isp_hwmod = {
1934	.name		= "mmu_isp",
1935	.class		= &omap3xxx_mmu_hwmod_class,
1936	.main_clk	= "cam_ick",
1937	.flags		= HWMOD_NO_IDLEST,
1938};
1939
1940/* mmu iva */
1941
1942static struct omap_hwmod omap3xxx_mmu_iva_hwmod;
1943
1944static struct omap_hwmod_rst_info omap3xxx_mmu_iva_resets[] = {
1945	{ .name = "mmu", .rst_shift = 1, .st_shift = 9 },
1946};
1947
1948/* l3_main -> iva mmu */
1949static struct omap_hwmod_ocp_if omap3xxx_l3_main__mmu_iva = {
1950	.master		= &omap3xxx_l3_main_hwmod,
1951	.slave		= &omap3xxx_mmu_iva_hwmod,
1952	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1953};
1954
1955static struct omap_hwmod omap3xxx_mmu_iva_hwmod = {
1956	.name		= "mmu_iva",
1957	.class		= &omap3xxx_mmu_hwmod_class,
1958	.clkdm_name	= "iva2_clkdm",
1959	.rst_lines	= omap3xxx_mmu_iva_resets,
1960	.rst_lines_cnt	= ARRAY_SIZE(omap3xxx_mmu_iva_resets),
1961	.main_clk	= "iva2_ck",
1962	.prcm = {
1963		.omap2 = {
1964			.module_offs = OMAP3430_IVA2_MOD,
1965			.idlest_reg_id = 1,
1966			.idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT,
1967		},
1968	},
1969	.flags		= HWMOD_NO_IDLEST,
1970};
1971
1972/* l4_per -> gpio4 */
1973
1974static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio4 = {
1975	.master		= &omap3xxx_l4_per_hwmod,
1976	.slave		= &omap3xxx_gpio4_hwmod,
1977	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1978};
1979
1980/* l4_per -> gpio5 */
1981
1982static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio5 = {
1983	.master		= &omap3xxx_l4_per_hwmod,
1984	.slave		= &omap3xxx_gpio5_hwmod,
1985	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1986};
1987
1988/* l4_per -> gpio6 */
1989
1990static struct omap_hwmod_ocp_if omap3xxx_l4_per__gpio6 = {
1991	.master		= &omap3xxx_l4_per_hwmod,
1992	.slave		= &omap3xxx_gpio6_hwmod,
1993	.user		= OCP_USER_MPU | OCP_USER_SDMA,
1994};
1995
1996/* l4_core -> mcbsp1 */
1997static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp1 = {
1998	.master		= &omap3xxx_l4_core_hwmod,
1999	.slave		= &omap3xxx_mcbsp1_hwmod,
2000	.clk		= "mcbsp1_ick",
2001	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2002};
2003
2004
2005/* l4_per -> mcbsp2 */
2006static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2 = {
2007	.master		= &omap3xxx_l4_per_hwmod,
2008	.slave		= &omap3xxx_mcbsp2_hwmod,
2009	.clk		= "mcbsp2_ick",
2010	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2011};
2012
2013
2014/* l4_per -> mcbsp3 */
2015static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3 = {
2016	.master		= &omap3xxx_l4_per_hwmod,
2017	.slave		= &omap3xxx_mcbsp3_hwmod,
2018	.clk		= "mcbsp3_ick",
2019	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2020};
2021
2022
2023/* l4_per -> mcbsp4 */
2024static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp4 = {
2025	.master		= &omap3xxx_l4_per_hwmod,
2026	.slave		= &omap3xxx_mcbsp4_hwmod,
2027	.clk		= "mcbsp4_ick",
2028	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2029};
2030
2031
2032/* l4_core -> mcbsp5 */
2033static struct omap_hwmod_ocp_if omap3xxx_l4_core__mcbsp5 = {
2034	.master		= &omap3xxx_l4_core_hwmod,
2035	.slave		= &omap3xxx_mcbsp5_hwmod,
2036	.clk		= "mcbsp5_ick",
2037	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2038};
2039
2040
2041/* l4_per -> mcbsp2_sidetone */
2042static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp2_sidetone = {
2043	.master		= &omap3xxx_l4_per_hwmod,
2044	.slave		= &omap3xxx_mcbsp2_sidetone_hwmod,
2045	.clk		= "mcbsp2_ick",
2046	.user		= OCP_USER_MPU,
2047};
2048
2049
2050/* l4_per -> mcbsp3_sidetone */
2051static struct omap_hwmod_ocp_if omap3xxx_l4_per__mcbsp3_sidetone = {
2052	.master		= &omap3xxx_l4_per_hwmod,
2053	.slave		= &omap3xxx_mcbsp3_sidetone_hwmod,
2054	.clk		= "mcbsp3_ick",
2055	.user		= OCP_USER_MPU,
2056};
2057
2058/* l4_core -> mailbox */
2059static struct omap_hwmod_ocp_if omap3xxx_l4_core__mailbox = {
2060	.master		= &omap3xxx_l4_core_hwmod,
2061	.slave		= &omap3xxx_mailbox_hwmod,
2062	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2063};
2064
2065/* l4 core -> mcspi1 interface */
2066static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi1 = {
2067	.master		= &omap3xxx_l4_core_hwmod,
2068	.slave		= &omap34xx_mcspi1,
2069	.clk		= "mcspi1_ick",
2070	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2071};
2072
2073/* l4 core -> mcspi2 interface */
2074static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi2 = {
2075	.master		= &omap3xxx_l4_core_hwmod,
2076	.slave		= &omap34xx_mcspi2,
2077	.clk		= "mcspi2_ick",
2078	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2079};
2080
2081/* l4 core -> mcspi3 interface */
2082static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi3 = {
2083	.master		= &omap3xxx_l4_core_hwmod,
2084	.slave		= &omap34xx_mcspi3,
2085	.clk		= "mcspi3_ick",
2086	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2087};
2088
2089/* l4 core -> mcspi4 interface */
2090
2091static struct omap_hwmod_ocp_if omap34xx_l4_core__mcspi4 = {
2092	.master		= &omap3xxx_l4_core_hwmod,
2093	.slave		= &omap34xx_mcspi4,
2094	.clk		= "mcspi4_ick",
2095	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2096};
2097
2098static struct omap_hwmod_ocp_if omap3xxx_usb_host_hs__l3_main_2 = {
2099	.master		= &omap3xxx_usb_host_hs_hwmod,
2100	.slave		= &omap3xxx_l3_main_hwmod,
2101	.clk		= "core_l3_ick",
2102	.user		= OCP_USER_MPU,
2103};
2104
2105
2106static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_host_hs = {
2107	.master		= &omap3xxx_l4_core_hwmod,
2108	.slave		= &omap3xxx_usb_host_hs_hwmod,
2109	.clk		= "usbhost_ick",
2110	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2111};
2112
2113
2114static struct omap_hwmod_ocp_if omap3xxx_l4_core__usb_tll_hs = {
2115	.master		= &omap3xxx_l4_core_hwmod,
2116	.slave		= &omap3xxx_usb_tll_hs_hwmod,
2117	.clk		= "usbtll_ick",
2118	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2119};
2120
2121/* l4_core -> hdq1w interface */
2122static struct omap_hwmod_ocp_if omap3xxx_l4_core__hdq1w = {
2123	.master		= &omap3xxx_l4_core_hwmod,
2124	.slave		= &omap3xxx_hdq1w_hwmod,
2125	.clk		= "hdq_ick",
2126	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2127	.flags		= OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE,
2128};
2129
2130/* am35xx has Davinci MDIO & EMAC */
2131static struct omap_hwmod_class am35xx_mdio_class = {
2132	.name = "davinci_mdio",
2133};
2134
2135static struct omap_hwmod am35xx_mdio_hwmod = {
2136	.name		= "davinci_mdio",
2137	.class		= &am35xx_mdio_class,
2138	.flags		= HWMOD_NO_IDLEST,
2139};
2140
2141/*
2142 * XXX Should be connected to an IPSS hwmod, not the L3 directly;
2143 * but this will probably require some additional hwmod core support,
2144 * so is left as a future to-do item.
2145 */
2146static struct omap_hwmod_ocp_if am35xx_mdio__l3 = {
2147	.master		= &am35xx_mdio_hwmod,
2148	.slave		= &omap3xxx_l3_main_hwmod,
2149	.clk		= "emac_fck",
2150	.user		= OCP_USER_MPU,
2151};
2152
2153/* l4_core -> davinci mdio  */
2154/*
2155 * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly;
2156 * but this will probably require some additional hwmod core support,
2157 * so is left as a future to-do item.
2158 */
2159static struct omap_hwmod_ocp_if am35xx_l4_core__mdio = {
2160	.master		= &omap3xxx_l4_core_hwmod,
2161	.slave		= &am35xx_mdio_hwmod,
2162	.clk		= "emac_fck",
2163	.user		= OCP_USER_MPU,
2164};
2165
2166static struct omap_hwmod_class am35xx_emac_class = {
2167	.name = "davinci_emac",
2168};
2169
2170static struct omap_hwmod am35xx_emac_hwmod = {
2171	.name		= "davinci_emac",
2172	.class		= &am35xx_emac_class,
2173	/*
2174	 * According to Mark Greer, the MPU will not return from WFI
2175	 * when the EMAC signals an interrupt.
2176	 * http://www.spinics.net/lists/arm-kernel/msg174734.html
2177	 */
2178	.flags		= (HWMOD_NO_IDLEST | HWMOD_BLOCK_WFI),
2179};
2180
2181/* l3_core -> davinci emac interface */
2182/*
2183 * XXX Should be connected to an IPSS hwmod, not the L3 directly;
2184 * but this will probably require some additional hwmod core support,
2185 * so is left as a future to-do item.
2186 */
2187static struct omap_hwmod_ocp_if am35xx_emac__l3 = {
2188	.master		= &am35xx_emac_hwmod,
2189	.slave		= &omap3xxx_l3_main_hwmod,
2190	.clk		= "emac_ick",
2191	.user		= OCP_USER_MPU,
2192};
2193
2194/* l4_core -> davinci emac  */
2195/*
2196 * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly;
2197 * but this will probably require some additional hwmod core support,
2198 * so is left as a future to-do item.
2199 */
2200static struct omap_hwmod_ocp_if am35xx_l4_core__emac = {
2201	.master		= &omap3xxx_l4_core_hwmod,
2202	.slave		= &am35xx_emac_hwmod,
2203	.clk		= "emac_ick",
2204	.user		= OCP_USER_MPU,
2205};
2206
2207static struct omap_hwmod_ocp_if omap3xxx_l3_main__gpmc = {
2208	.master		= &omap3xxx_l3_main_hwmod,
2209	.slave		= &omap3xxx_gpmc_hwmod,
2210	.clk		= "core_l3_ick",
2211	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2212};
2213
2214/* l4_core -> SHAM2 (SHA1/MD5) (similar to omap24xx) */
2215static struct omap_hwmod_class_sysconfig omap3_sham_sysc = {
2216	.rev_offs	= 0x5c,
2217	.sysc_offs	= 0x60,
2218	.syss_offs	= 0x64,
2219	.sysc_flags	= (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
2220			   SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
2221	.sysc_fields	= &omap3_sham_sysc_fields,
2222};
2223
2224static struct omap_hwmod_class omap3xxx_sham_class = {
2225	.name	= "sham",
2226	.sysc	= &omap3_sham_sysc,
2227};
2228
2229
2230
2231static struct omap_hwmod omap3xxx_sham_hwmod = {
2232	.name		= "sham",
2233	.main_clk	= "sha12_ick",
2234	.prcm		= {
2235		.omap2 = {
2236			.module_offs = CORE_MOD,
2237			.idlest_reg_id = 1,
2238			.idlest_idle_bit = OMAP3430_ST_SHA12_SHIFT,
2239		},
2240	},
2241	.class		= &omap3xxx_sham_class,
2242};
2243
2244
2245static struct omap_hwmod_ocp_if omap3xxx_l4_core__sham = {
2246	.master		= &omap3xxx_l4_core_hwmod,
2247	.slave		= &omap3xxx_sham_hwmod,
2248	.clk		= "sha12_ick",
2249	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2250};
2251
2252/*
2253 * 'ssi' class
2254 * synchronous serial interface (multichannel and full-duplex serial if)
2255 */
2256
2257static struct omap_hwmod_class_sysconfig omap34xx_ssi_sysc = {
2258	.rev_offs	= 0x0000,
2259	.sysc_offs	= 0x0010,
2260	.syss_offs	= 0x0014,
2261	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_MIDLEMODE |
2262			   SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
2263	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
2264	.sysc_fields	= &omap_hwmod_sysc_type1,
2265};
2266
2267static struct omap_hwmod_class omap3xxx_ssi_hwmod_class = {
2268	.name	= "ssi",
2269	.sysc	= &omap34xx_ssi_sysc,
2270};
2271
2272static struct omap_hwmod omap3xxx_ssi_hwmod = {
2273	.name		= "ssi",
2274	.class		= &omap3xxx_ssi_hwmod_class,
2275	.clkdm_name	= "core_l4_clkdm",
2276	.main_clk	= "ssi_ssr_fck",
2277	.prcm		= {
2278		.omap2 = {
2279			.module_offs		= CORE_MOD,
2280			.idlest_reg_id		= 1,
2281			.idlest_idle_bit	= OMAP3430ES2_ST_SSI_IDLE_SHIFT,
2282		},
2283	},
2284};
2285
2286/* L4 CORE -> SSI */
2287static struct omap_hwmod_ocp_if omap3xxx_l4_core__ssi = {
2288	.master		= &omap3xxx_l4_core_hwmod,
2289	.slave		= &omap3xxx_ssi_hwmod,
2290	.clk		= "ssi_ick",
2291	.user		= OCP_USER_MPU | OCP_USER_SDMA,
2292};
2293
2294static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {
2295	&omap3xxx_l3_main__l4_core,
2296	&omap3xxx_l3_main__l4_per,
2297	&omap3xxx_mpu__l3_main,
2298	&omap3xxx_l3_main__l4_debugss,
2299	&omap3xxx_l4_core__l4_wkup,
2300	&omap3xxx_l4_core__mmc3,
2301	&omap3_l4_core__uart1,
2302	&omap3_l4_core__uart2,
2303	&omap3_l4_per__uart3,
2304	&omap3_l4_core__i2c1,
2305	&omap3_l4_core__i2c2,
2306	&omap3_l4_core__i2c3,
2307	&omap3xxx_l4_wkup__l4_sec,
2308	&omap3xxx_l4_per__timer3,
2309	&omap3xxx_l4_per__timer4,
2310	&omap3xxx_l4_per__timer5,
2311	&omap3xxx_l4_per__timer6,
2312	&omap3xxx_l4_per__timer7,
2313	&omap3xxx_l4_per__timer8,
2314	&omap3xxx_l4_per__timer9,
2315	&omap3xxx_l4_core__timer10,
2316	&omap3xxx_l4_core__timer11,
2317	&omap3xxx_l4_wkup__wd_timer2,
2318	&omap3xxx_l4_wkup__gpio1,
2319	&omap3xxx_l4_per__gpio2,
2320	&omap3xxx_l4_per__gpio3,
2321	&omap3xxx_l4_per__gpio4,
2322	&omap3xxx_l4_per__gpio5,
2323	&omap3xxx_l4_per__gpio6,
2324	&omap3xxx_l4_core__mcbsp1,
2325	&omap3xxx_l4_per__mcbsp2,
2326	&omap3xxx_l4_per__mcbsp3,
2327	&omap3xxx_l4_per__mcbsp4,
2328	&omap3xxx_l4_core__mcbsp5,
2329	&omap3xxx_l4_per__mcbsp2_sidetone,
2330	&omap3xxx_l4_per__mcbsp3_sidetone,
2331	&omap34xx_l4_core__mcspi1,
2332	&omap34xx_l4_core__mcspi2,
2333	&omap34xx_l4_core__mcspi3,
2334	&omap34xx_l4_core__mcspi4,
2335	&omap3xxx_l3_main__gpmc,
2336	NULL,
2337};
2338
2339/* crypto hwmod links */
2340static struct omap_hwmod_ocp_if *omap34xx_sham_hwmod_ocp_ifs[] __initdata = {
2341	&omap3xxx_l4_core__sham,
2342	NULL,
2343};
2344
2345static struct omap_hwmod_ocp_if *omap36xx_sham_hwmod_ocp_ifs[] __initdata = {
2346	&omap3xxx_l4_core__sham,
2347	NULL
2348};
2349
2350
2351/*
2352 * Apparently the SHA/MD5 and AES accelerator IP blocks are
2353 * only present on some AM35xx chips, and no one knows which
2354 * ones.  See
2355 * http://www.spinics.net/lists/arm-kernel/msg215466.html So
2356 * if you need these IP blocks on an AM35xx, try uncommenting
2357 * the following lines.
2358 */
2359static struct omap_hwmod_ocp_if *am35xx_sham_hwmod_ocp_ifs[] __initdata = {
2360	/* &omap3xxx_l4_core__sham, */
2361	NULL
2362};
2363
2364/* 3430ES1-only hwmod links */
2365static struct omap_hwmod_ocp_if *omap3430es1_hwmod_ocp_ifs[] __initdata = {
2366	&omap3430es1_dss__l3,
2367	&omap3430es1_l4_core__dss,
2368	NULL,
2369};
2370
2371/* 3430ES2+-only hwmod links */
2372static struct omap_hwmod_ocp_if *omap3430es2plus_hwmod_ocp_ifs[] __initdata = {
2373	&omap3xxx_dss__l3,
2374	&omap3xxx_l4_core__dss,
2375	&omap3xxx_usb_host_hs__l3_main_2,
2376	&omap3xxx_l4_core__usb_host_hs,
2377	&omap3xxx_l4_core__usb_tll_hs,
2378	NULL,
2379};
2380
2381/* <= 3430ES3-only hwmod links */
2382static struct omap_hwmod_ocp_if *omap3430_pre_es3_hwmod_ocp_ifs[] __initdata = {
2383	&omap3xxx_l4_core__pre_es3_mmc1,
2384	&omap3xxx_l4_core__pre_es3_mmc2,
2385	NULL,
2386};
2387
2388/* 3430ES3+-only hwmod links */
2389static struct omap_hwmod_ocp_if *omap3430_es3plus_hwmod_ocp_ifs[] __initdata = {
2390	&omap3xxx_l4_core__es3plus_mmc1,
2391	&omap3xxx_l4_core__es3plus_mmc2,
2392	NULL,
2393};
2394
2395/* 34xx-only hwmod links (all ES revisions) */
2396static struct omap_hwmod_ocp_if *omap34xx_hwmod_ocp_ifs[] __initdata = {
2397	&omap3xxx_l3__iva,
2398	&omap34xx_l4_core__sr1,
2399	&omap34xx_l4_core__sr2,
2400	&omap3xxx_l4_core__mailbox,
2401	&omap3xxx_l4_core__hdq1w,
2402	&omap3xxx_sad2d__l3,
2403	&omap3xxx_l4_core__mmu_isp,
2404	&omap3xxx_l3_main__mmu_iva,
2405	&omap3xxx_l4_core__ssi,
2406	NULL,
2407};
2408
2409/* 36xx-only hwmod links (all ES revisions) */
2410static struct omap_hwmod_ocp_if *omap36xx_hwmod_ocp_ifs[] __initdata = {
2411	&omap3xxx_l3__iva,
2412	&omap36xx_l4_per__uart4,
2413	&omap3xxx_dss__l3,
2414	&omap3xxx_l4_core__dss,
2415	&omap36xx_l4_core__sr1,
2416	&omap36xx_l4_core__sr2,
2417	&omap3xxx_l4_core__mailbox,
2418	&omap3xxx_usb_host_hs__l3_main_2,
2419	&omap3xxx_l4_core__usb_host_hs,
2420	&omap3xxx_l4_core__usb_tll_hs,
2421	&omap3xxx_l4_core__es3plus_mmc1,
2422	&omap3xxx_l4_core__es3plus_mmc2,
2423	&omap3xxx_l4_core__hdq1w,
2424	&omap3xxx_sad2d__l3,
2425	&omap3xxx_l4_core__mmu_isp,
2426	&omap3xxx_l3_main__mmu_iva,
2427	&omap3xxx_l4_core__ssi,
2428	NULL,
2429};
2430
2431static struct omap_hwmod_ocp_if *am35xx_hwmod_ocp_ifs[] __initdata = {
2432	&omap3xxx_dss__l3,
2433	&omap3xxx_l4_core__dss,
2434	&am35xx_l4_core__uart4,
2435	&omap3xxx_usb_host_hs__l3_main_2,
2436	&omap3xxx_l4_core__usb_host_hs,
2437	&omap3xxx_l4_core__usb_tll_hs,
2438	&omap3xxx_l4_core__es3plus_mmc1,
2439	&omap3xxx_l4_core__es3plus_mmc2,
2440	&omap3xxx_l4_core__hdq1w,
2441	&am35xx_mdio__l3,
2442	&am35xx_l4_core__mdio,
2443	&am35xx_emac__l3,
2444	&am35xx_l4_core__emac,
2445	NULL,
2446};
2447
2448static struct omap_hwmod_ocp_if *omap3xxx_dss_hwmod_ocp_ifs[] __initdata = {
2449	&omap3xxx_l4_core__dss_dispc,
2450	&omap3xxx_l4_core__dss_dsi1,
2451	&omap3xxx_l4_core__dss_rfbi,
2452	&omap3xxx_l4_core__dss_venc,
2453	NULL,
2454};
2455
2456/**
2457 * omap3xxx_hwmod_is_hs_ip_block_usable - is a security IP block accessible?
2458 * @bus: struct device_node * for the top-level OMAP DT data
2459 * @dev_name: device name used in the DT file
2460 *
2461 * Determine whether a "secure" IP block @dev_name is usable by Linux.
2462 * There doesn't appear to be a 100% reliable way to determine this,
2463 * so we rely on heuristics.  If @bus is null, meaning there's no DT
2464 * data, then we only assume the IP block is accessible if the OMAP is
2465 * fused as a 'general-purpose' SoC.  If however DT data is present,
2466 * test to see if the IP block is described in the DT data and set to
2467 * 'status = "okay"'.  If so then we assume the ODM has configured the
2468 * OMAP firewalls to allow access to the IP block.
2469 *
2470 * Return: 0 if device named @dev_name is not likely to be accessible,
2471 * or 1 if it is likely to be accessible.
2472 */
2473static bool __init omap3xxx_hwmod_is_hs_ip_block_usable(struct device_node *bus,
2474							const char *dev_name)
2475{
2476	struct device_node *node;
2477	bool available;
2478
2479	if (!bus)
2480		return omap_type() == OMAP2_DEVICE_TYPE_GP;
2481
2482	node = of_get_child_by_name(bus, dev_name);
2483	available = of_device_is_available(node);
2484	of_node_put(node);
2485
2486	return available;
2487}
2488
2489int __init omap3xxx_hwmod_init(void)
2490{
2491	int r;
2492	struct omap_hwmod_ocp_if **h = NULL, **h_sham = NULL;
2493	struct device_node *bus;
2494	unsigned int rev;
2495
2496	omap_hwmod_init();
2497
2498	/* Register hwmod links common to all OMAP3 */
2499	r = omap_hwmod_register_links(omap3xxx_hwmod_ocp_ifs);
2500	if (r < 0)
2501		return r;
2502
2503	rev = omap_rev();
2504
2505	/*
2506	 * Register hwmod links common to individual OMAP3 families, all
2507	 * silicon revisions (e.g., 34xx, or AM3505/3517, or 36xx)
2508	 * All possible revisions should be included in this conditional.
2509	 */
2510	if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 ||
2511	    rev == OMAP3430_REV_ES2_1 || rev == OMAP3430_REV_ES3_0 ||
2512	    rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2) {
2513		h = omap34xx_hwmod_ocp_ifs;
2514		h_sham = omap34xx_sham_hwmod_ocp_ifs;
2515	} else if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
2516		h = am35xx_hwmod_ocp_ifs;
2517		h_sham = am35xx_sham_hwmod_ocp_ifs;
2518	} else if (rev == OMAP3630_REV_ES1_0 || rev == OMAP3630_REV_ES1_1 ||
2519		   rev == OMAP3630_REV_ES1_2) {
2520		h = omap36xx_hwmod_ocp_ifs;
2521		h_sham = omap36xx_sham_hwmod_ocp_ifs;
2522	} else {
2523		WARN(1, "OMAP3 hwmod family init: unknown chip type\n");
2524		return -EINVAL;
2525	}
2526
2527	r = omap_hwmod_register_links(h);
2528	if (r < 0)
2529		return r;
2530
2531	/*
2532	 * Register crypto hwmod links only if they are not disabled in DT.
2533	 * If DT information is missing, enable them only for GP devices.
2534	 */
2535
2536	bus = of_find_node_by_name(NULL, "ocp");
2537
2538	if (h_sham && omap3xxx_hwmod_is_hs_ip_block_usable(bus, "sham")) {
2539		r = omap_hwmod_register_links(h_sham);
2540		if (r < 0)
2541			goto put_node;
2542	}
2543
2544	of_node_put(bus);
2545
2546	/*
2547	 * Register hwmod links specific to certain ES levels of a
2548	 * particular family of silicon (e.g., 34xx ES1.0)
2549	 */
2550	h = NULL;
2551	if (rev == OMAP3430_REV_ES1_0) {
2552		h = omap3430es1_hwmod_ocp_ifs;
2553	} else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 ||
2554		   rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 ||
2555		   rev == OMAP3430_REV_ES3_1_2) {
2556		h = omap3430es2plus_hwmod_ocp_ifs;
2557	}
2558
2559	if (h) {
2560		r = omap_hwmod_register_links(h);
2561		if (r < 0)
2562			return r;
2563	}
2564
2565	h = NULL;
2566	if (rev == OMAP3430_REV_ES1_0 || rev == OMAP3430_REV_ES2_0 ||
2567	    rev == OMAP3430_REV_ES2_1) {
2568		h = omap3430_pre_es3_hwmod_ocp_ifs;
2569	} else if (rev == OMAP3430_REV_ES3_0 || rev == OMAP3430_REV_ES3_1 ||
2570		   rev == OMAP3430_REV_ES3_1_2) {
2571		h = omap3430_es3plus_hwmod_ocp_ifs;
2572	}
2573
2574	if (h)
2575		r = omap_hwmod_register_links(h);
2576	if (r < 0)
2577		return r;
2578
2579	/*
2580	 * DSS code presumes that dss_core hwmod is handled first,
2581	 * _before_ any other DSS related hwmods so register common
2582	 * DSS hwmod links last to ensure that dss_core is already
2583	 * registered.  Otherwise some change things may happen, for
2584	 * ex. if dispc is handled before dss_core and DSS is enabled
2585	 * in bootloader DISPC will be reset with outputs enabled
2586	 * which sometimes leads to unrecoverable L3 error.  XXX The
2587	 * long-term fix to this is to ensure hwmods are set up in
2588	 * dependency order in the hwmod core code.
2589	 */
2590	r = omap_hwmod_register_links(omap3xxx_dss_hwmod_ocp_ifs);
2591
2592	return r;
2593
2594put_node:
2595	of_node_put(bus);
2596	return r;
2597}