omap_hwmod.h 27.9 KB
Newer Older
1 2 3
/*
 * omap_hwmod macros, structures
 *
4
 * Copyright (C) 2009-2011 Nokia Corporation
5
 * Copyright (C) 2011-2012 Texas Instruments, Inc.
6 7
 * Paul Walmsley
 *
8
 * Created in collaboration with (alphabetical order): Benoît Cousson,
9 10 11 12 13 14 15 16 17
 * Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram Pandita, Sakari
 * Poussa, Anand Sawant, Santosh Shilimkar, Richard Woodruff
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * These headers and macros are used to define OMAP on-chip module
 * data and their integration with other OMAP modules and Linux.
18 19 20
 * Copious documentation and references can also be found in the
 * omap_hwmod code, in arch/arm/mach-omap2/omap_hwmod.c (as of this
 * writing).
21 22 23 24 25
 *
 * To do:
 * - add interconnect error log structures
 * - init_conn_id_bit (CONNID_BIT_VECTOR)
 * - implement default hwmod SMS/SDRC flags?
26
 * - move Linux-specific data ("non-ROM data") out
27 28 29 30 31 32
 *
 */
#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H

#include <linux/kernel.h>
33
#include <linux/init.h>
34
#include <linux/list.h>
35
#include <linux/ioport.h>
36
#include <linux/spinlock.h>
37 38 39

struct omap_device;

40 41
extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1;
extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2;
42
extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type3;
43 44 45 46 47 48

/*
 * OCP SYSCONFIG bit shifts/masks TYPE1. These are for IPs compliant
 * with the original PRCM protocol defined for OMAP2420
 */
#define SYSC_TYPE1_MIDLEMODE_SHIFT	12
49
#define SYSC_TYPE1_MIDLEMODE_MASK	(0x3 << SYSC_TYPE1_MIDLEMODE_SHIFT)
50
#define SYSC_TYPE1_CLOCKACTIVITY_SHIFT	8
51
#define SYSC_TYPE1_CLOCKACTIVITY_MASK	(0x3 << SYSC_TYPE1_CLOCKACTIVITY_SHIFT)
52
#define SYSC_TYPE1_SIDLEMODE_SHIFT	3
53
#define SYSC_TYPE1_SIDLEMODE_MASK	(0x3 << SYSC_TYPE1_SIDLEMODE_SHIFT)
54
#define SYSC_TYPE1_ENAWAKEUP_SHIFT	2
55
#define SYSC_TYPE1_ENAWAKEUP_MASK	(1 << SYSC_TYPE1_ENAWAKEUP_SHIFT)
56
#define SYSC_TYPE1_SOFTRESET_SHIFT	1
57
#define SYSC_TYPE1_SOFTRESET_MASK	(1 << SYSC_TYPE1_SOFTRESET_SHIFT)
58
#define SYSC_TYPE1_AUTOIDLE_SHIFT	0
59
#define SYSC_TYPE1_AUTOIDLE_MASK	(1 << SYSC_TYPE1_AUTOIDLE_SHIFT)
60 61 62 63 64 65 66 67 68 69 70

/*
 * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant
 * with the new PRCM protocol defined for new OMAP4 IPs.
 */
#define SYSC_TYPE2_SOFTRESET_SHIFT	0
#define SYSC_TYPE2_SOFTRESET_MASK	(1 << SYSC_TYPE2_SOFTRESET_SHIFT)
#define SYSC_TYPE2_SIDLEMODE_SHIFT	2
#define SYSC_TYPE2_SIDLEMODE_MASK	(0x3 << SYSC_TYPE2_SIDLEMODE_SHIFT)
#define SYSC_TYPE2_MIDLEMODE_SHIFT	4
#define SYSC_TYPE2_MIDLEMODE_MASK	(0x3 << SYSC_TYPE2_MIDLEMODE_SHIFT)
71 72
#define SYSC_TYPE2_DMADISABLE_SHIFT	16
#define SYSC_TYPE2_DMADISABLE_MASK	(0x1 << SYSC_TYPE2_DMADISABLE_SHIFT)
73

74 75 76 77 78 79 80 81
/*
 * OCP SYSCONFIG bit shifts/masks TYPE3.
 * This is applicable for some IPs present in AM33XX
 */
#define SYSC_TYPE3_SIDLEMODE_SHIFT	0
#define SYSC_TYPE3_SIDLEMODE_MASK	(0x3 << SYSC_TYPE3_SIDLEMODE_SHIFT)
#define SYSC_TYPE3_MIDLEMODE_SHIFT	2
#define SYSC_TYPE3_MIDLEMODE_MASK	(0x3 << SYSC_TYPE3_MIDLEMODE_SHIFT)
82 83 84 85 86 87 88 89 90

