ARM: OMAP2+: CM/PRM cleanup set
Subsystems (5)
cover ARM: OMAP2+: CM/PRM cleanup set
Hi,
This set cleans up the CM/PRM codebase a bit, removing the need for direct CM/PRM register access macros outside CM/PRM drivers. This is done in preparation to isolate these drivers into its own driver directory. Currently my plan is to create a single PRCM driver, which will contain both, and as such, CM/PRM inter-access is not removed in this set.
This set is built on top of the OMAP2 DT clock conversion set, but most of the patches can also be standalone if need be.
Testing done:
- omap2 : none (any feedback welcome)
- omap3-beagle : boot, suspend-resume (RET), suspend-resume (OFF)
- omap4-panda-es : boot, suspend-resume (RET)
Branch also available here:
tree: https://github.com/t-kristo/linux-pm.git
branch: 3.14-rc4-cm-prm-cleanup
-Tero
PATCH 1/18 ARM: OMAP3: CM: remove a few OMAP34XX_CM_REGADDR defines
Remove a few OMAP34XX_CM_REGADDR defines and replace these with offset based register accesses instead.
--- arch/arm/mach-omap2/cm3xxx.c | 12 ++++++++---- arch/arm/mach-omap2/cm3xxx.h | 6 ++---- 2 files changed, 10 insertions(+), 8 deletions(-)
arch/arm/mach-omap2/cm3xxx.c +8 -4
@@ -388,7 +388,8 @@ void omap3_cm_save_context(void)omap2_cm_read_mod_reg (OMAP3430_IVA2_MOD ,CM_CLKSEL1 ); cm_context.iva2_cm_clksel2 =omap2_cm_read_mod_reg (OMAP3430_IVA2_MOD ,CM_CLKSEL2 ); - cm_context.cm_sysconfig =__raw_readl (OMAP3430_CM_SYSCONFIG ); + cm_context.cm_sysconfig = +omap2_cm_read_mod_reg (OCP_MOD ,OMAP3430_CM_SYSCONFIG ); cm_context.sgx_cm_clksel =omap2_cm_read_mod_reg (OMAP3430ES2_SGX_MOD ,CM_CLKSEL ); cm_context.dss_cm_clksel =
@@ -418,7 +419,8 @@ void omap3_cm_save_context(void)omap2_cm_read_mod_reg (PLL_MOD ,OMAP3430ES2_CM_CLKSEL5 ); cm_context.pll_cm_clken2 =omap2_cm_read_mod_reg (PLL_MOD ,OMAP3430ES2_CM_CLKEN2 ); - cm_context.cm_polctrl =__raw_readl (OMAP3430_CM_POLCTRL ); + cm_context.cm_polctrl = +omap2_cm_read_mod_reg (OCP_MOD ,OMAP3430_CM_POLCTRL ); cm_context.iva2_cm_fclken =omap2_cm_read_mod_reg (OMAP3430_IVA2_MOD ,CM_FCLKEN ); cm_context.iva2_cm_clken_pll =
@@ -519,7 +521,8 @@ void omap3_cm_restore_context(void) CM_CLKSEL1);omap2_cm_write_mod_reg (cm_context.iva2_cm_clksel2,OMAP3430_IVA2_MOD ,CM_CLKSEL2 ); -__raw_writel (cm_context.cm_sysconfig,OMAP3430_CM_SYSCONFIG ); +omap2_cm_write_mod_reg (cm_context.cm_sysconfig,OCP_MOD , +OMAP3430_CM_SYSCONFIG );omap2_cm_write_mod_reg (cm_context.sgx_cm_clksel,OMAP3430ES2_SGX_MOD ,CM_CLKSEL ); omap2_cm_write_mod_reg(cm_context.dss_cm_clksel, OMAP3430_DSS_MOD,
@@ -547,7 +550,8 @@ void omap3_cm_restore_context(void) OMAP3430ES2_CM_CLKSEL5);omap2_cm_write_mod_reg (cm_context.pll_cm_clken2,PLL_MOD ,OMAP3430ES2_CM_CLKEN2 ); -__raw_writel (cm_context.cm_polctrl,OMAP3430_CM_POLCTRL ); +omap2_cm_write_mod_reg (cm_context.cm_polctrl,OCP_MOD , +OMAP3430_CM_POLCTRL );omap2_cm_write_mod_reg (cm_context.iva2_cm_fclken,OMAP3430_IVA2_MOD ,CM_FCLKEN ); omap2_cm_write_mod_reg(cm_context.iva2_cm_clken_pll, OMAP3430_IVA2_MOD,
arch/arm/mach-omap2/cm3xxx.h +2 -4
@@ -29,12 +29,10 @@* These registers appear once per CM module. */ -#define OMAP3430_CM_REVISION OMAP34XX_CM_REGADDR(OCP_MOD, 0x0000) -#define OMAP3430_CM_SYSCONFIG OMAP34XX_CM_REGADDR(OCP_MOD, 0x0010) -#define OMAP3430_CM_POLCTRL OMAP34XX_CM_REGADDR(OCP_MOD, 0x009c) +#define OMAP3430_CM_SYSCONFIG 0x0010 +#define OMAP3430_CM_POLCTRL 0x009c#define OMAP3_CM_CLKOUT_CTRL_OFFSET 0x0070 -#define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070)/* * Module specific CM register offsets from CM_BASE + domain offset
Signature · 1 line
1.7.9.5
PATCH 2/18 ARM: OMAP2+: prcm: add omap_test_timeout to prcm-common.h
In reply to Tero KristoDone in preparation to move cm/prm to drivers. These will still use omap_test_timeout, but will not have access to common.h header under mach-omap2 anymore.
--- arch/arm/mach-omap2/prcm-common.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
arch/arm/mach-omap2/prcm-common.h +20 -0
@@ -429,6 +429,26 @@# ifndef __ASSEMBLER__/** +* omap_test_timeout - busy-loop, testing a condition +* @cond: condition to test until it evaluates to true +* @timeout: maximum number of microseconds in the timeout +* @index: loop index (integer) +* +* Loop waiting for @cond to become true or until at least @timeout +* microseconds have passed. To use, define some integer @index in the +* calling code. After running, if @index == @timeout, then the loop has +* timed out. +*/ +#define omap_test_timeout (cond, timeout, index) \ +({ \ + for (index = 0; index < timeout; index++) { \ + if (cond) \ + break; \ + udelay(1); \ + } \ +}) + +/** * struct omap_prcm_irq - describes a PRCM interrupt bit * @name: a short name describing the interrupt type, e.g. "wkup" or "io" * @offset: the bit shift of the interrupt inside the IRQ{ENABLE,STATUS} regs
Signature · 1 line
1.7.9.5
PATCH 3/18 ARM: OMAP2/3: CM: remove some external dependencies
In reply to Tero KristoDone in preparation to move the CM driver to its own driver folder. These drivers will not have access to functionality under mach-omap2 anymore.
--- arch/arm/mach-omap2/cm2xxx.c | 15 ++------------- arch/arm/mach-omap2/cm3xxx.c | 13 +------------ 2 files changed, 3 insertions(+), 25 deletions(-)
arch/arm/mach-omap2/cm2xxx.c +2 -13
@@ -18,9 +18,6 @@#include <linux/err.h> #include <linux/io.h> -#include "soc.h" -#include "iomap.h" -#include "common.h" #include "prm2xxx.h" #include "cm.h" #include "cm2xxx.h"
@@ -390,7 +387,7 @@ void omap2xxx_cm_set_mod_dividers(u32 mpu, u32 dsp, u32 gfx, u32 core, u32 mdm) tmp =omap2_cm_read_mod_reg (CORE_MOD ,CM_CLKSEL1 ) &OMAP24XX_CLKSEL_DSS2_MASK ;omap2_cm_write_mod_reg (core | tmp,CORE_MOD ,CM_CLKSEL1 ); -if (cpu_is_omap2430 ()) +if (mdm)omap2_cm_write_mod_reg (mdm,OMAP2430_MDM_MOD ,CM_CLKSEL ); }
@@ -405,19 +402,11 @@ static struct cm_ll_data omap2xxx_cm_ll_data = {int __init omap2xxx_cm_init (void ) { -if (!cpu_is_omap24xx ()) -return 0 ; -return cm_register (&omap2xxx_cm_ll_data); } static void __exit omap2xxx_cm_exit(void) { -if (!cpu_is_omap24xx ()) -return ; - -/* Should never happen */ -WARN (cm_unregister (&omap2xxx_cm_ll_data), -"%s: cm_ll_data function pointer mismatch\n" , __func__); +cm_unregister (&omap2xxx_cm_ll_data); }__exitcall (omap2xxx_cm_exit);
arch/arm/mach-omap2/cm3xxx.c +1 -12
@@ -18,9 +18,6 @@#include <linux/err.h> #include <linux/io.h> -#include "soc.h" -#include "iomap.h" -#include "common.h" #include "prm2xxx_3xxx.h" #include "cm.h" #include "cm3xxx.h"
@@ -673,19 +670,11 @@ static struct cm_ll_data omap3xxx_cm_ll_data = {int __init omap3xxx_cm_init (void ) { -if (!cpu_is_omap34xx ()) -return 0 ; -return cm_register (&omap3xxx_cm_ll_data); } static void __exit omap3xxx_cm_exit(void) { -if (!cpu_is_omap34xx ()) -return ; - -/* Should never happen */ -WARN (cm_unregister (&omap3xxx_cm_ll_data), -"%s: cm_ll_data function pointer mismatch\n" , __func__); +cm_unregister (&omap3xxx_cm_ll_data); }__exitcall (omap3xxx_cm_exit);
Signature · 1 line
1.7.9.5
PATCH 4/18 ARM: OMAP3: PRM: move prcm wakeup helper to prm driver
In reply to Tero KristoDone in preparation to make the prm an individual driver.
--- arch/arm/mach-omap2/pm34xx.c | 60 +++++------------------------------------ arch/arm/mach-omap2/prm3xxx.c | 53 ++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/prm3xxx.h | 1 + 3 files changed, 60 insertions(+), 54 deletions(-)
arch/arm/mach-omap2/pm34xx.c +6 -54
@@ -132,59 +132,11 @@ static void omap3_save_secure_ram_context(void) } } -/* -* PRCM Interrupt Handler Helper Function -* -* The purpose of this function is to clear any wake-up events latched -* in the PRCM PM_WKST_x registers. It is possible that a wake-up event -* may occur whilst attempting to clear a PM_WKST_x register and thus -* set another bit in this register. A while loop is used to ensure -* that any peripheral wake-up events occurring while attempting to -* clear the PM_WKST_x are detected and cleared. -*/ -static int prcm_clear_mod_irqs (s16 module,u8 regs,u32 ignore_bits) -{ -u32 wkst, fclk, iclk, clken; -u16 wkst_off = (regs ==3 ) ?OMAP3430ES2_PM_WKST3 :PM_WKST1 ; -u16 fclk_off = (regs ==3 ) ?OMAP3430ES2_CM_FCLKEN3 :CM_FCLKEN1 ; -u16 iclk_off = (regs ==3 ) ?CM_ICLKEN3 :CM_ICLKEN1 ; -u16 grpsel_off = (regs ==3 ) ? -OMAP3430ES2_PM_MPUGRPSEL3 :OMAP3430_PM_MPUGRPSEL ; -int c =0 ; - - wkst =omap2_prm_read_mod_reg (module, wkst_off); - wkst &=omap2_prm_read_mod_reg (module, grpsel_off); - wkst &= ~ignore_bits; -if (wkst) { - iclk =omap2_cm_read_mod_reg (module, iclk_off); - fclk =omap2_cm_read_mod_reg (module, fclk_off); -while (wkst) { - clken = wkst; -omap2_cm_set_mod_reg_bits (clken, module, iclk_off); -/* -* For USBHOST, we don't know whether HOST1 or -* HOST2 woke us up, so enable both f-clocks -*/ -if (module ==OMAP3430ES2_USBHOST_MOD ) - clken |=1 <<OMAP3430ES2_EN_USBHOST2_SHIFT ; -omap2_cm_set_mod_reg_bits (clken, module, fclk_off); -omap2_prm_write_mod_reg (wkst, module, wkst_off); - wkst =omap2_prm_read_mod_reg (module, wkst_off); - wkst &= ~ignore_bits; - c++; - } -omap2_cm_write_mod_reg (iclk, module, iclk_off); -omap2_cm_write_mod_reg (fclk, module, fclk_off); - } - -return c; -} -static irqreturn_t _prcm_int_handle_io (int irq,void *unused) {int c; - c =prcm_clear_mod_irqs (WKUP_MOD ,1 , + c =omap3xxx_prm_clear_mod_irqs (WKUP_MOD ,1 , ~(OMAP3430_ST_IO_MASK |OMAP3430_ST_IO_CHAIN_MASK ));return c ?IRQ_HANDLED :IRQ_NONE ;
@@ -199,13 +151,13 @@ static irqreturn_t _prcm_int_handle_wakeup(int irq, void *unused)* these are handled in a separate handler to avoid acking * IO events before parsing in mux code */ - c =prcm_clear_mod_irqs (WKUP_MOD ,1 , + c =omap3xxx_prm_clear_mod_irqs (WKUP_MOD ,1 ,OMAP3430_ST_IO_MASK |OMAP3430_ST_IO_CHAIN_MASK ); - c +=prcm_clear_mod_irqs (CORE_MOD ,1 ,0 ); - c +=prcm_clear_mod_irqs (OMAP3430_PER_MOD ,1 ,0 ); + c +=omap3xxx_prm_clear_mod_irqs (CORE_MOD ,1 ,0 ); + c +=omap3xxx_prm_clear_mod_irqs (OMAP3430_PER_MOD ,1 ,0 );if (omap_rev () >OMAP3430_REV_ES1_0 ) { - c +=prcm_clear_mod_irqs (CORE_MOD ,3 ,0 ); - c +=prcm_clear_mod_irqs (OMAP3430ES2_USBHOST_MOD ,1 ,0 ); + c +=omap3xxx_prm_clear_mod_irqs (CORE_MOD ,3 ,0 ); + c +=omap3xxx_prm_clear_mod_irqs (OMAP3430ES2_USBHOST_MOD ,1 ,0 ); }return c ?IRQ_HANDLED :IRQ_NONE ;
arch/arm/mach-omap2/prm3xxx.c +53 -0
65 lines not on this page · raw message
arch/arm/mach-omap2/prm3xxx.h +1 -0
@@ -162,6 +162,7 @@ extern void omap3xxx_prm_dpll3_reset(void);extern int __init omap3xxx_prm_init (void );extern u32 omap3xxx_prm_get_reset_sources (void ); +int omap3xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 ignore_bits);#endif /* __ASSEMBLER */
Signature · 1 line
1.7.9.5
PATCH 5/18 ARM: OMAP3: PRM: move iva reset to PRM driver
In reply to Tero KristoThis is a more proper isolation of the code. Done in preparation of making PRM an individual driver.
--- arch/arm/mach-omap2/pm34xx.c | 49 +---------------------------------------- arch/arm/mach-omap2/prm3xxx.c | 45 +++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/prm3xxx.h | 1 + 3 files changed, 47 insertions(+), 48 deletions(-)
arch/arm/mach-omap2/pm34xx.c +1 -48
@@ -350,53 +350,6 @@ restore:#endif /* CONFIG_SUSPEND */ - -/** -* omap3_iva_idle(): ensure IVA is in idle so it can be put into -* retention -* -* In cases where IVA2 is activated by bootcode, it may prevent -* full-chip retention or off-mode because it is not idle. This -* function forces the IVA2 into idle state so it can go -* into retention/off and thus allow full-chip retention/off. -* -**/ -static void __init omap3_iva_idle (void ) -{ -/* ensure IVA2 clock is disabled */ -omap2_cm_write_mod_reg (0 ,OMAP3430_IVA2_MOD ,CM_FCLKEN ); - -/* if no clock activity, nothing else to do */ -if (!(omap2_cm_read_mod_reg (OMAP3430_IVA2_MOD ,OMAP3430_CM_CLKSTST ) & -OMAP3430_CLKACTIVITY_IVA2_MASK )) -return ; - -/* Reset IVA2 */ -omap2_prm_write_mod_reg (OMAP3430_RST1_IVA2_MASK | -OMAP3430_RST2_IVA2_MASK | -OMAP3430_RST3_IVA2_MASK , -OMAP3430_IVA2_MOD ,OMAP2_RM_RSTCTRL ); - -/* Enable IVA2 clock */ -omap2_cm_write_mod_reg (OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK , -OMAP3430_IVA2_MOD ,CM_FCLKEN ); - -/* Set IVA2 boot mode to 'idle' */ -omap3_ctrl_set_iva_bootmode_idle (); - -/* Un-reset IVA2 */ -omap2_prm_write_mod_reg (0 ,OMAP3430_IVA2_MOD ,OMAP2_RM_RSTCTRL ); - -/* Disable IVA2 clock */ -omap2_cm_write_mod_reg (0 ,OMAP3430_IVA2_MOD ,CM_FCLKEN ); - -/* Reset IVA2 */ -omap2_prm_write_mod_reg (OMAP3430_RST1_IVA2_MASK | -OMAP3430_RST2_IVA2_MASK | -OMAP3430_RST3_IVA2_MASK , -OMAP3430_IVA2_MOD ,OMAP2_RM_RSTCTRL ); -} -static void __init omap3_d2d_idle (void ) {u16 mask, padconf;
@@ -500,7 +453,7 @@ static void __init prcm_setup_regs(void)/* * We need to idle iva2_pwrdm even on am3703 with no iva2. */ -omap3_iva_idle (); +omap3xxx_prm_iva_idle ();omap3_d2d_idle (); }
arch/arm/mach-omap2/prm3xxx.c +45 -0
57 lines not on this page · raw message
arch/arm/mach-omap2/prm3xxx.h +1 -0
@@ -163,6 +163,7 @@ extern void omap3xxx_prm_dpll3_reset(void);extern int __init omap3xxx_prm_init (void );extern u32 omap3xxx_prm_get_reset_sources (void );int omap3xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 ignore_bits); +void omap3xxx_prm_iva_idle (void );#endif /* __ASSEMBLER */
Signature · 1 line
1.7.9.5
PATCH 6/18 ARM: OMAP3: PRM: move modem reset to PRM driver
In reply to Tero KristoThis is a more proper isolation of the code. Done in preparation of making PRM an individual driver.
--- arch/arm/mach-omap2/pm34xx.c | 5 +---- arch/arm/mach-omap2/prm3xxx.c | 15 +++++++++++++++ arch/arm/mach-omap2/prm3xxx.h | 1 + 3 files changed, 17 insertions(+), 4 deletions(-)
arch/arm/mach-omap2/pm34xx.c +1 -4
@@ -368,10 +368,7 @@ static void __init omap3_d2d_idle(void)omap_ctrl_writew (padconf,OMAP3_PADCONF_SAD2D_IDLEACK );/* reset modem */ -omap2_prm_write_mod_reg (OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK | -OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK , -CORE_MOD ,OMAP2_RM_RSTCTRL ); -omap2_prm_write_mod_reg (0 ,CORE_MOD ,OMAP2_RM_RSTCTRL ); +omap3_prm_reset_modem (); }static void __init prcm_setup_regs (void )
arch/arm/mach-omap2/prm3xxx.c +15 -0
@@ -259,6 +259,21 @@ int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 ignore_bits) }/** +* omap3_prm_reset_modem - toggle reset signal for modem +* +* Toggles the reset signal to modem IP block. Required to allow +* OMAP3430 without stacked modem to idle properly. +*/ +void __init omap3_prm_reset_modem (void ) +{ +omap2_prm_write_mod_reg ( +OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK | +OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK , +CORE_MOD ,OMAP2_RM_RSTCTRL ); +omap2_prm_write_mod_reg (0 ,CORE_MOD ,OMAP2_RM_RSTCTRL ); +} + +/** * omap3xxx_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain * * Clear any previously-latched I/O wakeup events and ensure that the
arch/arm/mach-omap2/prm3xxx.h +1 -0
@@ -164,6 +164,7 @@ extern int __init omap3xxx_prm_init(void);extern u32 omap3xxx_prm_get_reset_sources (void );int omap3xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 ignore_bits);void omap3xxx_prm_iva_idle (void ); +void omap3_prm_reset_modem (void );#endif /* __ASSEMBLER */
Signature · 1 line
1.7.9.5
PATCH 7/18 ARM: OMAP2/3: CM: remove direct register access macros from common header
In reply to Tero KristoDone in preparation to move CM to be a driver of its own. This patch causes currently a build breakage which will be addressed in next patches.
--- arch/arm/mach-omap2/cm2xxx.c | 1 + arch/arm/mach-omap2/cm2xxx_3xxx.h | 48 ------------------- arch/arm/mach-omap2/cm2xxx_3xxx_private.h | 74 +++++++++++++++++++++++++++++ arch/arm/mach-omap2/cm3xxx.c | 1 + arch/arm/mach-omap2/prm3xxx.c | 2 +- 5 files changed, 77 insertions(+), 49 deletions(-) create mode 100644 arch/arm/mach-omap2/cm2xxx_3xxx_private.h
arch/arm/mach-omap2/cm2xxx.c +1 -0
@@ -20,6 +20,7 @@#include "prm2xxx.h" #include "cm.h" +#include "cm2xxx_3xxx_private.h" #include "cm2xxx.h" #include "cm-regbits-24xx.h" #include "clockdomain.h"
arch/arm/mach-omap2/cm2xxx_3xxx.h +0 -48
54 lines not on this page · raw message
arch/arm/mach-omap2/cm2xxx_3xxx_private.h new file +74 -0
74 lines not on this page · raw message
arch/arm/mach-omap2/cm3xxx.c +1 -0
@@ -20,6 +20,7 @@#include "prm2xxx_3xxx.h" #include "cm.h" +#include "cm2xxx_3xxx_private.h" #include "cm3xxx.h" #include "cm-regbits-34xx.h" #include "clockdomain.h"
arch/arm/mach-omap2/prm3xxx.c +1 -1
@@ -24,7 +24,7 @@#include "powerdomain.h" #include "prm3xxx.h" #include "prm2xxx_3xxx.h" -#include "cm2xxx_3xxx.h" +#include "cm2xxx_3xxx_private.h" #include "prm-regbits-34xx.h" #include "cm3xxx.h" #include "cm-regbits-34xx.h"
Signature · 1 line
1.7.9.5
PATCH 8/18 ARM: OMAP3: PRM: add API for checking and clearing cold reset status
In reply to Tero KristoThis isolates the PRM register access within the PRM driver.
--- arch/arm/mach-omap2/control.c | 6 +----- arch/arm/mach-omap2/prm3xxx.c | 20 ++++++++++++++++++++ arch/arm/mach-omap2/prm3xxx.h | 1 + 3 files changed, 22 insertions(+), 5 deletions(-)
arch/arm/mach-omap2/control.c +1 -5
@@ -282,13 +282,9 @@ void omap3_clear_scratchpad_contents(void)void __iomem *v_addr;u32 offset =0 ; v_addr =OMAP2_L4_IO_ADDRESS (OMAP343X_SCRATCHPAD_ROM ); -if (omap2_prm_read_mod_reg (OMAP3430_GR_MOD ,OMAP3_PRM_RSTST_OFFSET ) & -OMAP3430_GLOBAL_COLD_RST_MASK ) { +if (omap3xxx_prm_clear_global_cold_reset ()) {for ( ; offset <= max_offset; offset +=0x4 )__raw_writel (0x0 , (v_addr + offset)); -omap2_prm_set_mod_reg_bits (OMAP3430_GLOBAL_COLD_RST_MASK , -OMAP3430_GR_MOD , -OMAP3_PRM_RSTST_OFFSET ); } }
arch/arm/mach-omap2/prm3xxx.c +20 -0
@@ -388,6 +388,26 @@ void omap3xxx_prm_iva_idle(void) OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL); } +/** +* omap3xxx_prm_clear_global_cold_reset - checks the global cold reset status +* and clears it if asserted +* +* Checks if cold-reset has occurred and clears the status bit if yes. Returns +* 1 if cold-reset has occurred, 0 otherwise. +*/ +int omap3xxx_prm_clear_global_cold_reset (void ) +{ +if (omap2_prm_read_mod_reg (OMAP3430_GR_MOD ,OMAP3_PRM_RSTST_OFFSET ) & +OMAP3430_GLOBAL_COLD_RST_MASK ) { +omap2_prm_set_mod_reg_bits (OMAP3430_GLOBAL_COLD_RST_MASK , +OMAP3430_GR_MOD , +OMAP3_PRM_RSTST_OFFSET ); +return 1 ; + } + +return 0 ; +} +/* Powerdomain low-level functions */ static int omap3_pwrdm_set_next_pwrst (struct powerdomain *pwrdm,u8 pwrst)
arch/arm/mach-omap2/prm3xxx.h +1 -0
@@ -165,6 +165,7 @@ extern u32 omap3xxx_prm_get_reset_sources(void);int omap3xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 ignore_bits);void omap3xxx_prm_iva_idle (void );void omap3_prm_reset_modem (void ); +int omap3xxx_prm_clear_global_cold_reset (void );#endif /* __ASSEMBLER */
Signature · 1 line
1.7.9.5
PATCH 9/18 ARM: OMAP3: PRM: add API for saving PRM scratchpad contents
In reply to Tero KristoThis isolates the PRM register access within the PRM driver.
--- arch/arm/mach-omap2/control.c | 11 ++--------- arch/arm/mach-omap2/prm3xxx.c | 9 +++++++++ arch/arm/mach-omap2/prm3xxx.h | 1 + 3 files changed, 12 insertions(+), 9 deletions(-)
arch/arm/mach-omap2/control.c +2 -9
@@ -44,8 +44,7 @@ struct omap3_scratchpad { };struct omap3_scratchpad_prcm_block { -u32 prm_clksrc_ctrl; -u32 prm_clksel; +u32 prm_contents[2 ];u32 cm_contents[11 ];u32 prcm_block_size; };
@@ -327,13 +326,7 @@ void omap3_save_scratchpad_contents(void) scratchpad_contents.sdrc_block_offset =0x64 ;/* Populate the PRCM block contents */ - prcm_block_contents.prm_clksrc_ctrl = -omap2_prm_read_mod_reg (OMAP3430_GR_MOD , -OMAP3_PRM_CLKSRC_CTRL_OFFSET ); - prcm_block_contents.prm_clksel = -omap2_prm_read_mod_reg (OMAP3430_CCR_MOD , -OMAP3_PRM_CLKSEL_OFFSET ); - +omap3_prm_save_scratchpad_contents (prcm_block_contents.prm_contents);omap3_cm_save_scratchpad_contents (prcm_block_contents.cm_contents); prcm_block_contents.prcm_block_size =0x0 ;
arch/arm/mach-omap2/prm3xxx.c +9 -0
@@ -408,6 +408,15 @@ int omap3xxx_prm_clear_global_cold_reset(void)return 0 ; } +void omap3_prm_save_scratchpad_contents (u32 *ptr) +{ + *ptr++ =omap2_prm_read_mod_reg (OMAP3430_GR_MOD , +OMAP3_PRM_CLKSRC_CTRL_OFFSET ); + + *ptr++ =omap2_prm_read_mod_reg (OMAP3430_GR_MOD , +OMAP3_PRM_CLKSEL_OFFSET ); +} +/* Powerdomain low-level functions */ static int omap3_pwrdm_set_next_pwrst (struct powerdomain *pwrdm,u8 pwrst)
arch/arm/mach-omap2/prm3xxx.h +1 -0
@@ -166,6 +166,7 @@ int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 ignore_bits);void omap3xxx_prm_iva_idle (void );void omap3_prm_reset_modem (void );int omap3xxx_prm_clear_global_cold_reset (void ); +void omap3_prm_save_scratchpad_contents (u32 *ptr);#endif /* __ASSEMBLER */
Signature · 1 line
1.7.9.5
PATCH 10/18 ARM: OMAP24xx: PRM: add API for clearing wakeup status bits
In reply to Tero KristoThis helps to isolate the PRM into its own driver.
--- arch/arm/mach-omap2/pm24xx.c | 31 +++++++++++++------------------ arch/arm/mach-omap2/prm2xxx.c | 18 ++++++++++++++++++ arch/arm/mach-omap2/prm2xxx.h | 1 + 3 files changed, 32 insertions(+), 18 deletions(-)
arch/arm/mach-omap2/pm24xx.c +13 -18
@@ -75,9 +75,9 @@ static int omap2_enter_full_retention(void)/* Clear old wake-up events */ /* REVISIT: These write to reserved bits? */ -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,PM_WKST1 ); -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,OMAP24XX_PM_WKST2 ); -omap2_prm_write_mod_reg (0xffffffff ,WKUP_MOD ,PM_WKST ); +omap2xxx_prm_clear_mod_irqs (CORE_MOD ,PM_WKST1 , ~0 ); +omap2xxx_prm_clear_mod_irqs (CORE_MOD ,OMAP24XX_PM_WKST2 , ~0 ); +omap2xxx_prm_clear_mod_irqs (WKUP_MOD ,PM_WKST , ~0 );pwrdm_set_next_pwrst (core_pwrdm,PWRDM_POWER_RET );pwrdm_set_next_pwrst (mpu_pwrdm,PWRDM_POWER_RET );
@@ -104,23 +104,18 @@ no_sleep:clk_enable (osc_ck);/* clear CORE wake-up events */ -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,PM_WKST1 ); -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,OMAP24XX_PM_WKST2 ); +omap2xxx_prm_clear_mod_irqs (CORE_MOD ,PM_WKST1 , ~0 ); +omap2xxx_prm_clear_mod_irqs (CORE_MOD ,OMAP24XX_PM_WKST2 , ~0 );/* wakeup domain events - bit 1: GPT1, bit5 GPIO */ -omap2_prm_clear_mod_reg_bits (0x4 |0x1 ,WKUP_MOD ,PM_WKST ); +omap2xxx_prm_clear_mod_irqs (WKUP_MOD ,PM_WKST ,0x4 |0x1 );/* MPU domain wake events */ - l =omap2_prm_read_mod_reg (OCP_MOD ,OMAP2_PRCM_IRQSTATUS_MPU_OFFSET ); -if (l &0x01 ) -omap2_prm_write_mod_reg (0x01 ,OCP_MOD , -OMAP2_PRCM_IRQSTATUS_MPU_OFFSET ); -if (l &0x20 ) -omap2_prm_write_mod_reg (0x20 ,OCP_MOD , -OMAP2_PRCM_IRQSTATUS_MPU_OFFSET ); +omap2xxx_prm_clear_mod_irqs (OCP_MOD ,OMAP2_PRCM_IRQSTATUS_MPU_OFFSET , +0x1 ); -/* Mask future PRCM-to-MPU interrupts */ -omap2_prm_write_mod_reg (0x0 ,OCP_MOD ,OMAP2_PRCM_IRQSTATUS_MPU_OFFSET ); +omap2xxx_prm_clear_mod_irqs (OCP_MOD ,OMAP2_PRCM_IRQSTATUS_MPU_OFFSET , +0x20 );pwrdm_set_next_pwrst (mpu_pwrdm,PWRDM_POWER_ON );pwrdm_set_next_pwrst (core_pwrdm,PWRDM_POWER_ON );
@@ -148,9 +143,9 @@ static void omap2_enter_mpu_retention(void)* it is in retention mode. */ if (omap2_allow_mpu_retention ()) {/* REVISIT: These write to reserved bits? */ -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,PM_WKST1 ); -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,OMAP24XX_PM_WKST2 ); -omap2_prm_write_mod_reg (0xffffffff ,WKUP_MOD ,PM_WKST ); +omap2xxx_prm_clear_mod_irqs (CORE_MOD ,PM_WKST1 , ~0 ); +omap2xxx_prm_clear_mod_irqs (CORE_MOD ,OMAP24XX_PM_WKST2 , ~0 ); +omap2xxx_prm_clear_mod_irqs (WKUP_MOD ,PM_WKST , ~0 );/* Try to enter MPU retention */ pwrdm_set_next_pwrst (mpu_pwrdm,PWRDM_POWER_RET );
arch/arm/mach-omap2/prm2xxx.c +18 -0
@@ -117,6 +117,24 @@ void omap2xxx_prm_dpll_reset(void)omap2_prm_read_mod_reg (WKUP_MOD ,OMAP2_RM_RSTCTRL ); } +/** +* omap2xxx_prm_clear_mod_irqs - clear wakeup status bits for a module +* @module: PRM module to clear wakeups from +* @regs: register offset to clear +* @wkst_mask: wakeup status mask to clear +* +* Clears wakeup status bits for a given module, so that the device can +* re-enter idle. +*/ +void omap2xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 wkst_mask) +{ +u32 wkst; + + wkst =omap2_prm_read_mod_reg (module, regs); + wkst &= wkst_mask; +omap2_prm_write_mod_reg (wkst, module, regs); +} +int omap2xxx_clkdm_sleep (struct clockdomain *clkdm) { omap2_prm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK,
arch/arm/mach-omap2/prm2xxx.h +1 -0
@@ -125,6 +125,7 @@ extern int omap2xxx_clkdm_sleep(struct clockdomain *clkdm);extern int omap2xxx_clkdm_wakeup (struct clockdomain *clkdm);extern void omap2xxx_prm_dpll_reset (void ); +void omap2xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 wkst_mask);extern int __init omap2xxx_prm_init (void );
Signature · 1 line
1.7.9.5
PATCH 11/18 ARM: OMAP24xx: PRM: move PRM init code within PRM driver from PM core
In reply to Tero KristoDone to isolate the PRM as its own driver.
--- arch/arm/mach-omap2/pm24xx.c | 34 +-------------------------------- arch/arm/mach-omap2/prm2xxx.c | 42 +++++++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/prm2xxx.h | 1 + 3 files changed, 44 insertions(+), 33 deletions(-)
arch/arm/mach-omap2/pm24xx.c +1 -33
@@ -194,13 +194,6 @@ static void __init prcm_setup_regs(void)struct powerdomain *pwrdm;/* -* Enable autoidle -* XXX This should be handled by hwmod code or PRCM init code -*/ -omap2_prm_write_mod_reg (OMAP24XX_AUTOIDLE_MASK ,OCP_MOD , -OMAP2_PRCM_SYSCONFIG_OFFSET ); - -/* * Set CORE powerdomain memory banks to retain their contents * during RETENTION */
@@ -228,37 +221,12 @@ static void __init prcm_setup_regs(void) omap_pm_suspend = omap2_enter_full_retention;#endif -/* REVISIT: Configure number of 32 kHz clock cycles for sys_clk -* stabilisation */ -omap2_prm_write_mod_reg (15 <<OMAP_SETUP_TIME_SHIFT ,OMAP24XX_GR_MOD , -OMAP2_PRCM_CLKSSETUP_OFFSET ); - -/* Configure automatic voltage transition */ -omap2_prm_write_mod_reg (2 <<OMAP_SETUP_TIME_SHIFT ,OMAP24XX_GR_MOD , -OMAP2_PRCM_VOLTSETUP_OFFSET ); -omap2_prm_write_mod_reg (OMAP24XX_AUTO_EXTVOLT_MASK | - (0x1 <<OMAP24XX_SETOFF_LEVEL_SHIFT ) | -OMAP24XX_MEMRETCTRL_MASK | - (0x1 <<OMAP24XX_SETRET_LEVEL_SHIFT ) | - (0x0 <<OMAP24XX_VOLT_LEVEL_SHIFT ), -OMAP24XX_GR_MOD ,OMAP2_PRCM_VOLTCTRL_OFFSET ); - -/* Enable wake-up events */ -omap2_prm_write_mod_reg (OMAP24XX_EN_GPIOS_MASK |OMAP24XX_EN_GPT1_MASK , -WKUP_MOD ,PM_WKEN ); - -/* Enable SYS_CLKEN control when all domains idle */ -omap2_prm_set_mod_reg_bits (OMAP_AUTOEXTCLKMODE_MASK ,OMAP24XX_GR_MOD , -OMAP2_PRCM_CLKSRC_CTRL_OFFSET ); +omap2xxx_prm_init_pm (); }int __init omap2_pm_init (void ) { -u32 l; -printk (KERN_INFO "Power Management for OMAP2 initializing\n" ); - l =omap2_prm_read_mod_reg (OCP_MOD ,OMAP2_PRCM_REVISION_OFFSET ); -printk (KERN_INFO "PRCM revision %d.%d\n" , (l >>4 ) &0x0f , l &0x0f );/* Look up important powerdomains */
arch/arm/mach-omap2/prm2xxx.c +42 -0
48 lines not on this page · raw message
arch/arm/mach-omap2/prm2xxx.h +1 -0
@@ -126,6 +126,7 @@ extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm);extern void omap2xxx_prm_dpll_reset (void );void omap2xxx_prm_clear_mod_irqs (s16 module,u8 regs,u32 wkst_mask); +void omap2xxx_prm_init_pm (void );extern int __init omap2xxx_prm_init (void );
Signature · 1 line
1.7.9.5
PATCH 12/18 ARM: OMAP3: PM: remove access to PRM_VOLTCTRL register
In reply to Tero KristoThere is a solitary write to this register every wakeup from off-mode, which isn't doing anything, so remove it.
--- arch/arm/mach-omap2/pm34xx.c | 4 ---- 1 file changed, 4 deletions(-)
arch/arm/mach-omap2/pm34xx.c +0 -4
@@ -282,10 +282,6 @@ void omap_sram_idle(void)omap3_sram_restore_context ();omap2_sms_restore_context (); } -if (core_next_state ==PWRDM_POWER_OFF ) -omap2_prm_clear_mod_reg_bits (OMAP3430_AUTO_OFF_MASK , -OMAP3430_GR_MOD , -OMAP3_PRM_VOLTCTRL_OFFSET ); }omap3_intc_resume_idle ();
Signature · 1 line
1.7.9.5
Tony Lindgren
maintainerPATCH 12/18 ARM: OMAP3: PM: remove access to PRM_VOLTCTRL register
Quoted 2 lines · Tero Kristo
There is a solitary write to this register every wakeup from off-mode, which isn't doing anything, so remove it.
Argh, this chunk of code is for sure the the thing that's blocking all the voltage scaling for idle modes that twl4030 is supposed to do!
AFAIK we must have AUTO_SLEEP, AUTO_RET and AUTO_OFF bits set in PRM_VOLTCTRL for twl4030 to scale anything. They must be set if we're scaling over I2C4 or using the pins as triggers. Unless these bits are set, VC won't send any SLEEP, RET or OFF commands.
Looks like we're not even set these bits anywhere like we should?
I think we should enabled these bits in vc.c init, and never clear?
Nishant and Kevin, any comments?
Quoted 23 lines
Signed-off-by Tero Kristo <[email protected]>--- arch/arm/mach-omap2/pm34xx.c | 4 ---- 1 file changed, 4 deletions(-)arch/arm/mach-omap2/pm34xx.c +0
-4@@ -282,10 +282,6 @@ void omap_sram_idle(void)omap3_sram_restore_context ();omap2_sms_restore_context (); } -if (core_next_state ==PWRDM_POWER_OFF ) -omap2_prm_clear_mod_reg_bits (OMAP3430_AUTO_OFF_MASK , -OMAP3430_GR_MOD , -OMAP3_PRM_VOLTCTRL_OFFSET ); }omap3_intc_resume_idle ();Signature · 1 line
1.7.9.5
PATCH 12/18 ARM: OMAP3: PM: remove access to PRM_VOLTCTRL register
Quoted 7 lines · Tony Lindgren
Quoted 2 lines · Tero Kristo
There is a solitary write to this register every wakeup from off-mode, which isn't doing anything, so remove it.
Argh, this chunk of code is for sure the the thing that's blocking all the voltage scaling for idle modes that twl4030 is supposed to do!
Quoted 8 lines
AFAIK we must have
AUTO_SLEEP,AUTO_RETandAUTO_OFFbits set inPRM_VOLTCTRLfor twl4030 to scale anything. They must be set if we're scaling over I2C4 or using the pins as triggers. Unless these bits are set, VC won't send any SLEEP, RET or OFF commands.Looks like we're not even set these bits anywhere like we should?
I think we should enabled these bits in
vc.cinit, and never clear?
The bits should be set according to the target sleep mode I believe, e.g. for retention we should set only AUTO_RET, and for off-mode AUTO_OFF. You can't have AUTO_OFF enabled if you are going to retention only as far as I recall, this potentially caused some problems.
-Tero
Quoted 26 lines
Nishant and Kevin, any comments?
Quoted 23 lines
Signed-off-by Tero Kristo <[email protected]>--- arch/arm/mach-omap2/pm34xx.c | 4 ---- 1 file changed, 4 deletions(-)arch/arm/mach-omap2/pm34xx.c +0
-5@@ -282,10 +282,6 @@ void omap_sram_idle(void)omap3_sram_restore_context ();omap2_sms_restore_context (); } -if (core_next_state ==PWRDM_POWER_OFF ) -omap2_prm_clear_mod_reg_bits (OMAP3430_AUTO_OFF_MASK , -OMAP3430_GR_MOD , -OMAP3_PRM_VOLTCTRL_OFFSET ); }omap3_intc_resume_idle (); --1.7.9.5
Tony Lindgren
maintainerPATCH 12/18 ARM: OMAP3: PM: remove access to PRM_VOLTCTRL register
Quoted 15 lines · Tero Kristo
Quoted 14 lines · Tony Lindgren
Quoted 2 lines · Tero Kristo
There is a solitary write to this register every wakeup from off-mode, which isn't doing anything, so remove it.
Argh, this chunk of code is for sure the the thing that's blocking all the voltage scaling for idle modes that twl4030 is supposed to do!
AFAIK we must have
AUTO_SLEEP,AUTO_RETandAUTO_OFFbits set inPRM_VOLTCTRLfor twl4030 to scale anything. They must be set if we're scaling over I2C4 or using the pins as triggers. Unless these bits are set, VC won't send any SLEEP, RET or OFF commands.Looks like we're not even set these bits anywhere like we should?
Quoted 7 lines
Quoted 1 line
I think we should enabled these bits in
vc.cinit, and never clear?The bits should be set according to the target sleep mode I believe, e.g. for retention we should set only
AUTO_RET, and for off-modeAUTO_OFF. You can't haveAUTO_OFFenabled if you are going to retention only as far as I recall, this potentially caused some problems.
OK. So it seems that the idle code needs to constantly modify this register based on the idle mode. Any ideas how the idle code is going to update this register? Register a callback using platform_data?
Regards,
Tony
PATCH 13/18 ARM: OMAP3: PRM: move PRM init code from PM core to the driver
In reply to Tero KristoHelps to isolate the PRM driver.
--- arch/arm/mach-omap2/pm34xx.c | 71 +------------------------------- arch/arm/mach-omap2/prm3xxx.c | 90 +++++++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/prm3xxx.h | 1 + 3 files changed, 92 insertions(+), 70 deletions(-)
arch/arm/mach-omap2/pm34xx.c +1 -70
@@ -369,79 +369,10 @@ static void __init omap3_d2d_idle(void)static void __init prcm_setup_regs (void ) { -u32 omap3630_en_uart4_mask =cpu_is_omap3630 () ? -OMAP3630_EN_UART4_MASK :0 ; -u32 omap3630_grpsel_uart4_mask =cpu_is_omap3630 () ? -OMAP3630_GRPSEL_UART4_MASK :0 ; -/* XXX This should be handled by hwmod code or SCM init code */ omap_ctrl_writel (OMAP3430_AUTOIDLE_MASK ,OMAP2_CONTROL_SYSCONFIG ); -/* -* Enable control of expternal oscillator through -* sys_clkreq. In the long run clock framework should -* take care of this. -*/ -omap2_prm_rmw_mod_reg_bits (OMAP_AUTOEXTCLKMODE_MASK , -1 <<OMAP_AUTOEXTCLKMODE_SHIFT , -OMAP3430_GR_MOD , -OMAP3_PRM_CLKSRC_CTRL_OFFSET ); - -/* setup wakup source */ -omap2_prm_write_mod_reg (OMAP3430_EN_IO_MASK |OMAP3430_EN_GPIO1_MASK | -OMAP3430_EN_GPT1_MASK |OMAP3430_EN_GPT12_MASK , -WKUP_MOD ,PM_WKEN ); -/* No need to write EN_IO, that is always enabled */ -omap2_prm_write_mod_reg (OMAP3430_GRPSEL_GPIO1_MASK | -OMAP3430_GRPSEL_GPT1_MASK | -OMAP3430_GRPSEL_GPT12_MASK , -WKUP_MOD ,OMAP3430_PM_MPUGRPSEL ); - -/* Enable PM_WKEN to support DSS LPR */ -omap2_prm_write_mod_reg (OMAP3430_PM_WKEN_DSS_EN_DSS_MASK , -OMAP3430_DSS_MOD ,PM_WKEN ); - -/* Enable wakeups in PER */ -omap2_prm_write_mod_reg (omap3630_en_uart4_mask | -OMAP3430_EN_GPIO2_MASK |OMAP3430_EN_GPIO3_MASK | -OMAP3430_EN_GPIO4_MASK |OMAP3430_EN_GPIO5_MASK | -OMAP3430_EN_GPIO6_MASK |OMAP3430_EN_UART3_MASK | -OMAP3430_EN_MCBSP2_MASK |OMAP3430_EN_MCBSP3_MASK | -OMAP3430_EN_MCBSP4_MASK , -OMAP3430_PER_MOD ,PM_WKEN ); -/* and allow them to wake up MPU */ -omap2_prm_write_mod_reg (omap3630_grpsel_uart4_mask | -OMAP3430_GRPSEL_GPIO2_MASK | -OMAP3430_GRPSEL_GPIO3_MASK | -OMAP3430_GRPSEL_GPIO4_MASK | -OMAP3430_GRPSEL_GPIO5_MASK | -OMAP3430_GRPSEL_GPIO6_MASK | -OMAP3430_GRPSEL_UART3_MASK | -OMAP3430_GRPSEL_MCBSP2_MASK | -OMAP3430_GRPSEL_MCBSP3_MASK | -OMAP3430_GRPSEL_MCBSP4_MASK , -OMAP3430_PER_MOD ,OMAP3430_PM_MPUGRPSEL ); - -/* Don't attach IVA interrupts */ -if (omap3_has_iva ()) { -omap2_prm_write_mod_reg (0 ,WKUP_MOD ,OMAP3430_PM_IVAGRPSEL ); -omap2_prm_write_mod_reg (0 ,CORE_MOD ,OMAP3430_PM_IVAGRPSEL1 ); -omap2_prm_write_mod_reg (0 ,CORE_MOD ,OMAP3430ES2_PM_IVAGRPSEL3 ); -omap2_prm_write_mod_reg (0 ,OMAP3430_PER_MOD , -OMAP3430_PM_IVAGRPSEL ); - } - -/* Clear any pending 'reset' flags */ -omap2_prm_write_mod_reg (0xffffffff ,MPU_MOD ,OMAP2_RM_RSTST ); -omap2_prm_write_mod_reg (0xffffffff ,CORE_MOD ,OMAP2_RM_RSTST ); -omap2_prm_write_mod_reg (0xffffffff ,OMAP3430_PER_MOD ,OMAP2_RM_RSTST ); -omap2_prm_write_mod_reg (0xffffffff ,OMAP3430_EMU_MOD ,OMAP2_RM_RSTST ); -omap2_prm_write_mod_reg (0xffffffff ,OMAP3430_NEON_MOD ,OMAP2_RM_RSTST ); -omap2_prm_write_mod_reg (0xffffffff ,OMAP3430_DSS_MOD ,OMAP2_RM_RSTST ); -omap2_prm_write_mod_reg (0xffffffff ,OMAP3430ES2_USBHOST_MOD ,OMAP2_RM_RSTST ); - -/* Clear any pending PRCM interrupts */ -omap2_prm_write_mod_reg (0 ,OCP_MOD ,OMAP3_PRM_IRQSTATUS_MPU_OFFSET ); +omap3_prm_init_pm (cpu_is_omap3630 (),omap3_has_iva ());/* * We need to idle iva2_pwrdm even on am3703 with no iva2.
arch/arm/mach-omap2/prm3xxx.c +90 -0
96 lines not on this page · raw message
arch/arm/mach-omap2/prm3xxx.h +1 -0
@@ -167,6 +167,7 @@ void omap3xxx_prm_iva_idle(void);void omap3_prm_reset_modem (void );int omap3xxx_prm_clear_global_cold_reset (void );void omap3_prm_save_scratchpad_contents (u32 *ptr); +void omap3_prm_init_pm (bool has_uart4,bool has_iva);#endif /* __ASSEMBLER */
Signature · 1 line
1.7.9.5
PATCH 14/18 ARM: OMAP2/3: PRM: split PRM header file to common and internal versions
In reply to Tero KristoInternal version contains the direct register access macros and should only be used by PRCM drivers.
--- arch/arm/mach-omap2/prm2xxx.c | 2 +- arch/arm/mach-omap2/prm2xxx_3xxx.c | 2 +- arch/arm/mach-omap2/prm2xxx_3xxx.h | 47 ----------------- arch/arm/mach-omap2/prm2xxx_3xxx_private.h | 77 ++++++++++++++++++++++++++++ arch/arm/mach-omap2/prm3xxx.c | 2 +- 5 files changed, 80 insertions(+), 50 deletions(-) create mode 100644 arch/arm/mach-omap2/prm2xxx_3xxx_private.h
arch/arm/mach-omap2/prm2xxx.c +1 -1
@@ -23,7 +23,7 @@#include "vp.h" #include "powerdomain.h" #include "clockdomain.h" -#include "prm2xxx.h" +#include "prm2xxx_3xxx_private.h" #include "cm2xxx_3xxx.h" #include "prm-regbits-24xx.h"
arch/arm/mach-omap2/prm2xxx_3xxx.c +1 -1
@@ -18,7 +18,7 @@#include "common.h" #include "powerdomain.h" -#include "prm2xxx_3xxx.h" +#include "prm2xxx_3xxx_private.h" #include "prm-regbits-24xx.h" #include "clockdomain.h"
arch/arm/mach-omap2/prm2xxx_3xxx.h +0 -47
53 lines not on this page · raw message
arch/arm/mach-omap2/prm2xxx_3xxx_private.h new file +77 -0
77 lines not on this page · raw message
arch/arm/mach-omap2/prm3xxx.c +1 -1
@@ -23,7 +23,7 @@#include "vp.h" #include "powerdomain.h" #include "prm3xxx.h" -#include "prm2xxx_3xxx.h" +#include "prm2xxx_3xxx_private.h" #include "cm2xxx_3xxx_private.h" #include "prm-regbits-34xx.h" #include "cm3xxx.h"
Signature · 1 line
1.7.9.5
PATCH 15/18 ARM: OMAP4+: PRM: make prm register access internal to PRM driver only
In reply to Tero KristoRemoved exported prototypes from the public header file for the direct register access. Also made a new driver API for clearing mpuss previous logic powerstate so that the register APIs are no longer needed.
--- arch/arm/mach-omap2/omap-mpuss-lowpower.c | 15 ++---------- arch/arm/mach-omap2/prm44xx.c | 2 +- arch/arm/mach-omap2/prminst44xx.c | 12 ++++++++++ arch/arm/mach-omap2/prminst44xx.h | 10 +------- arch/arm/mach-omap2/prminst44xx_private.h | 37 +++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 arch/arm/mach-omap2/prminst44xx_private.h
arch/arm/mach-omap2/omap-mpuss-lowpower.c +2 -13
@@ -144,17 +144,6 @@ static void scu_pwrst_prepare(unsigned int cpu_id, unsigned int cpu_state)__raw_writel (scu_pwr_st, pm_info->scu_sar_addr); } -/* Helper functions for MPUSS OSWR */ -static inline void mpuss_clear_prev_logic_pwrst (void ) -{ -u32 reg; - - reg =omap4_prminst_read_inst_reg (OMAP4430_PRM_PARTITION , -OMAP4430_PRM_MPU_INST ,OMAP4_RM_MPU_MPU_CONTEXT_OFFSET ); -omap4_prminst_write_inst_reg (reg,OMAP4430_PRM_PARTITION , -OMAP4430_PRM_MPU_INST ,OMAP4_RM_MPU_MPU_CONTEXT_OFFSET ); -} -static inline void cpu_clear_prev_logic_pwrst (unsigned int cpu_id) {u32 reg;
@@ -252,7 +241,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)* Check MPUSS next state and save interrupt controller if needed. * In MPUSS OSWR or device OFF, interrupt controller contest is lost. */ -mpuss_clear_prev_logic_pwrst (); +omap4_prminst_mpuss_clear_prev_logic_pwrst ();if ((pwrdm_read_next_pwrst (mpuss_pd) ==PWRDM_POWER_RET ) && (pwrdm_read_logic_retst (mpuss_pd) ==PWRDM_POWER_OFF )) save_state =2 ;
@@ -382,7 +371,7 @@ int __init omap4_mpuss_init(void)return -ENODEV ; }pwrdm_clear_all_prev_pwrst (mpuss_pd); -mpuss_clear_prev_logic_pwrst (); +omap4_prminst_mpuss_clear_prev_logic_pwrst ();/* Save device type on scratchpad for low level code to use */ if (omap_type () !=OMAP2_DEVICE_TYPE_GP )
arch/arm/mach-omap2/prm44xx.c +1 -1
@@ -26,7 +26,7 @@#include "prm44xx.h" #include "prm-regbits-44xx.h" #include "prcm44xx.h" -#include "prminst44xx.h" +#include "prminst44xx_private.h" #include "powerdomain.h" /* Static data */
arch/arm/mach-omap2/prminst44xx.c +12 -0
@@ -191,3 +191,15 @@ void omap4_prminst_global_warm_sw_reset(void)OMAP4430_PRM_DEVICE_INST , OMAP4_PRM_RSTCTRL_OFFSET); } + +void omap4_prminst_mpuss_clear_prev_logic_pwrst (void ) +{ +u32 reg; + + reg =omap4_prminst_read_inst_reg (OMAP4430_PRM_PARTITION , +OMAP4430_PRM_MPU_INST , +OMAP4_RM_MPU_MPU_CONTEXT_OFFSET ); +omap4_prminst_write_inst_reg (reg,OMAP4430_PRM_PARTITION , +OMAP4430_PRM_MPU_INST , +OMAP4_RM_MPU_MPU_CONTEXT_OFFSET ); +}
arch/arm/mach-omap2/prminst44xx.h +1 -9
@@ -12,15 +12,6 @@#ifndef __ARCH_ASM_MACH_OMAP2_PRMINST44XX_H#define __ARCH_ASM_MACH_OMAP2_PRMINST44XX_H -/* -* In an ideal world, we would not export these low-level functions, -* but this will probably take some time to fix properly -*/ -extern u32 omap4_prminst_read_inst_reg (u8 part,s16 inst,u16 idx); -extern void omap4_prminst_write_inst_reg (u32 val,u8 part,s16 inst,u16 idx); -extern u32 omap4_prminst_rmw_inst_reg_bits (u32 mask,u32 bits,u8 part, -s16 inst,u16 idx); -extern void omap4_prminst_global_warm_sw_reset (void ); extern int omap4_prminst_is_hardreset_asserted(u8 shift, u8 part, s16 inst,
@@ -29,6 +20,7 @@ extern int omap4_prminst_assert_hardreset(u8 shift, u8 part, s16 inst, u16 rstctrl_offs);extern int omap4_prminst_deassert_hardreset (u8 shift,u8 part,s16 inst,u16 rstctrl_offs); +void omap4_prminst_mpuss_clear_prev_logic_pwrst (void );extern void omap_prm_base_init (void );
arch/arm/mach-omap2/prminst44xx_private.h new file +25 -0
@@ -0,0 +1,25 @@ +/* +* OMAP4 Power/Reset Management (PRM) function prototypes +* +* Copyright (C) 2010 Nokia Corporation +* Copyright (C) 2011 Texas Instruments, Inc. +* Paul Walmsley +* +* 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. +*/ +#ifndef __ARCH_ARM_MACH_OMAP2_PRMINST44XX_PRIVATE_H +#define __ARCH_ARM_MACH_OMAP2_PRMINST44XX_PRIVATE_H + +#include "prminst44xx.h" + +/* +* In an ideal world, we would not export these low-level functions, +* but this will probably take some time to fix properly +*/ +u32 omap4_prminst_read_inst_reg (u8 part,s16 inst,u16 idx); +void omap4_prminst_write_inst_reg (u32 val,u8 part,s16 inst,u16 idx); +u32 omap4_prminst_rmw_inst_reg_bits (u32 mask,u32 bits,u8 part, +s16 inst,u16 idx); +#endif
Signature · 1 line
1.7.9.5
PATCH 16/18 ARM: OMAP3: control: add API for setting up the modem pads
In reply to Tero KristoThis patch moves the functionality from PM core to control driver.
--- arch/arm/mach-omap2/control.c | 26 ++++++++++++++++++++++++++ arch/arm/mach-omap2/control.h | 1 + arch/arm/mach-omap2/pm34xx.c | 15 +-------------- 3 files changed, 28 insertions(+), 14 deletions(-)
arch/arm/mach-omap2/control.c +26 -0
@@ -569,4 +569,30 @@ void omap3_ctrl_set_iva_bootmode_idle(void)omap_ctrl_writel (OMAP3_IVA2_BOOTMOD_IDLE , OMAP343X_CONTROL_IVA2_BOOTMOD); } + +/** +* omap3_ctrl_setup_d2d_padconf - setup stacked modem pads for idle +* +* Sets up the pads controlling the stacked modem in such way that the +* device can enter idle. +*/ +void omap3_ctrl_setup_d2d_padconf (void ) +{ +u16 mask, padconf; + +/* +* In a stand alone OMAP3430 where there is not a stacked +* modem for the D2D Idle Ack and D2D MStandby must be pulled +* high. S CONTROL_PADCONF_SAD2D_IDLEACK and +* CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. +*/ + mask = (1 <<4 ) | (1 <<3 );/* pull-up, enabled */ + padconf =omap_ctrl_readw (OMAP3_PADCONF_SAD2D_MSTANDBY ); + padconf |= mask; +omap_ctrl_writew (padconf,OMAP3_PADCONF_SAD2D_MSTANDBY ); + + padconf =omap_ctrl_readw (OMAP3_PADCONF_SAD2D_IDLEACK ); + padconf |= mask; +omap_ctrl_writew (padconf,OMAP3_PADCONF_SAD2D_IDLEACK ); +}#endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
arch/arm/mach-omap2/control.h +1 -0
@@ -428,6 +428,7 @@ extern void omap_ctrl_write_dsp_boot_mode(u8 bootmode);extern void omap3630_ctrl_disable_rta (void );extern int omap3_ctrl_save_padconf (void );extern void omap3_ctrl_set_iva_bootmode_idle (void ); +void omap3_ctrl_setup_d2d_padconf (void );extern void omap2_set_globals_control (void __iomem *ctrl,void __iomem *ctrl_pad);#else
arch/arm/mach-omap2/pm34xx.c +1 -14
@@ -348,20 +348,7 @@ restore:static void __init omap3_d2d_idle (void ) { -u16 mask, padconf; - -/* In a stand alone OMAP3430 where there is not a stacked -* modem for the D2D Idle Ack and D2D MStandby must be pulled -* high. S CONTROL_PADCONF_SAD2D_IDLEACK and -* CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. */ - mask = (1 <<4 ) | (1 <<3 );/* pull-up, enabled */ - padconf =omap_ctrl_readw (OMAP3_PADCONF_SAD2D_MSTANDBY ); - padconf |= mask; -omap_ctrl_writew (padconf,OMAP3_PADCONF_SAD2D_MSTANDBY ); - - padconf =omap_ctrl_readw (OMAP3_PADCONF_SAD2D_IDLEACK ); - padconf |= mask; -omap_ctrl_writew (padconf,OMAP3_PADCONF_SAD2D_IDLEACK ); +omap3_ctrl_setup_d2d_padconf ();/* reset modem */ omap3_prm_reset_modem ();
Signature · 1 line
1.7.9.5
PATCH 17/18 ARM: OMAP3: PRM: move modem reset and iva2 idle to PRM driver
In reply to Tero KristoDone in preparation to move PRM into its own driver.
--- arch/arm/mach-omap2/pm34xx.c | 15 --------------- arch/arm/mach-omap2/prm3xxx.c | 7 +++++++ 2 files changed, 7 insertions(+), 15 deletions(-)
arch/arm/mach-omap2/pm34xx.c +0 -15
@@ -346,27 +346,12 @@ restore:#endif /* CONFIG_SUSPEND */ -static void __init omap3_d2d_idle (void ) -{ -omap3_ctrl_setup_d2d_padconf (); - -/* reset modem */ -omap3_prm_reset_modem (); -} -static void __init prcm_setup_regs (void ) {/* XXX This should be handled by hwmod code or SCM init code */ omap_ctrl_writel (OMAP3430_AUTOIDLE_MASK ,OMAP2_CONTROL_SYSCONFIG );omap3_prm_init_pm (cpu_is_omap3630 (),omap3_has_iva ()); - -/* -* We need to idle iva2_pwrdm even on am3703 with no iva2. -*/ -omap3xxx_prm_iva_idle (); - -omap3_d2d_idle (); }void omap3_pm_off_mode_enable (int enable)
arch/arm/mach-omap2/prm3xxx.c +7 -0
@@ -361,6 +361,13 @@ void __init omap3_prm_init_pm(bool has_uart4, bool has_iva)/* Clear any pending PRCM interrupts */ omap2_prm_write_mod_reg (0 ,OCP_MOD ,OMAP3_PRM_IRQSTATUS_MPU_OFFSET ); + +/* We need to idle iva2_pwrdm even on am3703 with no iva2. */ +omap3xxx_prm_iva_idle (); + +omap3_ctrl_setup_d2d_padconf (); + +omap3_prm_reset_modem (); }/**
Signature · 1 line
1.7.9.5
PATCH 18/18 ARM: OMAP3: control: isolate control module init to its own function
In reply to Tero KristoControl module related PM initializations are now moved within control module driver. Done in preparation to isolate the code to its own driver.
--- arch/arm/mach-omap2/control.c | 19 +++++++++++++++++-- arch/arm/mach-omap2/control.h | 3 +-- arch/arm/mach-omap2/pm34xx.c | 3 +-- arch/arm/mach-omap2/prm3xxx.c | 6 ------ 4 files changed, 19 insertions(+), 12 deletions(-)
arch/arm/mach-omap2/control.c +17 -2
@@ -564,7 +564,7 @@ int omap3_ctrl_save_padconf(void)* Sets the bootmode for IVA2 to idle. This is needed by the PM code to * force disable IVA2 so that it does not prevent any low-power states. */ -void omap3_ctrl_set_iva_bootmode_idle (void ) +static void __init omap3_ctrl_set_iva_bootmode_idle (void ) {omap_ctrl_writel (OMAP3_IVA2_BOOTMOD_IDLE ,OMAP343X_CONTROL_IVA2_BOOTMOD );
@@ -576,7 +576,7 @@ void omap3_ctrl_set_iva_bootmode_idle(void)* Sets up the pads controlling the stacked modem in such way that the * device can enter idle. */ -void omap3_ctrl_setup_d2d_padconf (void ) +static void __init omap3_ctrl_setup_d2d_padconf (void ) {u16 mask, padconf;
@@ -595,4 +595,19 @@ void omap3_ctrl_setup_d2d_padconf(void) padconf |= mask; omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK); } + +/** +* omap3_ctrl_init - does static initializations for control module +* +* Initializes system control module. This sets up the sysconfig autoidle, +* and sets up modem and iva2 so that they can be idled properly. +*/ +void __init omap3_ctrl_init (void ) +{ +omap_ctrl_writel (OMAP3430_AUTOIDLE_MASK ,OMAP2_CONTROL_SYSCONFIG ); + +omap3_ctrl_set_iva_bootmode_idle (); + +omap3_ctrl_setup_d2d_padconf (); +}#endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
arch/arm/mach-omap2/control.h +1 -2
@@ -427,8 +427,7 @@ extern void omap_ctrl_write_dsp_boot_addr(u32 bootaddr);extern void omap_ctrl_write_dsp_boot_mode (u8 bootmode);extern void omap3630_ctrl_disable_rta (void );extern int omap3_ctrl_save_padconf (void ); -extern void omap3_ctrl_set_iva_bootmode_idle (void ); -void omap3_ctrl_setup_d2d_padconf (void ); +void omap3_ctrl_init (void );extern void omap2_set_globals_control (void __iomem *ctrl,void __iomem *ctrl_pad);#else
arch/arm/mach-omap2/pm34xx.c +1 -2
@@ -348,8 +348,7 @@ restore:static void __init prcm_setup_regs (void ) { -/* XXX This should be handled by hwmod code or SCM init code */ -omap_ctrl_writel (OMAP3430_AUTOIDLE_MASK ,OMAP2_CONTROL_SYSCONFIG ); +omap3_ctrl_init ();omap3_prm_init_pm (cpu_is_omap3630 (),omap3_has_iva ()); }
arch/arm/mach-omap2/prm3xxx.c +0 -6
@@ -28,7 +28,6 @@#include "prm-regbits-34xx.h" #include "cm3xxx.h" #include "cm-regbits-34xx.h" -#include "control.h" static const struct omap_prcm_irq omap3_prcm_irqs[] = {OMAP_PRCM_IRQ ("wkup" ,0 ,0 ),
@@ -365,8 +364,6 @@ void __init omap3_prm_init_pm(bool has_uart4, bool has_iva)/* We need to idle iva2_pwrdm even on am3703 with no iva2. */ omap3xxx_prm_iva_idle (); -omap3_ctrl_setup_d2d_padconf (); -omap3_prm_reset_modem (); }
@@ -469,9 +466,6 @@ void omap3xxx_prm_iva_idle(void)omap2_cm_write_mod_reg (OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK ,OMAP3430_IVA2_MOD ,CM_FCLKEN ); -/* Set IVA2 boot mode to 'idle' */ -omap3_ctrl_set_iva_bootmode_idle (); -/* Un-reset IVA2 */ omap2_prm_write_mod_reg (0 ,OMAP3430_IVA2_MOD ,OMAP2_RM_RSTCTRL );
Signature · 1 line
1.7.9.5
Tony Lindgren
maintainercover ARM: OMAP2+: CM/PRM cleanup set
In reply to Tero KristoQuoted 8 lines · Tero Kristo
Hi,
This set cleans up the CM/PRM codebase a bit, removing the need for direct CM/PRM register access macros outside CM/PRM drivers. This is done in preparation to isolate these drivers into its own driver directory. Currently my plan is to create a single PRCM driver, which will contain both, and as such, CM/PRM inter-access is not removed in this set.
Quoted 5 lines
This set is built on top of the OMAP2 DT clock conversion set, but most of the patches can also be standalone if need be.
Testing done:
- omap2 : none (any feedback welcome)
Seems to boot just fine on n8x0 and 2430sdp.
Quoted 1 line
- omap3-beagle : boot, suspend-resume (RET), suspend-resume (OFF)
Also tested that off-idle keeps working.
Quoted 5 lines
- omap4-panda-es : boot, suspend-resume (RET)
Branch also available here:
tree: https://github.com/t-kristo/linux-pm.git
branch: 3.14-rc4-cm-prm-cleanup
It seems that it's probably best that Paul queues or acks these once the dependencies are out of the way.
Regards,
Tony
cover ARM: OMAP2+: CM/PRM cleanup set
In reply to Tero KristoQuoted 20 lines · Tero Kristo
Hi,
This set cleans up the CM/PRM codebase a bit, removing the need for direct CM/PRM register access macros outside CM/PRM drivers. This is done in preparation to isolate these drivers into its own driver directory. Currently my plan is to create a single PRCM driver, which will contain both, and as such, CM/PRM inter-access is not removed in this set.
This set is built on top of the OMAP2 DT clock conversion set, but most of the patches can also be standalone if need be.
Testing done:
- omap2 : none (any feedback welcome)
- omap3-beagle : boot, suspend-resume (RET), suspend-resume (OFF)
- omap4-panda-es : boot, suspend-resume (RET)Branch also available here:
tree: https://github.com/t-kristo/linux-pm.git
branch: 3.14-rc4-cm-prm-cleanup
Quoted 7 lines
-Tero
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi,
This work is outdated and is preceded by the stuff here (for the interested parties):
https://github.com/t-kristo/linux-pm/tree/3.14-rc4-cm-prm-driver-wip
I'll be posting small sets of patches out of here once the pre-reqs for the WIP branch are covered.
-Tero