1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
259fb659bSPaul Walmsley /*
3139563adSPaul Walmsley * OMAP2xxx/3xxx-common Power/Reset Management (PRM) register definitions
459fb659bSPaul Walmsley *
5139563adSPaul Walmsley * Copyright (C) 2007-2009, 2011-2012 Texas Instruments, Inc.
659fb659bSPaul Walmsley * Copyright (C) 2008-2010 Nokia Corporation
759fb659bSPaul Walmsley * Paul Walmsley
859fb659bSPaul Walmsley *
959fb659bSPaul Walmsley * The PRM hardware modules on the OMAP2/3 are quite similar to each
1059fb659bSPaul Walmsley * other. The PRM on OMAP4 has a new register layout, and is handled
1159fb659bSPaul Walmsley * in a separate file.
1259fb659bSPaul Walmsley */
1359fb659bSPaul Walmsley #ifndef __ARCH_ARM_MACH_OMAP2_PRM2XXX_3XXX_H
1459fb659bSPaul Walmsley #define __ARCH_ARM_MACH_OMAP2_PRM2XXX_3XXX_H
1559fb659bSPaul Walmsley
1659fb659bSPaul Walmsley #include "prcm-common.h"
1759fb659bSPaul Walmsley #include "prm.h"
1859fb659bSPaul Walmsley
1959fb659bSPaul Walmsley /*
2059fb659bSPaul Walmsley * Module specific PRM register offsets from PRM_BASE + domain offset
2159fb659bSPaul Walmsley *
2259fb659bSPaul Walmsley * Use prm_{read,write}_mod_reg() with these registers.
2359fb659bSPaul Walmsley *
2459fb659bSPaul Walmsley * With a few exceptions, these are the register names beginning with
2559fb659bSPaul Walmsley * {PM,RM}_* on both OMAP2/3 SoC families.. (The exceptions are the
2659fb659bSPaul Walmsley * IRQSTATUS and IRQENABLE bits.)
2759fb659bSPaul Walmsley */
2859fb659bSPaul Walmsley
2959fb659bSPaul Walmsley /* Register offsets appearing on both OMAP2 and OMAP3 */
3059fb659bSPaul Walmsley
3159fb659bSPaul Walmsley #define OMAP2_RM_RSTCTRL 0x0050
3259fb659bSPaul Walmsley #define OMAP2_RM_RSTTIME 0x0054
3359fb659bSPaul Walmsley #define OMAP2_RM_RSTST 0x0058
3459fb659bSPaul Walmsley #define OMAP2_PM_PWSTCTRL 0x00e0
3559fb659bSPaul Walmsley #define OMAP2_PM_PWSTST 0x00e4
3659fb659bSPaul Walmsley
3759fb659bSPaul Walmsley #define PM_WKEN 0x00a0
3859fb659bSPaul Walmsley #define PM_WKEN1 PM_WKEN
3959fb659bSPaul Walmsley #define PM_WKST 0x00b0
4059fb659bSPaul Walmsley #define PM_WKST1 PM_WKST
4159fb659bSPaul Walmsley #define PM_WKDEP 0x00c8
4259fb659bSPaul Walmsley #define PM_EVGENCTRL 0x00d4
4359fb659bSPaul Walmsley #define PM_EVGENONTIM 0x00d8
4459fb659bSPaul Walmsley #define PM_EVGENOFFTIM 0x00dc
4559fb659bSPaul Walmsley
4659fb659bSPaul Walmsley
4759fb659bSPaul Walmsley #ifndef __ASSEMBLER__
48139563adSPaul Walmsley
49139563adSPaul Walmsley #include <linux/io.h>
5049815399SPaul Walmsley #include "powerdomain.h"
51139563adSPaul Walmsley
5259fb659bSPaul Walmsley /* Power/reset management domain register get/set */
omap2_prm_read_mod_reg(s16 module,u16 idx)53139563adSPaul Walmsley static inline u32 omap2_prm_read_mod_reg(s16 module, u16 idx)
54139563adSPaul Walmsley {
5590129336STero Kristo return readl_relaxed(prm_base.va + module + idx);
56139563adSPaul Walmsley }
57139563adSPaul Walmsley
omap2_prm_write_mod_reg(u32 val,s16 module,u16 idx)58139563adSPaul Walmsley static inline void omap2_prm_write_mod_reg(u32 val, s16 module, u16 idx)
59139563adSPaul Walmsley {
6090129336STero Kristo writel_relaxed(val, prm_base.va + module + idx);
61139563adSPaul Walmsley }
62139563adSPaul Walmsley
63139563adSPaul Walmsley /* Read-modify-write a register in a PRM module. Caller must lock */
omap2_prm_rmw_mod_reg_bits(u32 mask,u32 bits,s16 module,s16 idx)64139563adSPaul Walmsley static inline u32 omap2_prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module,
65139563adSPaul Walmsley s16 idx)
66139563adSPaul Walmsley {
67139563adSPaul Walmsley u32 v;
68139563adSPaul Walmsley
69139563adSPaul Walmsley v = omap2_prm_read_mod_reg(module, idx);
70139563adSPaul Walmsley v &= ~mask;
71139563adSPaul Walmsley v |= bits;
72139563adSPaul Walmsley omap2_prm_write_mod_reg(v, module, idx);
73139563adSPaul Walmsley
74139563adSPaul Walmsley return v;
75139563adSPaul Walmsley }
76139563adSPaul Walmsley
77139563adSPaul Walmsley /* Read a PRM register, AND it, and shift the result down to bit 0 */
omap2_prm_read_mod_bits_shift(s16 domain,s16 idx,u32 mask)78139563adSPaul Walmsley static inline u32 omap2_prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask)
79139563adSPaul Walmsley {
80139563adSPaul Walmsley u32 v;
81139563adSPaul Walmsley
82139563adSPaul Walmsley v = omap2_prm_read_mod_reg(domain, idx);
83139563adSPaul Walmsley v &= mask;
84139563adSPaul Walmsley v >>= __ffs(mask);
85139563adSPaul Walmsley
86139563adSPaul Walmsley return v;
87139563adSPaul Walmsley }
88139563adSPaul Walmsley
omap2_prm_set_mod_reg_bits(u32 bits,s16 module,s16 idx)89139563adSPaul Walmsley static inline u32 omap2_prm_set_mod_reg_bits(u32 bits, s16 module, s16 idx)
90139563adSPaul Walmsley {
91139563adSPaul Walmsley return omap2_prm_rmw_mod_reg_bits(bits, bits, module, idx);
92139563adSPaul Walmsley }
93139563adSPaul Walmsley
omap2_prm_clear_mod_reg_bits(u32 bits,s16 module,s16 idx)94139563adSPaul Walmsley static inline u32 omap2_prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
95139563adSPaul Walmsley {
96139563adSPaul Walmsley return omap2_prm_rmw_mod_reg_bits(bits, 0x0, module, idx);
97139563adSPaul Walmsley }
9859fb659bSPaul Walmsley
9959fb659bSPaul Walmsley /* These omap2_ PRM functions apply to both OMAP2 and 3 */
1001bc28b34STero Kristo int omap2_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset);
101efd44dc3STero Kristo int omap2_prm_assert_hardreset(u8 shift, u8 part, s16 prm_mod,
102efd44dc3STero Kristo u16 offset);
10337fb59d7STero Kristo int omap2_prm_deassert_hardreset(u8 rst_shift, u8 st_shift, u8 part,
10437fb59d7STero Kristo s16 prm_mod, u16 reset_offset,
10537fb59d7STero Kristo u16 st_offset);
10659fb659bSPaul Walmsley
10749815399SPaul Walmsley extern int omap2_pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank,
10849815399SPaul Walmsley u8 pwrst);
10949815399SPaul Walmsley extern int omap2_pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank,
11049815399SPaul Walmsley u8 pwrst);
11149815399SPaul Walmsley extern int omap2_pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank);
11249815399SPaul Walmsley extern int omap2_pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank);
11349815399SPaul Walmsley extern int omap2_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst);
11449815399SPaul Walmsley extern int omap2_pwrdm_wait_transition(struct powerdomain *pwrdm);
11549815399SPaul Walmsley
1164bd5259eSPaul Walmsley extern int omap2_clkdm_add_wkdep(struct clockdomain *clkdm1,
1174bd5259eSPaul Walmsley struct clockdomain *clkdm2);
1184bd5259eSPaul Walmsley extern int omap2_clkdm_del_wkdep(struct clockdomain *clkdm1,
1194bd5259eSPaul Walmsley struct clockdomain *clkdm2);
1204bd5259eSPaul Walmsley extern int omap2_clkdm_read_wkdep(struct clockdomain *clkdm1,
1214bd5259eSPaul Walmsley struct clockdomain *clkdm2);
1224bd5259eSPaul Walmsley extern int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm);
1234bd5259eSPaul Walmsley
124a5ebba6bSLinus Torvalds #endif /* __ASSEMBLER */
12559fb659bSPaul Walmsley
12659fb659bSPaul Walmsley /*
12759fb659bSPaul Walmsley * Bits common to specific registers
12859fb659bSPaul Walmsley *
12959fb659bSPaul Walmsley * The 3430 register and bit names are generally used,
13059fb659bSPaul Walmsley * since they tend to make more sense
13159fb659bSPaul Walmsley */
13259fb659bSPaul Walmsley
13359fb659bSPaul Walmsley /* PM_EVGENONTIM_MPU */
13459fb659bSPaul Walmsley /* Named PM_EVEGENONTIM_MPU on the 24XX */
13559fb659bSPaul Walmsley #define OMAP_ONTIMEVAL_SHIFT 0
13659fb659bSPaul Walmsley #define OMAP_ONTIMEVAL_MASK (0xffffffff << 0)
13759fb659bSPaul Walmsley
13859fb659bSPaul Walmsley /* PM_EVGENOFFTIM_MPU */
13959fb659bSPaul Walmsley /* Named PM_EVEGENOFFTIM_MPU on the 24XX */
14059fb659bSPaul Walmsley #define OMAP_OFFTIMEVAL_SHIFT 0
14159fb659bSPaul Walmsley #define OMAP_OFFTIMEVAL_MASK (0xffffffff << 0)
14259fb659bSPaul Walmsley
14359fb659bSPaul Walmsley /* PRM_CLKSETUP and PRCM_VOLTSETUP */
14459fb659bSPaul Walmsley /* Named PRCM_CLKSSETUP on the 24XX */
14559fb659bSPaul Walmsley #define OMAP_SETUP_TIME_SHIFT 0
14659fb659bSPaul Walmsley #define OMAP_SETUP_TIME_MASK (0xffff << 0)
14759fb659bSPaul Walmsley
14859fb659bSPaul Walmsley /* PRM_CLKSRC_CTRL */
14959fb659bSPaul Walmsley /* Named PRCM_CLKSRC_CTRL on the 24XX */
15059fb659bSPaul Walmsley #define OMAP_SYSCLKDIV_SHIFT 6
15159fb659bSPaul Walmsley #define OMAP_SYSCLKDIV_MASK (0x3 << 6)
15299e7938dSRajendra Nayak #define OMAP_SYSCLKDIV_WIDTH 2
15359fb659bSPaul Walmsley #define OMAP_AUTOEXTCLKMODE_SHIFT 3
15459fb659bSPaul Walmsley #define OMAP_AUTOEXTCLKMODE_MASK (0x3 << 3)
15559fb659bSPaul Walmsley #define OMAP_SYSCLKSEL_SHIFT 0
15659fb659bSPaul Walmsley #define OMAP_SYSCLKSEL_MASK (0x3 << 0)
15759fb659bSPaul Walmsley
15859fb659bSPaul Walmsley /* PM_EVGENCTRL_MPU */
15959fb659bSPaul Walmsley #define OMAP_OFFLOADMODE_SHIFT 3
16059fb659bSPaul Walmsley #define OMAP_OFFLOADMODE_MASK (0x3 << 3)
16159fb659bSPaul Walmsley #define OMAP_ONLOADMODE_SHIFT 1
16259fb659bSPaul Walmsley #define OMAP_ONLOADMODE_MASK (0x3 << 1)
16359fb659bSPaul Walmsley #define OMAP_ENABLE_MASK (1 << 0)
16459fb659bSPaul Walmsley
16559fb659bSPaul Walmsley /* PRM_RSTTIME */
16659fb659bSPaul Walmsley /* Named RM_RSTTIME_WKUP on the 24xx */
16759fb659bSPaul Walmsley #define OMAP_RSTTIME2_SHIFT 8
16859fb659bSPaul Walmsley #define OMAP_RSTTIME2_MASK (0x1f << 8)
16959fb659bSPaul Walmsley #define OMAP_RSTTIME1_SHIFT 0
17059fb659bSPaul Walmsley #define OMAP_RSTTIME1_MASK (0xff << 0)
17159fb659bSPaul Walmsley
17259fb659bSPaul Walmsley /* PRM_RSTCTRL */
17359fb659bSPaul Walmsley /* Named RM_RSTCTRL_WKUP on the 24xx */
17459fb659bSPaul Walmsley /* 2420 calls RST_DPLL3 'RST_DPLL' */
17559fb659bSPaul Walmsley #define OMAP_RST_DPLL3_MASK (1 << 2)
17659fb659bSPaul Walmsley #define OMAP_RST_GS_MASK (1 << 1)
17759fb659bSPaul Walmsley
17859fb659bSPaul Walmsley
17959fb659bSPaul Walmsley /*
18059fb659bSPaul Walmsley * Bits common to module-shared registers
18159fb659bSPaul Walmsley *
18259fb659bSPaul Walmsley * Not all registers of a particular type support all of these bits -
18359fb659bSPaul Walmsley * check TRM if you are unsure
18459fb659bSPaul Walmsley */
18559fb659bSPaul Walmsley
18659fb659bSPaul Walmsley /*
18759fb659bSPaul Walmsley * 24XX: RM_RSTST_MPU and RM_RSTST_DSP - on 24XX, 'COREDOMAINWKUP_RST' is
18859fb659bSPaul Walmsley * called 'COREWKUP_RST'
18959fb659bSPaul Walmsley *
19059fb659bSPaul Walmsley * 3430: RM_RSTST_IVA2, RM_RSTST_MPU, RM_RSTST_GFX, RM_RSTST_DSS,
19159fb659bSPaul Walmsley * RM_RSTST_CAM, RM_RSTST_PER, RM_RSTST_NEON
19259fb659bSPaul Walmsley */
19359fb659bSPaul Walmsley #define OMAP_COREDOMAINWKUP_RST_MASK (1 << 3)
19459fb659bSPaul Walmsley
19559fb659bSPaul Walmsley /*
19659fb659bSPaul Walmsley * 24XX: RM_RSTST_MPU, RM_RSTST_GFX, RM_RSTST_DSP
19759fb659bSPaul Walmsley *
19859fb659bSPaul Walmsley * 2430: RM_RSTST_MDM
19959fb659bSPaul Walmsley *
20059fb659bSPaul Walmsley * 3430: RM_RSTST_CORE, RM_RSTST_EMU
20159fb659bSPaul Walmsley */
20259fb659bSPaul Walmsley #define OMAP_DOMAINWKUP_RST_MASK (1 << 2)
20359fb659bSPaul Walmsley
20459fb659bSPaul Walmsley /*
20559fb659bSPaul Walmsley * 24XX: RM_RSTST_MPU, RM_RSTST_WKUP, RM_RSTST_DSP
20659fb659bSPaul Walmsley * On 24XX, 'GLOBALWARM_RST' is called 'GLOBALWMPU_RST'.
20759fb659bSPaul Walmsley *
20859fb659bSPaul Walmsley * 2430: RM_RSTST_MDM
20959fb659bSPaul Walmsley *
21059fb659bSPaul Walmsley * 3430: RM_RSTST_CORE, RM_RSTST_EMU
21159fb659bSPaul Walmsley */
2122bb2a5d3SPaul Walmsley #define OMAP_GLOBALWARM_RST_SHIFT 1
21359fb659bSPaul Walmsley #define OMAP_GLOBALWARM_RST_MASK (1 << 1)
2142bb2a5d3SPaul Walmsley #define OMAP_GLOBALCOLD_RST_SHIFT 0
21559fb659bSPaul Walmsley #define OMAP_GLOBALCOLD_RST_MASK (1 << 0)
21659fb659bSPaul Walmsley
21759fb659bSPaul Walmsley /*
21859fb659bSPaul Walmsley * 24XX: PM_WKDEP_GFX, PM_WKDEP_MPU, PM_WKDEP_CORE, PM_WKDEP_DSP
21959fb659bSPaul Walmsley * 2420 TRM sometimes uses "EN_WAKEUP" instead of "EN_WKUP"
22059fb659bSPaul Walmsley *
22159fb659bSPaul Walmsley * 2430: PM_WKDEP_MDM
22259fb659bSPaul Walmsley *
22359fb659bSPaul Walmsley * 3430: PM_WKDEP_IVA2, PM_WKDEP_GFX, PM_WKDEP_DSS, PM_WKDEP_CAM,
22459fb659bSPaul Walmsley * PM_WKDEP_PER
22559fb659bSPaul Walmsley */
22659fb659bSPaul Walmsley #define OMAP_EN_WKUP_SHIFT 4
22759fb659bSPaul Walmsley #define OMAP_EN_WKUP_MASK (1 << 4)
22859fb659bSPaul Walmsley
22959fb659bSPaul Walmsley /*
23059fb659bSPaul Walmsley * 24XX: PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
23159fb659bSPaul Walmsley * PM_PWSTCTRL_DSP
23259fb659bSPaul Walmsley *
23359fb659bSPaul Walmsley * 2430: PM_PWSTCTRL_MDM
23459fb659bSPaul Walmsley *
23559fb659bSPaul Walmsley * 3430: PM_PWSTCTRL_IVA2, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
23659fb659bSPaul Walmsley * PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM, PM_PWSTCTRL_PER,
23759fb659bSPaul Walmsley * PM_PWSTCTRL_NEON
23859fb659bSPaul Walmsley */
23959fb659bSPaul Walmsley #define OMAP_LOGICRETSTATE_MASK (1 << 2)
24059fb659bSPaul Walmsley
24159fb659bSPaul Walmsley
24259fb659bSPaul Walmsley #endif
243