/* OCP SYSSTATUS bit shifts/masks */
#define SYSS_RESETDONE_SHIFT		0
#define SYSS_RESETDONE_MASK		(1 << SYSS_RESETDONE_SHIFT)

/* Master standby/slave idle mode flags */
#define HWMOD_IDLEMODE_FORCE		(1 << 0)
#define HWMOD_IDLEMODE_NO		(1 << 1)
#define HWMOD_IDLEMODE_SMART		(1 << 2)
91
#define HWMOD_IDLEMODE_SMART_WKUP	(1 << 3)
92

93 94 95 96
/* modulemode control type (SW or HW) */
#define MODULEMODE_HWCTRL		1
#define MODULEMODE_SWCTRL		2

97 98 99 100 101 102 103 104 105 106 107 108 109 110
#define DEBUG_OMAP2UART1_FLAGS	0
#define DEBUG_OMAP2UART2_FLAGS	0
#define DEBUG_OMAP2UART3_FLAGS	0
#define DEBUG_OMAP3UART3_FLAGS	0
#define DEBUG_OMAP3UART4_FLAGS	0
#define DEBUG_OMAP4UART3_FLAGS	0
#define DEBUG_OMAP4UART4_FLAGS	0
#define DEBUG_TI81XXUART1_FLAGS	0
#define DEBUG_TI81XXUART2_FLAGS	0
#define DEBUG_TI81XXUART3_FLAGS	0
#define DEBUG_AM33XXUART1_FLAGS	0

#define DEBUG_OMAPUART_FLAGS	(HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET)

111 112 113 114 115 116
#ifdef CONFIG_OMAP_GPMC_DEBUG
#define DEBUG_OMAP_GPMC_HWMOD_FLAGS	HWMOD_INIT_NO_RESET
#else
#define DEBUG_OMAP_GPMC_HWMOD_FLAGS	0
#endif

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
#if defined(CONFIG_DEBUG_OMAP2UART1)
#undef DEBUG_OMAP2UART1_FLAGS
#define DEBUG_OMAP2UART1_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP2UART2)
#undef DEBUG_OMAP2UART2_FLAGS
#define DEBUG_OMAP2UART2_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP2UART3)
#undef DEBUG_OMAP2UART3_FLAGS
#define DEBUG_OMAP2UART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP3UART3)
#undef DEBUG_OMAP3UART3_FLAGS
#define DEBUG_OMAP3UART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP3UART4)
#undef DEBUG_OMAP3UART4_FLAGS
#define DEBUG_OMAP3UART4_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP4UART3)
#undef DEBUG_OMAP4UART3_FLAGS
#define DEBUG_OMAP4UART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_OMAP4UART4)
#undef DEBUG_OMAP4UART4_FLAGS
#define DEBUG_OMAP4UART4_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_TI81XXUART1)
#undef DEBUG_TI81XXUART1_FLAGS
#define DEBUG_TI81XXUART1_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_TI81XXUART2)
#undef DEBUG_TI81XXUART2_FLAGS
#define DEBUG_TI81XXUART2_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_TI81XXUART3)
#undef DEBUG_TI81XXUART3_FLAGS
#define DEBUG_TI81XXUART3_FLAGS DEBUG_OMAPUART_FLAGS
#elif defined(CONFIG_DEBUG_AM33XXUART1)
#undef DEBUG_AM33XXUART1_FLAGS
#define DEBUG_AM33XXUART1_FLAGS DEBUG_OMAPUART_FLAGS
#endif
151

152 153
/**
 * struct omap_hwmod_dma_info - DMA channels used by the hwmod
154
 * @name: name of the DMA channel (module local name)
155
 * @dma_req: DMA request ID (should be non-negative except -1 = terminator)
156 157 158 159 160 161 162
 *
 * @name should be something short, e.g., "tx" or "rx".  It is for use
 * by platform_get_resource_byname().  It is defined locally to the
 * hwmod.
 */
struct omap_hwmod_dma_info {
	const char	*name;
163
	s16		dma_req;
164 165
};

166 167 168 169
/**
 * struct omap_hwmod_rst_info - IPs reset lines use by hwmod
 * @name: name of the reset line (module local name)
 * @rst_shift: Offset of the reset bit
170
 * @st_shift: Offset of the reset status bit (OMAP2/3 only)
171 172 173 174 175 176 177
 *
 * @name should be something short, e.g., "cpu0" or "rst". It is defined
 * locally to the hwmod.
 */
struct omap_hwmod_rst_info {
	const char	*name;
	u8		rst_shift;
178
	u8		st_shift;
179 180
};

