xref: /openbmc/linux/arch/arm/mach-omap2/prm.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
269d88a00SPaul Walmsley /*
359fb659bSPaul Walmsley  * OMAP2/3/4 Power/Reset Management (PRM) bitfield definitions
469d88a00SPaul Walmsley  *
5d9a16f9aSPaul Walmsley  * Copyright (C) 2007-2009, 2012 Texas Instruments, Inc.
60be1621aSBenoît Cousson  * Copyright (C) 2010 Nokia Corporation
769d88a00SPaul Walmsley  *
859fb659bSPaul Walmsley  * Paul Walmsley
969d88a00SPaul Walmsley  */
1059fb659bSPaul Walmsley #ifndef __ARCH_ARM_MACH_OMAP2_PRM_H
1159fb659bSPaul Walmsley #define __ARCH_ARM_MACH_OMAP2_PRM_H
1269d88a00SPaul Walmsley 
1369d88a00SPaul Walmsley #include "prcm-common.h"
1469d88a00SPaul Walmsley 
15d9a16f9aSPaul Walmsley # ifndef __ASSEMBLER__
1690129336STero Kristo extern struct omap_domain_base prm_base;
172541d15fSTero Kristo extern u16 prm_features;
183a1a388eSTero Kristo int omap_prcm_init(void);
19ab7b2ffcSTero Kristo int omap2_prcm_base_init(void);
20d9a16f9aSPaul Walmsley # endif
21d9a16f9aSPaul Walmsley 
222541d15fSTero Kristo /*
232541d15fSTero Kristo  * prm_features flag values
242541d15fSTero Kristo  *
252541d15fSTero Kristo  * PRM_HAS_IO_WAKEUP: has IO wakeup capability
262541d15fSTero Kristo  * PRM_HAS_VOLTAGE: has voltage domains
272541d15fSTero Kristo  */
28219595b6STero Kristo #define PRM_HAS_IO_WAKEUP	BIT(0)
29219595b6STero Kristo #define PRM_HAS_VOLTAGE		BIT(1)
30b13159afSPaul Walmsley 
31b13159afSPaul Walmsley /*
32b13159afSPaul Walmsley  * MAX_MODULE_SOFTRESET_WAIT: Maximum microseconds to wait for OMAP
33b13159afSPaul Walmsley  * module to softreset
34b13159afSPaul Walmsley  */
35b13159afSPaul Walmsley #define MAX_MODULE_SOFTRESET_WAIT		10000
36b13159afSPaul Walmsley 
37b13159afSPaul Walmsley /*
38b13159afSPaul Walmsley  * MAX_MODULE_HARDRESET_WAIT: Maximum microseconds to wait for an OMAP
39b13159afSPaul Walmsley  * submodule to exit hardreset
40b13159afSPaul Walmsley  */
41b13159afSPaul Walmsley #define MAX_MODULE_HARDRESET_WAIT		10000
42b13159afSPaul Walmsley 
43b13159afSPaul Walmsley /*
44b13159afSPaul Walmsley  * Register bitfields
45b13159afSPaul Walmsley  */
46b13159afSPaul Walmsley 
4769d88a00SPaul Walmsley /*
4869d88a00SPaul Walmsley  * 24XX: PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP
4969d88a00SPaul Walmsley  *
5069d88a00SPaul Walmsley  * 2430: PM_PWSTST_MDM
5169d88a00SPaul Walmsley  *
5269d88a00SPaul Walmsley  * 3430: PM_PWSTST_IVA2, PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_GFX,
5369d88a00SPaul Walmsley  *	 PM_PWSTST_DSS, PM_PWSTST_CAM, PM_PWSTST_PER, PM_PWSTST_EMU,
5469d88a00SPaul Walmsley  *	 PM_PWSTST_NEON
5569d88a00SPaul Walmsley  */
562fd0f75cSPaul Walmsley #define OMAP_INTRANSITION_MASK				(1 << 20)
5769d88a00SPaul Walmsley 
5869d88a00SPaul Walmsley 
5969d88a00SPaul Walmsley /*
6069d88a00SPaul Walmsley  * 24XX: PM_PWSTST_GFX, PM_PWSTST_DSP
6169d88a00SPaul Walmsley  *
6269d88a00SPaul Walmsley  * 2430: PM_PWSTST_MDM
6369d88a00SPaul Walmsley  *
6469d88a00SPaul Walmsley  * 3430: PM_PWSTST_IVA2, PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_GFX,
6569d88a00SPaul Walmsley  *	 PM_PWSTST_DSS, PM_PWSTST_CAM, PM_PWSTST_PER, PM_PWSTST_EMU,
6669d88a00SPaul Walmsley  *	 PM_PWSTST_NEON
6769d88a00SPaul Walmsley  */
6869d88a00SPaul Walmsley #define OMAP_POWERSTATEST_SHIFT				0
6969d88a00SPaul Walmsley #define OMAP_POWERSTATEST_MASK				(0x3 << 0)
7069d88a00SPaul Walmsley 
7169d88a00SPaul Walmsley /*
7269d88a00SPaul Walmsley  * 24XX: PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
7369d88a00SPaul Walmsley  *       PM_PWSTCTRL_DSP, PM_PWSTST_MPU
7469d88a00SPaul Walmsley  *
7569d88a00SPaul Walmsley  * 2430: PM_PWSTCTRL_MDM shared bits
7669d88a00SPaul Walmsley  *
7769d88a00SPaul Walmsley  * 3430: PM_PWSTCTRL_IVA2, PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE,
7869d88a00SPaul Walmsley  *	 PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM, PM_PWSTCTRL_PER,
7969d88a00SPaul Walmsley  *	 PM_PWSTCTRL_NEON shared bits
8069d88a00SPaul Walmsley  */
8169d88a00SPaul Walmsley #define OMAP_POWERSTATE_SHIFT				0
8269d88a00SPaul Walmsley #define OMAP_POWERSTATE_MASK				(0x3 << 0)
8369d88a00SPaul Walmsley 
842bb2a5d3SPaul Walmsley /*
852bb2a5d3SPaul Walmsley  * Standardized OMAP reset source bits
862bb2a5d3SPaul Walmsley  *
872bb2a5d3SPaul Walmsley  * To the extent these happen to match the hardware register bit
882bb2a5d3SPaul Walmsley  * shifts, it's purely coincidental.  Used by omap-wdt.c.
892bb2a5d3SPaul Walmsley  * OMAP_UNKNOWN_RST_SRC_ID_SHIFT is a special value, used whenever
902bb2a5d3SPaul Walmsley  * there are any bits remaining in the global PRM_RSTST register that
912bb2a5d3SPaul Walmsley  * haven't been identified, or when the PRM code for the current SoC
922bb2a5d3SPaul Walmsley  * doesn't know how to interpret the register.
932bb2a5d3SPaul Walmsley  */
942bb2a5d3SPaul Walmsley #define OMAP_GLOBAL_COLD_RST_SRC_ID_SHIFT			0
952bb2a5d3SPaul Walmsley #define OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT			1
962bb2a5d3SPaul Walmsley #define OMAP_SECU_VIOL_RST_SRC_ID_SHIFT				2
972bb2a5d3SPaul Walmsley #define OMAP_MPU_WD_RST_SRC_ID_SHIFT				3
982bb2a5d3SPaul Walmsley #define OMAP_SECU_WD_RST_SRC_ID_SHIFT				4
992bb2a5d3SPaul Walmsley #define OMAP_EXTWARM_RST_SRC_ID_SHIFT				5
1002bb2a5d3SPaul Walmsley #define OMAP_VDD_MPU_VM_RST_SRC_ID_SHIFT			6
1012bb2a5d3SPaul Walmsley #define OMAP_VDD_IVA_VM_RST_SRC_ID_SHIFT			7
1022bb2a5d3SPaul Walmsley #define OMAP_VDD_CORE_VM_RST_SRC_ID_SHIFT			8
1032bb2a5d3SPaul Walmsley #define OMAP_ICEPICK_RST_SRC_ID_SHIFT				9
1042bb2a5d3SPaul Walmsley #define OMAP_ICECRUSHER_RST_SRC_ID_SHIFT			10
1052bb2a5d3SPaul Walmsley #define OMAP_C2C_RST_SRC_ID_SHIFT				11
1062bb2a5d3SPaul Walmsley #define OMAP_UNKNOWN_RST_SRC_ID_SHIFT				12
1072bb2a5d3SPaul Walmsley 
108e24c3573SPaul Walmsley #ifndef __ASSEMBLER__
109e24c3573SPaul Walmsley 
110e24c3573SPaul Walmsley /**
1112bb2a5d3SPaul Walmsley  * struct prm_reset_src_map - map register bitshifts to standard bitshifts
1122bb2a5d3SPaul Walmsley  * @reg_shift: bitshift in the PRM reset source register
1132bb2a5d3SPaul Walmsley  * @std_shift: bitshift equivalent in the standard reset source list
1142bb2a5d3SPaul Walmsley  *
1152bb2a5d3SPaul Walmsley  * The fields are signed because -1 is used as a terminator.
116e24c3573SPaul Walmsley  */
1172bb2a5d3SPaul Walmsley struct prm_reset_src_map {
1182bb2a5d3SPaul Walmsley 	s8 reg_shift;
1192bb2a5d3SPaul Walmsley 	s8 std_shift;
1202bb2a5d3SPaul Walmsley };
1212bb2a5d3SPaul Walmsley 
1222bb2a5d3SPaul Walmsley /**
1232bb2a5d3SPaul Walmsley  * struct prm_ll_data - fn ptrs to per-SoC PRM function implementations
124e6d3a8b0SRajendra Nayak  * @read_reset_sources: ptr to the SoC PRM-specific get_reset_source impl
125e6d3a8b0SRajendra Nayak  * @was_any_context_lost_old: ptr to the SoC PRM context loss test fn
126e6d3a8b0SRajendra Nayak  * @clear_context_loss_flags_old: ptr to the SoC PRM context loss flag clear fn
127b550e47fSTero Kristo  * @late_init: ptr to the late init function
128efd44dc3STero Kristo  * @assert_hardreset: ptr to the SoC PRM hardreset assert impl
12937fb59d7STero Kristo  * @deassert_hardreset: ptr to the SoC PRM hardreset deassert impl
130e6d3a8b0SRajendra Nayak  *
131e6d3a8b0SRajendra Nayak  * XXX @was_any_context_lost_old and @clear_context_loss_flags_old are
132e6d3a8b0SRajendra Nayak  * deprecated.
1332bb2a5d3SPaul Walmsley  */
1342bb2a5d3SPaul Walmsley struct prm_ll_data {
1352bb2a5d3SPaul Walmsley 	u32 (*read_reset_sources)(void);
136e6d3a8b0SRajendra Nayak 	bool (*was_any_context_lost_old)(u8 part, s16 inst, u16 idx);
137e6d3a8b0SRajendra Nayak 	void (*clear_context_loss_flags_old)(u8 part, s16 inst, u16 idx);
138b550e47fSTero Kristo 	int (*late_init)(void);
139efd44dc3STero Kristo 	int (*assert_hardreset)(u8 shift, u8 part, s16 prm_mod, u16 offset);
14037fb59d7STero Kristo 	int (*deassert_hardreset)(u8 shift, u8 st_shift, u8 part, s16 prm_mod,
14137fb59d7STero Kristo 				  u16 offset, u16 st_offset);
14237fb59d7STero Kristo 	int (*is_hardreset_asserted)(u8 shift, u8 part, s16 prm_mod,
14337fb59d7STero Kristo 				     u16 offset);
14461c8621eSTero Kristo 	void (*reset_system)(void);
1459cb6d363STero Kristo 	int (*clear_mod_irqs)(s16 module, u8 regs, u32 wkst_mask);
146e9f1ddcdSTero Kristo 	u32 (*vp_check_txdone)(u8 vp_id);
147e9f1ddcdSTero Kristo 	void (*vp_clear_txdone)(u8 vp_id);
1482bb2a5d3SPaul Walmsley };
149e24c3573SPaul Walmsley 
150e24c3573SPaul Walmsley extern int prm_register(struct prm_ll_data *pld);
151e24c3573SPaul Walmsley extern int prm_unregister(struct prm_ll_data *pld);
152e24c3573SPaul Walmsley 
153efd44dc3STero Kristo int omap_prm_assert_hardreset(u8 shift, u8 part, s16 prm_mod, u16 offset);
15437fb59d7STero Kristo int omap_prm_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 prm_mod,
15537fb59d7STero Kristo 				u16 offset, u16 st_offset);
1561bc28b34STero Kristo int omap_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset);
157e6d3a8b0SRajendra Nayak extern bool prm_was_any_context_lost_old(u8 part, s16 inst, u16 idx);
158e6d3a8b0SRajendra Nayak extern void prm_clear_context_loss_flags_old(u8 part, s16 inst, u16 idx);
15961c8621eSTero Kristo void omap_prm_reset_system(void);
1602bb2a5d3SPaul Walmsley 
1619cb6d363STero Kristo int omap_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask);
1624984eeafSTero Kristo 
163e9f1ddcdSTero Kristo /*
164e9f1ddcdSTero Kristo  * Voltage Processor (VP) identifiers
165e9f1ddcdSTero Kristo  */
166e9f1ddcdSTero Kristo #define OMAP3_VP_VDD_MPU_ID	0
167e9f1ddcdSTero Kristo #define OMAP3_VP_VDD_CORE_ID	1
168e9f1ddcdSTero Kristo #define OMAP4_VP_VDD_CORE_ID	0
169e9f1ddcdSTero Kristo #define OMAP4_VP_VDD_IVA_ID	1
170e9f1ddcdSTero Kristo #define OMAP4_VP_VDD_MPU_ID	2
171e9f1ddcdSTero Kristo 
172e9f1ddcdSTero Kristo u32 omap_prm_vp_check_txdone(u8 vp_id);
173e9f1ddcdSTero Kristo void omap_prm_vp_clear_txdone(u8 vp_id);
174e9f1ddcdSTero Kristo 
175e24c3573SPaul Walmsley #endif
17669d88a00SPaul Walmsley 
1772bb2a5d3SPaul Walmsley 
17869d88a00SPaul Walmsley #endif
179