181 182 183
/**
 * struct omap_hwmod_opt_clk - optional clocks used by this hwmod
 * @role: "sys", "32k", "tv", etc -- for use in clk_get()
184
 * @clk: opt clock: OMAP clock name
185 186 187 188 189 190 191
 * @_clk: pointer to the struct clk (filled in at runtime)
 *
 * The module's interface clock and main functional clock should not
 * be added as optional clocks.
 */
struct omap_hwmod_opt_clk {
	const char	*role;
192
	const char	*clk;
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
	struct clk	*_clk;
};


/* omap_hwmod_omap2_firewall.flags bits */
#define OMAP_FIREWALL_L3		(1 << 0)
#define OMAP_FIREWALL_L4		(1 << 1)

/**
 * struct omap_hwmod_omap2_firewall - OMAP2/3 device firewall data
 * @l3_perm_bit: bit shift for L3_PM_*_PERMISSION_*
 * @l4_fw_region: L4 firewall region ID
 * @l4_prot_group: L4 protection group ID
 * @flags: (see omap_hwmod_omap2_firewall.flags macros above)
 */
struct omap_hwmod_omap2_firewall {
	u8 l3_perm_bit;
	u8 l4_fw_region;
	u8 l4_prot_group;
	u8 flags;
};


/*
 * omap_hwmod_addr_space.flags bits
 *
 * ADDR_MAP_ON_INIT: Map this address space during omap_hwmod init.
 * ADDR_TYPE_RT: Address space contains module register target data.
 */
222
#define ADDR_MAP_ON_INIT	(1 << 0)	/* XXX does not belong */
223 224 225
#define ADDR_TYPE_RT		(1 << 1)

/**
226 227
 * struct omap_hwmod_addr_space - address space handled by the hwmod
 * @name: name of the address space
228 229 230 231 232 233 234 235
 * @pa_start: starting physical address
 * @pa_end: ending physical address
 * @flags: (see omap_hwmod_addr_space.flags macros above)
 *
 * Address space doesn't necessarily follow physical interconnect
 * structure.  GPMC is one example.
 */
struct omap_hwmod_addr_space {
236
	const char *name;
237 238 239 240 241 242 243 244 245 246 247 248 249
	u32 pa_start;
	u32 pa_end;
	u8 flags;
};


/*
 * omap_hwmod_ocp_if.user bits: these indicate the initiators that use this
 * interface to interact with the hwmod.  Used to add sleep dependencies
 * when the module is enabled or disabled.
 */
#define OCP_USER_MPU			(1 << 0)
#define OCP_USER_SDMA			(1 << 1)
250
#define OCP_USER_DSP			(1 << 2)
251
#define OCP_USER_IVA			(1 << 3)
252 253

/* omap_hwmod_ocp_if.flags bits */
254 255
#define OCPIF_SWSUP_IDLE		(1 << 0)
#define OCPIF_CAN_BURST			(1 << 1)
256

257 258 259 260
/* omap_hwmod_ocp_if._int_flags possibilities */
#define _OCPIF_INT_FLAGS_REGISTERED	(1 << 0)


261 262 263 264 265
/**
 * struct omap_hwmod_ocp_if - OCP interface data
 * @master: struct omap_hwmod that initiates OCP transactions on this link
 * @slave: struct omap_hwmod that responds to OCP transactions on this link
 * @addr: address space associated with this link
266
 * @clk: interface clock: OMAP clock name
267 268 269 270 271
 * @_clk: pointer to the interface struct clk (filled in at runtime)
 * @fw: interface firewall data
 * @width: OCP data width
 * @user: initiators using this interface (see OCP_USER_* macros above)
 * @flags: OCP interface flags (see OCPIF_* macros above)
272
 * @_int_flags: internal flags (see _OCPIF_INT_FLAGS* macros above)
273 274 275 276 277 278 279 280 281 282
 *
 * It may also be useful to add a tag_cnt field for OCP2.x devices.
 *
 * Parameter names beginning with an underscore are managed internally by
 * the omap_hwmod code and should not be set during initialization.
 */
struct omap_hwmod_ocp_if {
	struct omap_hwmod		*master;
	struct omap_hwmod		*slave;
	struct omap_hwmod_addr_space	*addr;
283
	const char			*clk;
284
	struct clk			*_clk;
285
	struct list_head		node;
286 287 288 289 290 291
	union {
		struct omap_hwmod_omap2_firewall omap2;
	}				fw;
	u8				width;
	u8				user;
	u8				flags;
292
	u8				_int_flags;
293 294 295 296 297 298
};


/* Macros for use in struct omap_hwmod_sysconfig */

/* Flags for use in omap_hwmod_sysconfig.idlemodes */
299
#define MASTER_STANDBY_SHIFT	4
300 301 302 303
#define SLAVE_IDLE_SHIFT	0
#define SIDLE_FORCE		(HWMOD_IDLEMODE_FORCE << SLAVE_IDLE_SHIFT)
#define SIDLE_NO		(HWMOD_IDLEMODE_NO << SLAVE_IDLE_SHIFT)
#define SIDLE_SMART		(HWMOD_IDLEMODE_SMART << SLAVE_IDLE_SHIFT)
304
#define SIDLE_SMART_WKUP	(HWMOD_IDLEMODE_SMART_WKUP << SLAVE_IDLE_SHIFT)
305 306 307
#define MSTANDBY_FORCE		(HWMOD_IDLEMODE_FORCE << MASTER_STANDBY_SHIFT)
#define MSTANDBY_NO		(HWMOD_IDLEMODE_NO << MASTER_STANDBY_SHIFT)
#define MSTANDBY_SMART		(HWMOD_IDLEMODE_SMART << MASTER_STANDBY_SHIFT)
308
#define MSTANDBY_SMART_WKUP	(HWMOD_IDLEMODE_SMART_WKUP << MASTER_STANDBY_SHIFT)
309 310 311 312 313 314 315 316 317

/* omap_hwmod_sysconfig.sysc_flags capability flags */
#define SYSC_HAS_AUTOIDLE	(1 << 0)
#define SYSC_HAS_SOFTRESET	(1 << 1)
#define SYSC_HAS_ENAWAKEUP	(1 << 2)
#define SYSC_HAS_EMUFREE	(1 << 3)
#define SYSC_HAS_CLOCKACTIVITY	(1 << 4)
#define SYSC_HAS_SIDLEMODE	(1 << 5)
#define SYSC_HAS_MIDLEMODE	(1 << 6)
318
#define SYSS_HAS_RESET_STATUS	(1 << 7)
319
#define SYSC_NO_CACHE		(1 << 8)  /* XXX SW flag, belongs elsewhere */
320
#define SYSC_HAS_RESET_STATUS	(1 << 9)
321
#define SYSC_HAS_DMADISABLE	(1 << 10)
322 323 324 325 326 327 328

/* omap_hwmod_sysconfig.clockact flags */
#define CLOCKACT_TEST_BOTH	0x0
#define CLOCKACT_TEST_MAIN	0x1
#define CLOCKACT_TEST_ICLK	0x2
#define CLOCKACT_TEST_NONE	0x3

329 330 331 332 333 334 335
/**
 * struct omap_hwmod_sysc_fields - hwmod OCP_SYSCONFIG register field offsets.
 * @midle_shift: Offset of the midle bit
 * @clkact_shift: Offset of the clockactivity bit
 * @sidle_shift: Offset of the sidle bit
 * @enwkup_shift: Offset of the enawakeup bit
 * @srst_shift: Offset of the softreset bit
336
 * @autoidle_shift: Offset of the autoidle bit
337
 * @dmadisable_shift: Offset of the dmadisable bit
338 339 340 341 342 343 344 345
 */
struct omap_hwmod_sysc_fields {
	u8 midle_shift;
	u8 clkact_shift;
	u8 sidle_shift;
	u8 enwkup_shift;
	u8 srst_shift;
	u8 autoidle_shift;
346
	u8 dmadisable_shift;
347 348
};

349
/**
350
 * struct omap_hwmod_class_sysconfig - hwmod class OCP_SYS* data
351 352 353
 * @rev_offs: IP block revision register offset (from module base addr)
 * @sysc_offs: OCP_SYSCONFIG register offset (from module base addr)
 * @syss_offs: OCP_SYSSTATUS register offset (from module base addr)
354
 * @srst_udelay: Delay needed after doing a softreset in usecs
355 356 357 358 359 360 361 362 363 364 365 366
 * @idlemodes: One or more of {SIDLE,MSTANDBY}_{OFF,FORCE,SMART}
 * @sysc_flags: SYS{C,S}_HAS* flags indicating SYSCONFIG bits supported
 * @clockact: the default value of the module CLOCKACTIVITY bits
 *
 * @clockact describes to the module which clocks are likely to be
 * disabled when the PRCM issues its idle request to the module.  Some
 * modules have separate clockdomains for the interface clock and main
 * functional clock, and can check whether they should acknowledge the
 * idle request based on the internal module functionality that has
 * been associated with the clocks marked in @clockact.  This field is
 * only used if HWMOD_SET_DEFAULT_CLOCKACT is set (see below)
 *
367 368 369 370
 * @sysc_fields: structure containing the offset positions of various bits in
 * SYSCONFIG register. This can be populated using omap_hwmod_sysc_type1 or
 * omap_hwmod_sysc_type2 defined in omap_hwmod_common_data.c depending on
 * whether the device ip is compliant with the original PRCM protocol
371 372
 * defined for OMAP2420 or the new PRCM protocol for new OMAP4 IPs.
 * If the device follows a different scheme for the sysconfig register ,
373
 * then this field has to be populated with the correct offset structure.
374
 */
375
struct omap_hwmod_class_sysconfig {
376 377 378
	u32 rev_offs;
	u32 sysc_offs;
	u32 syss_offs;
379
	u16 sysc_flags;
380 381
	struct omap_hwmod_sysc_fields *sysc_fields;
	u8 srst_udelay;
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
	u8 idlemodes;
};

/**
 * struct omap_hwmod_omap2_prcm - OMAP2/3-specific PRCM data
 * @module_offs: PRCM submodule offset from the start of the PRM/CM
 * @prcm_reg_id: PRCM register ID (e.g., 3 for CM_AUTOIDLE3)
 * @module_bit: register bit shift for AUTOIDLE, WKST, WKEN, GRPSEL regs
 * @idlest_reg_id: IDLEST register ID (e.g., 3 for CM_IDLEST3)
 * @idlest_idle_bit: register bit shift for CM_IDLEST slave idle bit
 * @idlest_stdby_bit: register bit shift for CM_IDLEST master standby bit
 *
 * @prcm_reg_id and @module_bit are specific to the AUTOIDLE, WKST,
 * WKEN, GRPSEL registers.  In an ideal world, no extra information
 * would be needed for IDLEST information, but alas, there are some
 * exceptions, so @idlest_reg_id, @idlest_idle_bit, @idlest_stdby_bit
 * are needed for the IDLEST registers (c.f. 2430 I2CHS, 3430 USBHOST)
 */
struct omap_hwmod_omap2_prcm {
	s16 module_offs;
	u8 prcm_reg_id;
	u8 module_bit;
	u8 idlest_reg_id;
	u8 idlest_idle_bit;
	u8 idlest_stdby_bit;
};

409 410 411 412 413 414
/*
 * Possible values for struct omap_hwmod_omap4_prcm.flags
 *
 * HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT: Some IP blocks don't have a PRCM
 *     module-level context loss register associated with them; this
 *     flag bit should be set in those cases
415 416 417
 * HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET: Some IP blocks have a valid CLKCTRL
 *	offset of zero; this flag bit should be set in those cases to
 *	distinguish from hwmods that have no clkctrl offset.
418 419
 * HWMOD_OMAP4_CLKFWK_CLKCTR_CLOCK: Module clockctrl clock is managed
 *	by the common clock framework and not hwmod.
420 421
 */
#define HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT		(1 << 0)
422
#define HWMOD_OMAP4_ZERO_CLKCTRL_OFFSET		(1 << 1)
423
#define HWMOD_OMAP4_CLKFWK_CLKCTR_CLOCK		(1 << 2)
424 425 426

/**
 * struct omap_hwmod_omap4_prcm - OMAP4-specific PRCM data
427 428 429
 * @clkctrl_offs: offset of the PRCM clock control register
 * @rstctrl_offs: offset of the XXX_RSTCTRL register located in the PRM
 * @context_offs: offset of the RM_*_CONTEXT register
430
 * @lostcontext_mask: bitmask for selecting bits from RM_*_CONTEXT register
431
 * @rstst_reg: (AM33XX only) address of the XXX_RSTST register in the PRM
432
 * @submodule_wkdep_bit: bit shift of the WKDEP range
433
 * @flags: PRCM register capabilities for this IP block
434 435
 * @modulemode: allowable modulemodes
 * @context_lost_counter: Count of module level context lost
436 437 438 439 440
 *
 * If @lostcontext_mask is not defined, context loss check code uses
 * whole register without masking. @lostcontext_mask should only be
 * defined in cases where @context_offs register is shared by two or
 * more hwmods.
441 442
 */
struct omap_hwmod_omap4_prcm {
443
	u16		clkctrl_offs;
444
	u16		rstctrl_offs;
445
	u16		rstst_offs;
446
	u16		context_offs;
447
	u32		lostcontext_mask;
448
	u8		submodule_wkdep_bit;
449
	u8		modulemode;
450
	u8		flags;
451
	int		context_lost_counter;
452 453 454 455 456 457 458 459
};


/*
 * omap_hwmod.flags definitions
 *
 * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out
 *     of idle, rather than relying on module smart-idle
460 461
 * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and
 *     out of standby, rather than relying on module smart-standby
462
 * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
463
 *     SDRAM controller, etc. XXX probably belongs outside the main hwmod file
464
 *     XXX Should be HWMOD_SETUP_NO_RESET
465
 * HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM
466
 *     controller, etc. XXX probably belongs outside the main hwmod file
467
 *     XXX Should be HWMOD_SETUP_NO_IDLE
468
 * HWMOD_NO_OCP_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE)
469 470
 *     when module is enabled, rather than the default, which is to
 *     enable autoidle
471
 * HWMOD_SET_DEFAULT_CLOCKACT: program CLOCKACTIVITY bits at startup
472
 * HWMOD_NO_IDLEST: this module does not have idle status - this is the case
473
 *     only for few initiator modules on OMAP2 & 3.
474 475 476 477
 * HWMOD_CONTROL_OPT_CLKS_IN_RESET: Enable all optional clocks during reset.
 *     This is needed for devices like DSS that require optional clocks enabled
 *     in order to complete the reset. Optional clocks will be disabled
 *     again after the reset.
478
 * HWMOD_16BIT_REG: Module has 16bit registers
479 480 481 482 483
 * HWMOD_EXT_OPT_MAIN_CLK: The only main functional clock source for
 *     this IP block comes from an off-chip source and is not always
 *     enabled.  This prevents the hwmod code from being able to
 *     enable and reset the IP block early.  XXX Eventually it should
 *     be possible to query the clock framework for this information.
484 485 486 487 488 489 490 491
 * HWMOD_BLOCK_WFI: Some OMAP peripherals apparently don't work
 *     correctly if the MPU is allowed to go idle while the
 *     peripherals are active.  This is apparently true for the I2C on
 *     OMAP2420, and also the EMAC on AM3517/3505.  It's unlikely that
 *     this is really true -- we're probably not configuring something
 *     correctly, or this is being abused to deal with some PM latency
 *     issues -- but we're currently suffering from a shortage of
 *     folks who are able to track these issues down properly.
492 493 494 495
 * HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device
 *     is kept in force-standby mode. Failing to do so causes PM problems
 *     with musb on OMAP3630 at least. Note that musb has a dedicated register
 *     to control MSTANDBY signal when MIDLEMODE is set to force-standby.
496 497 498
 * HWMOD_SWSUP_SIDLE_ACT: omap_hwmod code should manually bring the module
 *     out of idle, but rely on smart-idle to the put it back in idle,
 *     so the wakeups are still functional (Only known case for now is UART)
499 500 501
 * HWMOD_RECONFIG_IO_CHAIN: omap_hwmod code needs to reconfigure wake-up 
 *     events by calling _reconfigure_io_chain() when a device is enabled
 *     or idled.
502 503
 * HWMOD_OPT_CLKS_NEEDED: The optional clocks are needed for the module to
 *     operate and they need to be handled at the same time as the main_clk.
504 505
 * HWMOD_NO_IDLE: Do not idle the hwmod at all. Useful to handle certain
 *     IPs like CPSW on DRA7, where clocks to this module cannot be disabled.
506 507 508 509
 * HWMOD_CLKDM_NOAUTO: Allows the hwmod's clockdomain to be prevented from
 *     entering HW_AUTO while hwmod is active. This is needed to workaround
 *     some modules which don't function correctly with HW_AUTO. For example,
 *     DCAN on DRA7x SoC needs this to workaround errata i893.
510 511 512 513 514
 */
#define HWMOD_SWSUP_SIDLE			(1 << 0)
#define HWMOD_SWSUP_MSTANDBY			(1 << 1)
#define HWMOD_INIT_NO_RESET			(1 << 2)
#define HWMOD_INIT_NO_IDLE			(1 << 3)
515 516
#define HWMOD_NO_OCP_AUTOIDLE			(1 << 4)
#define HWMOD_SET_DEFAULT_CLOCKACT		(1 << 5)
517
#define HWMOD_NO_IDLEST				(1 << 6)
518
#define HWMOD_CONTROL_OPT_CLKS_IN_RESET		(1 << 7)
519
#define HWMOD_16BIT_REG				(1 << 8)
520
#define HWMOD_EXT_OPT_MAIN_CLK			(1 << 9)
521
#define HWMOD_BLOCK_WFI				(1 << 10)
522
#define HWMOD_FORCE_MSTANDBY			(1 << 11)
523
#define HWMOD_SWSUP_SIDLE_ACT			(1 << 12)
524
#define HWMOD_RECONFIG_IO_CHAIN			(1 << 13)
525
#define HWMOD_OPT_CLKS_NEEDED			(1 << 14)
526
#define HWMOD_NO_IDLE				(1 << 15)
527
#define HWMOD_CLKDM_NOAUTO			(1 << 16)
528 529 530 531 532 533 534

/*
 * omap_hwmod._int_flags definitions
 * These are for internal use only and are managed by the omap_hwmod code.
 *
 * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module
 * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached
535 536
 * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) -
 *     causes the first call to _enable() to only update the pinmux
537 538
 */
#define _HWMOD_NO_MPU_PORT			(1 << 0)
539 540
#define _HWMOD_SYSCONFIG_LOADED			(1 << 1)
#define _HWMOD_SKIP_ENABLE			(1 << 2)
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557

/*
 * omap_hwmod._state definitions
 *
 * INITIALIZED: reset (optionally), initialized, enabled, disabled
 *              (optionally)
 *
 *
 */
#define _HWMOD_STATE_UNKNOWN			0
#define _HWMOD_STATE_REGISTERED			1
#define _HWMOD_STATE_CLKS_INITED		2
#define _HWMOD_STATE_INITIALIZED		3
#define _HWMOD_STATE_ENABLED			4
#define _HWMOD_STATE_IDLE			5
#define _HWMOD_STATE_DISABLED			6

558 559 560 561 562
/**
 * struct omap_hwmod_class - the type of an IP block
 * @name: name of the hwmod_class
 * @sysc: device SYSCONFIG/SYSSTATUS register data
 * @rev: revision of the IP class
563
 * @pre_shutdown: ptr to fn to be executed immediately prior to device shutdown
564
 * @reset: ptr to fn to be executed in place of the standard hwmod reset fn
565
 * @enable_preprogram:  ptr to fn to be executed during device enable
566 567
 * @lock: ptr to fn to be executed to lock IP registers
 * @unlock: ptr to fn to be executed to unlock IP registers
568 569 570
 *
 * Represent the class of a OMAP hardware "modules" (e.g. timer,
 * smartreflex, gpio, uart...)
571 572 573 574 575 576 577 578
 *
 * @pre_shutdown is a function that will be run immediately before
 * hwmod clocks are disabled, etc.  It is intended for use for hwmods
 * like the MPU watchdog, which cannot be disabled with the standard
 * omap_hwmod_shutdown().  The function should return 0 upon success,
 * or some negative error upon failure.  Returning an error will cause
 * omap_hwmod_shutdown() to abort the device shutdown and return an
 * error.
579 580 581 582 583
 *
 * If @reset is defined, then the function it points to will be
 * executed in place of the standard hwmod _reset() code in
 * mach-omap2/omap_hwmod.c.  This is needed for IP blocks which have
 * unusual reset sequences - usually processor IP blocks like the IVA.
584 585 586 587 588
 */
struct omap_hwmod_class {
	const char				*name;
	struct omap_hwmod_class_sysconfig	*sysc;
	u32					rev;
589
	int					(*pre_shutdown)(struct omap_hwmod *oh);
590
	int					(*reset)(struct omap_hwmod *oh);
591
	int					(*enable_preprogram)(struct omap_hwmod *oh);
592 593
	void					(*lock)(struct omap_hwmod *oh);
	void					(*unlock)(struct omap_hwmod *oh);
594 595
};

596 597 598
/**
 * struct omap_hwmod - integration data for OMAP hardware "modules" (IP blocks)
 * @name: name of the hwmod
599
 * @class: struct omap_hwmod_class * to the class of this hwmod
600
 * @od: struct omap_device currently associated with this hwmod (internal use)
601
 * @sdma_reqs: ptr to an array of System DMA request IDs
602
 * @prcm: PRCM data pertaining to this hwmod
603
 * @main_clk: main clock: OMAP clock name
604 605
 * @_clk: pointer to the main struct clk (filled in at runtime)
 * @opt_clks: other device clocks that drivers can request (0..*)
606
 * @voltdm: pointer to voltage domain (filled in at runtime)
607 608
 * @dev_attr: arbitrary device attributes that can be passed to the driver
 * @_sysc_cache: internal-use hwmod flags
609
 * @mpu_rt_idx: index of device address space for register target (for DT boot)
610
 * @_mpu_rt_va: cached register target start address (internal use)
611
 * @_mpu_port: cached MPU register target slave (internal use)
612 613 614 615 616 617
 * @opt_clks_cnt: number of @opt_clks
 * @master_cnt: number of @master entries
 * @slaves_cnt: number of @slave entries
 * @response_lat: device OCP response latency (in interface clock cycles)
 * @_int_flags: internal-use hwmod flags
 * @_state: internal-use hwmod state
P
Paul Walmsley 已提交
618
 * @_postsetup_state: internal-use state to leave the hwmod in after _setup()
619
 * @flags: hwmod flags (documented below)
620
 * @_lock: spinlock serializing operations on this hwmod
621
 * @node: list node for hwmod list (internal use)
622
 * @parent_hwmod: (temporary) a pointer to the hierarchical parent of this hwmod
623
 *
624 625 626 627
 * @main_clk refers to this module's "main clock," which for our
 * purposes is defined as "the functional clock needed for register
 * accesses to complete."  Modules may not have a main clock if the
 * interface clock also serves as a main clock.
628 629 630
 *
 * Parameter names beginning with an underscore are managed internally by
 * the omap_hwmod code and should not be set during initialization.
631 632
 *
 * @masters and @slaves are now deprecated.
633 634 635 636 637 638
 *
 * @parent_hwmod is temporary; there should be no need for it, as this
 * information should already be expressed in the OCP interface
 * structures.  @parent_hwmod is present as a workaround until we improve
 * handling for hwmods with multiple parents (e.g., OMAP4+ DSS with
 * multiple register targets across different interconnects).
639 640 641
 */
struct omap_hwmod {
	const char			*name;
642
	struct omap_hwmod_class		*class;
643
	struct omap_device		*od;
644
	struct omap_hwmod_dma_info	*sdma_reqs;
645
	struct omap_hwmod_rst_info	*rst_lines;
646 647 648 649
	union {
		struct omap_hwmod_omap2_prcm omap2;
		struct omap_hwmod_omap4_prcm omap4;
	}				prcm;
650
	const char			*main_clk;
651 652
	struct clk			*_clk;
	struct omap_hwmod_opt_clk	*opt_clks;
653
	const char			*clkdm_name;
654
	struct clockdomain		*clkdm;
655
	struct list_head		slave_ports; /* connect to *_TA */
656 657
	void				*dev_attr;
	u32				_sysc_cache;
658
	void __iomem			*_mpu_rt_va;
659
	spinlock_t			_lock;
660
	struct lock_class_key		hwmod_key; /* unique lock class */
661
	struct list_head		node;
662
	struct omap_hwmod_ocp_if	*_mpu_port;
663
	u32				flags;
664
	u8				mpu_rt_idx;
665
	u8				response_lat;
666
	u8				rst_lines_cnt;
667 668 669 670 671
	u8				opt_clks_cnt;
	u8				slaves_cnt;
	u8				hwmods_cnt;
	u8				_int_flags;
	u8				_state;
P
Paul Walmsley 已提交
672
	u8				_postsetup_state;
673
	struct omap_hwmod		*parent_hwmod;
674 675
};

676 677
struct device_node;

678
struct omap_hwmod *omap_hwmod_lookup(const char *name);
679 680
int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
			void *data);
681

682
int __init omap_hwmod_setup_one(const char *name);
683 684 685
int omap_hwmod_parse_module_range(struct omap_hwmod *oh,
				  struct device_node *np,
				  struct resource *res);
686 687 688 689 690

int omap_hwmod_enable(struct omap_hwmod *oh);
int omap_hwmod_idle(struct omap_hwmod *oh);
int omap_hwmod_shutdown(struct omap_hwmod *oh);

691 692
int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name);
int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name);
693

694 695
void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs);
u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs);
696
int omap_hwmod_softreset(struct omap_hwmod *oh);
697

698
int omap_hwmod_count_resources(struct omap_hwmod *oh, unsigned long flags);
699
int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res);
700
int omap_hwmod_fill_dma_resources(struct omap_hwmod *oh, struct resource *res);
701 702
int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
				   const char *name, struct resource *res);
703 704

struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh);
705
void __iomem *omap_hwmod_get_mpu_rt_va(struct omap_hwmod *oh);
706 707 708 709

int omap_hwmod_enable_wakeup(struct omap_hwmod *oh);
int omap_hwmod_disable_wakeup(struct omap_hwmod *oh);

710 711 712 713 714
int omap_hwmod_for_each_by_class(const char *classname,
				 int (*fn)(struct omap_hwmod *oh,
					   void *user),
				 void *user);

P
Paul Walmsley 已提交
715
int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state);
716
int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh);
P
Paul Walmsley 已提交
717

718 719
extern void __init omap_hwmod_init(void);

720 721
const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh);

722 723 724 725 726
/*
 *
 */

extern int omap_hwmod_aess_preprogram(struct omap_hwmod *oh);
727 728
void omap_hwmod_rtc_unlock(struct omap_hwmod *oh);
void omap_hwmod_rtc_lock(struct omap_hwmod *oh);
729

730 731 732 733 734 735 736
/*
 * Chip variant-specific hwmod init routines - XXX should be converted
 * to use initcalls once the initial boot ordering is straightened out
 */
extern int omap2420_hwmod_init(void);
extern int omap2430_hwmod_init(void);
extern int omap3xxx_hwmod_init(void);
737
extern int omap44xx_hwmod_init(void);
738
extern int omap54xx_hwmod_init(void);
739
extern int am33xx_hwmod_init(void);
740 741
extern int dm814x_hwmod_init(void);
extern int dm816x_hwmod_init(void);
742
extern int dra7xx_hwmod_init(void);
A
Afzal Mohammed 已提交
743
int am43xx_hwmod_init(void);
744

745 746
extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);

747
#endif