diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2014-11-20 12:06:19 +0100 | 
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2014-11-20 12:06:19 +0100 | 
| commit | 37f286e9085717c17a509fed977c0766244f80c9 (patch) | |
| tree | b65e183e1da89a4e8236b0bb0c813a9ee1940435 | |
| parent | 3cb0df93bce1538c01c3933bd4666078d84d123b (diff) | |
| parent | 61c8621e2bd14faad9b89ab2284955b28000bcd5 (diff) | |
Merge tag 'omap-for-v3.19/prcm-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/soc
Pull "omap prcm clean-up for v3.19" from Tony Lindgren:
Clean-up series for omap PRCM (Power Reset Clock Module) from
Tero Kristo to move things a bit closer to becoming a proper
device driver.
* tag 'omap-for-v3.19/prcm-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: (26 commits)
  ARM: OMAP2+: PRM: provide generic API for system reset
  ARM: OMAP3+: PRM: add generic API for reconfiguring I/O chain
  ARM: OMAP4: PRM: make PRCM interrupt handler related functions static
  ARM: OMAP3: PRM: make PRCM interrupt handler related functions static
  ARM: OMAP4: PRM: make omap4_prm_read/write_inst_reg calls static
  ARM: AM33xx: PRM: make direct register access functions static
  ARM: AM33xx: PRM: move global warm reset implementation to driver
  ARM: OMAP4+: CM: remove omap4_cm1/cm2_* functions
  ARM: OMAP4: CM: make cminst direct register access functions static
  ARM: OMAP4: CM: move public definitions from cminst44xx.h to cm44xx.h
  ARM: OMAP2+: PRM: add generic API for checking hardreset status
  ARM: OMAP2+: PRM: add generic API for deasserting hardware reset
  ARM: OMAP2+: PRM: add generic API for asserting hardware reset
  ARM: AM33xx: PRM: add support for prm_init
  ARM: AM43xx: hwmod: use OMAP4 hardreset ops instead of the AM33xx version
  ARM: AM33xx: hwmod: remove am33xx specific module SoC opts
  ARM: OMAP2/3: CM: make cm_split_idlest_reg SoC calls static
  ARM: OMAP2+: CM: add common APIs for cm_module_enable/disable
  ARM: OMAP2+: CM: make clkdm_hwsup operations static
  ARM: OMAP4+/AM33xx: CM: add common API for cm_wait_module_idle
  ...
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
41 files changed, 530 insertions, 586 deletions
| diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index d9e94122073e..3b653b3ac268 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -113,7 +113,7 @@ obj-y					+= prm_common.o cm_common.o  obj-$(CONFIG_ARCH_OMAP2)		+= prm2xxx_3xxx.o prm2xxx.o cm2xxx.o  obj-$(CONFIG_ARCH_OMAP3)		+= prm2xxx_3xxx.o prm3xxx.o cm3xxx.o  obj-$(CONFIG_ARCH_OMAP3)		+= vc3xxx_data.o vp3xxx_data.o -omap-prcm-4-5-common			=  cminst44xx.o cm44xx.o prm44xx.o \ +omap-prcm-4-5-common			=  cminst44xx.o prm44xx.o \  					   prcm_mpu44xx.o prminst44xx.o \  					   vc44xx_data.o vp44xx_data.o  obj-$(CONFIG_ARCH_OMAP4)		+= $(omap-prcm-4-5-common) diff --git a/arch/arm/mach-omap2/am33xx-restart.c b/arch/arm/mach-omap2/am33xx-restart.c index c88d8df753c2..5bace6a45ffb 100644 --- a/arch/arm/mach-omap2/am33xx-restart.c +++ b/arch/arm/mach-omap2/am33xx-restart.c @@ -9,8 +9,7 @@  #include <linux/reboot.h>  #include "common.h" -#include "prm-regbits-33xx.h" -#include "prm33xx.h" +#include "prm.h"  /**   * am3xx_restart - trigger a software restart of the SoC @@ -24,12 +23,5 @@ void am33xx_restart(enum reboot_mode mode, const char *cmd)  {  	/* TODO: Handle mode and cmd if necessary */ -	am33xx_prm_rmw_reg_bits(AM33XX_RST_GLOBAL_WARM_SW_MASK, -				AM33XX_RST_GLOBAL_WARM_SW_MASK, -				AM33XX_PRM_DEVICE_MOD, -				AM33XX_PRM_RSTCTRL_OFFSET); - -	/* OCP barrier */ -	(void)am33xx_prm_read_reg(AM33XX_PRM_DEVICE_MOD, -				  AM33XX_PRM_RSTCTRL_OFFSET); +	omap_prm_reset_system();  } diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index c2b239857cc4..6ad5b4dbd33e 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -171,7 +171,8 @@ static void _omap2_module_wait_ready(struct clk_hw_omap *clk)  		_wait_idlest_generic(clk, idlest_reg, (1 << idlest_bit),  				     idlest_val, __clk_get_name(clk->hw.clk));  	} else { -		cm_wait_module_ready(prcm_mod, idlest_reg_id, idlest_bit); +		omap_cm_wait_module_ready(0, prcm_mod, idlest_reg_id, +					  idlest_bit);  	};  } diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 93473f9a551c..6222e87a79b6 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h @@ -45,17 +45,29 @@ extern void omap2_set_globals_cm(void __iomem *cm, void __iomem *cm2);   * struct cm_ll_data - fn ptrs to per-SoC CM function implementations   * @split_idlest_reg: ptr to the SoC CM-specific split_idlest_reg impl   * @wait_module_ready: ptr to the SoC CM-specific wait_module_ready impl + * @wait_module_idle: ptr to the SoC CM-specific wait_module_idle impl + * @module_enable: ptr to the SoC CM-specific module_enable impl + * @module_disable: ptr to the SoC CM-specific module_disable impl   */  struct cm_ll_data {  	int (*split_idlest_reg)(void __iomem *idlest_reg, s16 *prcm_inst,  				u8 *idlest_reg_id); -	int (*wait_module_ready)(s16 prcm_mod, u8 idlest_id, u8 idlest_shift); +	int (*wait_module_ready)(u8 part, s16 prcm_mod, u16 idlest_reg, +				 u8 idlest_shift); +	int (*wait_module_idle)(u8 part, s16 prcm_mod, u16 idlest_reg, +				u8 idlest_shift); +	void (*module_enable)(u8 mode, u8 part, u16 inst, u16 clkctrl_offs); +	void (*module_disable)(u8 part, u16 inst, u16 clkctrl_offs);  };  extern int cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,  			       u8 *idlest_reg_id); -extern int cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift); - +int omap_cm_wait_module_ready(u8 part, s16 prcm_mod, u16 idlest_reg, +			      u8 idlest_shift); +int omap_cm_wait_module_idle(u8 part, s16 prcm_mod, u16 idlest_reg, +			     u8 idlest_shift); +int omap_cm_module_enable(u8 mode, u8 part, u16 inst, u16 clkctrl_offs); +int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs);  extern int cm_register(struct cm_ll_data *cld);  extern int cm_unregister(struct cm_ll_data *cld); diff --git a/arch/arm/mach-omap2/cm1_44xx.h b/arch/arm/mach-omap2/cm1_44xx.h index 5ae8fe39d6ee..a5949927b661 100644 --- a/arch/arm/mach-omap2/cm1_44xx.h +++ b/arch/arm/mach-omap2/cm1_44xx.h @@ -25,8 +25,6 @@  #ifndef __ARCH_ARM_MACH_OMAP2_CM1_44XX_H  #define __ARCH_ARM_MACH_OMAP2_CM1_44XX_H -#include "cm_44xx_54xx.h" -  /* CM1 base address */  #define OMAP4430_CM1_BASE		0x4a004000 diff --git a/arch/arm/mach-omap2/cm1_54xx.h b/arch/arm/mach-omap2/cm1_54xx.h index 90b3348e6672..fd245dfa7391 100644 --- a/arch/arm/mach-omap2/cm1_54xx.h +++ b/arch/arm/mach-omap2/cm1_54xx.h @@ -22,8 +22,6 @@  #ifndef __ARCH_ARM_MACH_OMAP2_CM1_54XX_H  #define __ARCH_ARM_MACH_OMAP2_CM1_54XX_H -#include "cm_44xx_54xx.h" -  /* CM1 base address */  #define OMAP54XX_CM_CORE_AON_BASE		0x4a004000 diff --git a/arch/arm/mach-omap2/cm1_7xx.h b/arch/arm/mach-omap2/cm1_7xx.h index ca6fa1febaac..2f1c09eea021 100644 --- a/arch/arm/mach-omap2/cm1_7xx.h +++ b/arch/arm/mach-omap2/cm1_7xx.h @@ -23,8 +23,6 @@  #ifndef __ARCH_ARM_MACH_OMAP2_CM1_7XX_H  #define __ARCH_ARM_MACH_OMAP2_CM1_7XX_H -#include "cm_44xx_54xx.h" -  /* CM1 base address */  #define DRA7XX_CM_CORE_AON_BASE		0x4a005000 diff --git a/arch/arm/mach-omap2/cm2_44xx.h b/arch/arm/mach-omap2/cm2_44xx.h index ee5136d7cdda..7521abf3d830 100644 --- a/arch/arm/mach-omap2/cm2_44xx.h +++ b/arch/arm/mach-omap2/cm2_44xx.h @@ -25,8 +25,6 @@  #ifndef __ARCH_ARM_MACH_OMAP2_CM2_44XX_H  #define __ARCH_ARM_MACH_OMAP2_CM2_44XX_H -#include "cm_44xx_54xx.h" -  /* CM2 base address */  #define OMAP4430_CM2_BASE		0x4a008000 diff --git a/arch/arm/mach-omap2/cm2_54xx.h b/arch/arm/mach-omap2/cm2_54xx.h index 2683231b299b..ff4040c196d8 100644 --- a/arch/arm/mach-omap2/cm2_54xx.h +++ b/arch/arm/mach-omap2/cm2_54xx.h @@ -21,8 +21,6 @@  #ifndef __ARCH_ARM_MACH_OMAP2_CM2_54XX_H  #define __ARCH_ARM_MACH_OMAP2_CM2_54XX_H -#include "cm_44xx_54xx.h" -  /* CM2 base address */  #define OMAP54XX_CM_CORE_BASE		0x4a008000 diff --git a/arch/arm/mach-omap2/cm2_7xx.h b/arch/arm/mach-omap2/cm2_7xx.h index e966e3a3c931..ce63fdb68056 100644 --- a/arch/arm/mach-omap2/cm2_7xx.h +++ b/arch/arm/mach-omap2/cm2_7xx.h @@ -22,8 +22,6 @@  #ifndef __ARCH_ARM_MACH_OMAP2_CM2_7XX_H  #define __ARCH_ARM_MACH_OMAP2_CM2_7XX_H -#include "cm_44xx_54xx.h" -  /* CM2 base address */  #define DRA7XX_CM_CORE_BASE		0x4a008000 diff --git a/arch/arm/mach-omap2/cm2xxx.c b/arch/arm/mach-omap2/cm2xxx.c index 8be6ea50c092..a96d901b1d5d 100644 --- a/arch/arm/mach-omap2/cm2xxx.c +++ b/arch/arm/mach-omap2/cm2xxx.c @@ -53,7 +53,7 @@ static void _write_clktrctrl(u8 c, s16 module, u32 mask)  	omap2_cm_write_mod_reg(v, module, OMAP2_CM_CLKSTCTRL);  } -bool omap2xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask) +static bool omap2xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask)  {  	u32 v; @@ -64,12 +64,12 @@ bool omap2xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask)  	return (v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO) ? 1 : 0;  } -void omap2xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask) +static void omap2xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask)  {  	_write_clktrctrl(OMAP24XX_CLKSTCTRL_ENABLE_AUTO, module, mask);  } -void omap2xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask) +static void omap2xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask)  {  	_write_clktrctrl(OMAP24XX_CLKSTCTRL_DISABLE_AUTO, module, mask);  } @@ -150,7 +150,7 @@ static int _omap2xxx_apll_enable(u8 enable_bit, u8 status_bit)  	v |= m;  	omap2_cm_write_mod_reg(v, PLL_MOD, CM_CLKEN); -	omap2xxx_cm_wait_module_ready(PLL_MOD, 1, status_bit); +	omap2xxx_cm_wait_module_ready(0, PLL_MOD, 1, status_bit);  	/*  	 * REVISIT: Should we return an error code if @@ -204,8 +204,9 @@ void omap2xxx_cm_apll96_disable(void)   * XXX This function is only needed until absolute register addresses are   * removed from the OMAP struct clk records.   */ -int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, -				 u8 *idlest_reg_id) +static int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, +					s16 *prcm_inst, +					u8 *idlest_reg_id)  {  	unsigned long offs;  	u8 idlest_offs; @@ -238,6 +239,7 @@ int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,  /**   * omap2xxx_cm_wait_module_ready - wait for a module to leave idle or standby + * @part: PRCM partition, ignored for OMAP2   * @prcm_mod: PRCM module offset   * @idlest_id: CM_IDLESTx register ID (i.e., x = 1, 2, 3)   * @idlest_shift: shift of the bit in the CM_IDLEST* register to check @@ -246,7 +248,8 @@ int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,   * (@prcm_mod, @idlest_id, @idlest_shift) is clocked.  Return 0 upon   * success or -EBUSY if the module doesn't enable in time.   */ -int omap2xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) +int omap2xxx_cm_wait_module_ready(u8 part, s16 prcm_mod, u16 idlest_id, +				  u8 idlest_shift)  {  	int ena = 0, i = 0;  	u8 cm_idlest_reg; diff --git a/arch/arm/mach-omap2/cm2xxx.h b/arch/arm/mach-omap2/cm2xxx.h index 891d81c3c8f4..c89502b168ae 100644 --- a/arch/arm/mach-omap2/cm2xxx.h +++ b/arch/arm/mach-omap2/cm2xxx.h @@ -46,9 +46,6 @@  #ifndef __ASSEMBLER__ -extern void omap2xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask); -extern void omap2xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask); -  extern void omap2xxx_cm_set_dpll_disable_autoidle(void);  extern void omap2xxx_cm_set_dpll_auto_low_power_stop(void); @@ -57,11 +54,8 @@ extern void omap2xxx_cm_set_apll54_auto_low_power_stop(void);  extern void omap2xxx_cm_set_apll96_disable_autoidle(void);  extern void omap2xxx_cm_set_apll96_auto_low_power_stop(void); -extern bool omap2xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask); -extern int omap2xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, -					 u8 idlest_shift); -extern int omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, -					s16 *prcm_inst, u8 *idlest_reg_id); +int omap2xxx_cm_wait_module_ready(u8 part, s16 prcm_mod, u16 idlest_id, +				  u8 idlest_shift);  extern int omap2xxx_cm_fclks_active(void);  extern int omap2xxx_cm_mpu_retention_allowed(void);  extern u32 omap2xxx_cm_get_core_clk_src(void); diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c index b3f99e93def0..b9ad463a368a 100644 --- a/arch/arm/mach-omap2/cm33xx.c +++ b/arch/arm/mach-omap2/cm33xx.c @@ -96,13 +96,12 @@ static inline u32 am33xx_cm_read_reg_bits(u16 inst, s16 idx, u32 mask)  /**   * _clkctrl_idlest - read a CM_*_CLKCTRL register; mask & shift IDLEST bitfield   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * Return the IDLEST bitfield of a CM_*_CLKCTRL register, shifted down to   * bit 0.   */ -static u32 _clkctrl_idlest(u16 inst, s16 cdoffs, u16 clkctrl_offs) +static u32 _clkctrl_idlest(u16 inst, u16 clkctrl_offs)  {  	u32 v = am33xx_cm_read_reg(inst, clkctrl_offs);  	v &= AM33XX_IDLEST_MASK; @@ -113,17 +112,16 @@ static u32 _clkctrl_idlest(u16 inst, s16 cdoffs, u16 clkctrl_offs)  /**   * _is_module_ready - can module registers be accessed without causing an abort?   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * Returns true if the module's CM_*_CLKCTRL.IDLEST bitfield is either   * *FUNCTIONAL or *INTERFACE_IDLE; false otherwise.   */ -static bool _is_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs) +static bool _is_module_ready(u16 inst, u16 clkctrl_offs)  {  	u32 v; -	v = _clkctrl_idlest(inst, cdoffs, clkctrl_offs); +	v = _clkctrl_idlest(inst, clkctrl_offs);  	return (v == CLKCTRL_IDLEST_FUNCTIONAL ||  		v == CLKCTRL_IDLEST_INTERFACE_IDLE) ? true : false; @@ -158,7 +156,7 @@ static void _clktrctrl_write(u8 c, u16 inst, u16 cdoffs)   * Returns true if the clockdomain referred to by (@inst, @cdoffs)   * is in hardware-supervised idle mode, or 0 otherwise.   */ -bool am33xx_cm_is_clkdm_in_hwsup(u16 inst, u16 cdoffs) +static bool am33xx_cm_is_clkdm_in_hwsup(u16 inst, u16 cdoffs)  {  	u32 v; @@ -177,7 +175,7 @@ bool am33xx_cm_is_clkdm_in_hwsup(u16 inst, u16 cdoffs)   * Put a clockdomain referred to by (@inst, @cdoffs) into   * hardware-supervised idle mode.  No return value.   */ -void am33xx_cm_clkdm_enable_hwsup(u16 inst, u16 cdoffs) +static void am33xx_cm_clkdm_enable_hwsup(u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_ENABLE_AUTO, inst, cdoffs);  } @@ -191,7 +189,7 @@ void am33xx_cm_clkdm_enable_hwsup(u16 inst, u16 cdoffs)   * software-supervised idle mode, i.e., controlled manually by the   * Linux OMAP clockdomain code.  No return value.   */ -void am33xx_cm_clkdm_disable_hwsup(u16 inst, u16 cdoffs) +static void am33xx_cm_clkdm_disable_hwsup(u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_DISABLE_AUTO, inst, cdoffs);  } @@ -204,7 +202,7 @@ void am33xx_cm_clkdm_disable_hwsup(u16 inst, u16 cdoffs)   * Put a clockdomain referred to by (@inst, @cdoffs) into idle   * No return value.   */ -void am33xx_cm_clkdm_force_sleep(u16 inst, u16 cdoffs) +static void am33xx_cm_clkdm_force_sleep(u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, inst, cdoffs);  } @@ -217,7 +215,7 @@ void am33xx_cm_clkdm_force_sleep(u16 inst, u16 cdoffs)   * Take a clockdomain referred to by (@inst, @cdoffs) out of idle,   * waking it up.  No return value.   */ -void am33xx_cm_clkdm_force_wakeup(u16 inst, u16 cdoffs) +static void am33xx_cm_clkdm_force_wakeup(u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, inst, cdoffs);  } @@ -228,20 +226,22 @@ void am33xx_cm_clkdm_force_wakeup(u16 inst, u16 cdoffs)  /**   * am33xx_cm_wait_module_ready - wait for a module to be in 'func' state + * @part: PRCM partition, ignored for AM33xx   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * @bit_shift: bit shift for the register, ignored for AM33xx   *   * Wait for the module IDLEST to be functional. If the idle state is in any   * the non functional state (trans, idle or disabled), module and thus the   * sysconfig cannot be accessed and will probably lead to an "imprecise   * external abort"   */ -int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs) +static int am33xx_cm_wait_module_ready(u8 part, s16 inst, u16 clkctrl_offs, +				       u8 bit_shift)  {  	int i = 0; -	omap_test_timeout(_is_module_ready(inst, cdoffs, clkctrl_offs), +	omap_test_timeout(_is_module_ready(inst, clkctrl_offs),  			  MAX_MODULE_READY_TIME, i);  	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; @@ -250,22 +250,24 @@ int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs)  /**   * am33xx_cm_wait_module_idle - wait for a module to be in 'disabled'   * state + * @part: CM partition, ignored for AM33xx   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * @bit_shift: bit shift for the register, ignored for AM33xx   *   * Wait for the module IDLEST to be disabled. Some PRCM transition,   * like reset assertion or parent clock de-activation must wait the   * module to be fully disabled.   */ -int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, u16 clkctrl_offs) +static int am33xx_cm_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs, +				      u8 bit_shift)  {  	int i = 0;  	if (!clkctrl_offs)  		return 0; -	omap_test_timeout((_clkctrl_idlest(inst, cdoffs, clkctrl_offs) == +	omap_test_timeout((_clkctrl_idlest(inst, clkctrl_offs) ==  				CLKCTRL_IDLEST_DISABLED),  				MAX_MODULE_READY_TIME, i); @@ -275,13 +277,14 @@ int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, u16 clkctrl_offs)  /**   * am33xx_cm_module_enable - Enable the modulemode inside CLKCTRL   * @mode: Module mode (SW or HW) + * @part: CM partition, ignored for AM33xx   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * No return value.   */ -void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, u16 clkctrl_offs) +static void am33xx_cm_module_enable(u8 mode, u8 part, u16 inst, +				    u16 clkctrl_offs)  {  	u32 v; @@ -293,13 +296,13 @@ void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, u16 clkctrl_offs)  /**   * am33xx_cm_module_disable - Disable the module inside CLKCTRL + * @part: CM partition, ignored for AM33xx   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * No return value.   */ -void am33xx_cm_module_disable(u16 inst, s16 cdoffs, u16 clkctrl_offs) +static void am33xx_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs)  {  	u32 v; @@ -362,3 +365,21 @@ struct clkdm_ops am33xx_clkdm_operations = {  	.clkdm_clk_enable	= am33xx_clkdm_clk_enable,  	.clkdm_clk_disable	= am33xx_clkdm_clk_disable,  }; + +static struct cm_ll_data am33xx_cm_ll_data = { +	.wait_module_ready	= &am33xx_cm_wait_module_ready, +	.wait_module_idle	= &am33xx_cm_wait_module_idle, +	.module_enable		= &am33xx_cm_module_enable, +	.module_disable		= &am33xx_cm_module_disable, +}; + +int __init am33xx_cm_init(void) +{ +	return cm_register(&am33xx_cm_ll_data); +} + +static void __exit am33xx_cm_exit(void) +{ +	cm_unregister(&am33xx_cm_ll_data); +} +__exitcall(am33xx_cm_exit); diff --git a/arch/arm/mach-omap2/cm33xx.h b/arch/arm/mach-omap2/cm33xx.h index bd2441790779..046b4b2bc9d9 100644 --- a/arch/arm/mach-omap2/cm33xx.h +++ b/arch/arm/mach-omap2/cm33xx.h @@ -374,41 +374,6 @@  #ifndef __ASSEMBLER__ -bool am33xx_cm_is_clkdm_in_hwsup(u16 inst, u16 cdoffs); -void am33xx_cm_clkdm_enable_hwsup(u16 inst, u16 cdoffs); -void am33xx_cm_clkdm_disable_hwsup(u16 inst, u16 cdoffs); -void am33xx_cm_clkdm_force_sleep(u16 inst, u16 cdoffs); -void am33xx_cm_clkdm_force_wakeup(u16 inst, u16 cdoffs); - -#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) -extern int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, -					u16 clkctrl_offs); -extern void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, -					u16 clkctrl_offs); -extern void am33xx_cm_module_disable(u16 inst, s16 cdoffs, -					u16 clkctrl_offs); -extern int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, -					u16 clkctrl_offs); -#else -static inline int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs, -					u16 clkctrl_offs) -{ -	return 0; -} -static inline void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs, -					u16 clkctrl_offs) -{ -} -static inline void am33xx_cm_module_disable(u16 inst, s16 cdoffs, -					u16 clkctrl_offs) -{ -} -static inline int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, -					u16 clkctrl_offs) -{ -	return 0; -} -#endif - +int am33xx_cm_init(void);  #endif /* ASSEMBLER */  #endif diff --git a/arch/arm/mach-omap2/cm3xxx.c b/arch/arm/mach-omap2/cm3xxx.c index 129a4e7f6ef5..ebead8f035f9 100644 --- a/arch/arm/mach-omap2/cm3xxx.c +++ b/arch/arm/mach-omap2/cm3xxx.c @@ -42,7 +42,7 @@ static void _write_clktrctrl(u8 c, s16 module, u32 mask)  	omap2_cm_write_mod_reg(v, module, OMAP2_CM_CLKSTCTRL);  } -bool omap3xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask) +static bool omap3xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask)  {  	u32 v; @@ -53,22 +53,22 @@ bool omap3xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask)  	return (v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ? 1 : 0;  } -void omap3xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask) +static void omap3xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask)  {  	_write_clktrctrl(OMAP34XX_CLKSTCTRL_ENABLE_AUTO, module, mask);  } -void omap3xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask) +static void omap3xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask)  {  	_write_clktrctrl(OMAP34XX_CLKSTCTRL_DISABLE_AUTO, module, mask);  } -void omap3xxx_cm_clkdm_force_sleep(s16 module, u32 mask) +static void omap3xxx_cm_clkdm_force_sleep(s16 module, u32 mask)  {  	_write_clktrctrl(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, module, mask);  } -void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask) +static void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask)  {  	_write_clktrctrl(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, module, mask);  } @@ -79,6 +79,7 @@ void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask)  /**   * omap3xxx_cm_wait_module_ready - wait for a module to leave idle or standby + * @part: PRCM partition, ignored for OMAP3   * @prcm_mod: PRCM module offset   * @idlest_id: CM_IDLESTx register ID (i.e., x = 1, 2, 3)   * @idlest_shift: shift of the bit in the CM_IDLEST* register to check @@ -87,7 +88,8 @@ void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask)   * (@prcm_mod, @idlest_id, @idlest_shift) is clocked.  Return 0 upon   * success or -EBUSY if the module doesn't enable in time.   */ -int omap3xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) +static int omap3xxx_cm_wait_module_ready(u8 part, s16 prcm_mod, u16 idlest_id, +					 u8 idlest_shift)  {  	int ena = 0, i = 0;  	u8 cm_idlest_reg; @@ -116,8 +118,9 @@ int omap3xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift)   * XXX This function is only needed until absolute register addresses are   * removed from the OMAP struct clk records.   */ -int omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, -				 u8 *idlest_reg_id) +static int omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, +					s16 *prcm_inst, +					u8 *idlest_reg_id)  {  	unsigned long offs;  	u8 idlest_offs; diff --git a/arch/arm/mach-omap2/cm3xxx.h b/arch/arm/mach-omap2/cm3xxx.h index 7a16b5598127..734a8581c0c4 100644 --- a/arch/arm/mach-omap2/cm3xxx.h +++ b/arch/arm/mach-omap2/cm3xxx.h @@ -68,18 +68,6 @@  #ifndef __ASSEMBLER__ -extern void omap3xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask); -extern void omap3xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask); -extern void omap3xxx_cm_clkdm_force_sleep(s16 module, u32 mask); -extern void omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask); - -extern bool omap3xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask); -extern int omap3xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, -					 u8 idlest_shift); - -extern int omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, -					s16 *prcm_inst, u8 *idlest_reg_id); -  extern void omap3_cm_save_context(void);  extern void omap3_cm_restore_context(void);  extern void omap3_cm_save_scratchpad_contents(u32 *ptr); diff --git a/arch/arm/mach-omap2/cm44xx.c b/arch/arm/mach-omap2/cm44xx.c deleted file mode 100644 index fe5cc7bae489..000000000000 --- a/arch/arm/mach-omap2/cm44xx.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * OMAP4 CM1, CM2 module low-level functions - * - * Copyright (C) 2010 Nokia Corporation - * 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. - * - * These functions are intended to be used only by the cminst44xx.c file. - * XXX Perhaps we should just move them there and make them static. - */ - -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/err.h> -#include <linux/io.h> - -#include "cm.h" -#include "cm1_44xx.h" -#include "cm2_44xx.h" - -/* CM1 hardware module low-level functions */ - -/* Read a register in CM1 */ -u32 omap4_cm1_read_inst_reg(s16 inst, u16 reg) -{ -	return readl_relaxed(cm_base + inst + reg); -} - -/* Write into a register in CM1 */ -void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 reg) -{ -	writel_relaxed(val, cm_base + inst + reg); -} - -/* Read a register in CM2 */ -u32 omap4_cm2_read_inst_reg(s16 inst, u16 reg) -{ -	return readl_relaxed(cm2_base + inst + reg); -} - -/* Write into a register in CM2 */ -void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 reg) -{ -	writel_relaxed(val, cm2_base + inst + reg); -} diff --git a/arch/arm/mach-omap2/cm44xx.h b/arch/arm/mach-omap2/cm44xx.h index 3380beeace6e..728d06a4af19 100644 --- a/arch/arm/mach-omap2/cm44xx.h +++ b/arch/arm/mach-omap2/cm44xx.h @@ -23,4 +23,7 @@  #define OMAP4_CM_CLKSTCTRL				0x0000  #define OMAP4_CM_STATICDEP				0x0004 +void omap_cm_base_init(void); +int omap4_cm_init(void); +  #endif diff --git a/arch/arm/mach-omap2/cm_44xx_54xx.h b/arch/arm/mach-omap2/cm_44xx_54xx.h deleted file mode 100644 index cbb211690321..000000000000 --- a/arch/arm/mach-omap2/cm_44xx_54xx.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * OMAP44xx and OMAP54xx CM1/CM2 function prototypes - * - * Copyright (C) 2009-2013 Texas Instruments, Inc. - * Copyright (C) 2009-2010 Nokia Corporation - * - * Paul Walmsley (paul@pwsan.com) - * Rajendra Nayak (rnayak@ti.com) - * Benoit Cousson (b-cousson@ti.com) - * - * This file is automatically generated from the OMAP hardware databases. - * We respectfully ask that any modifications to this file be coordinated - * with the public linux-omap@vger.kernel.org mailing list and the - * authors above to ensure that the autogeneration scripts are kept - * up-to-date with the file contents. - * - * 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_CM_44XX_54XX_H -#define __ARCH_ARM_MACH_OMAP2_CM_44XX_55XX_H - -/* CM1 Function prototypes */ -extern u32 omap4_cm1_read_inst_reg(s16 inst, u16 idx); -extern void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 idx); -extern u32 omap4_cm1_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); - -/* CM2 Function prototypes */ -extern u32 omap4_cm2_read_inst_reg(s16 inst, u16 idx); -extern void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 idx); -extern u32 omap4_cm2_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); - -#endif diff --git a/arch/arm/mach-omap2/cm_common.c b/arch/arm/mach-omap2/cm_common.c index 8f6c4710877e..8fe02fcedc48 100644 --- a/arch/arm/mach-omap2/cm_common.c +++ b/arch/arm/mach-omap2/cm_common.c @@ -72,9 +72,10 @@ int cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,  }  /** - * cm_wait_module_ready - wait for a module to leave idle or standby + * omap_cm_wait_module_ready - wait for a module to leave idle or standby + * @part: PRCM partition   * @prcm_mod: PRCM module offset - * @idlest_id: CM_IDLESTx register ID (i.e., x = 1, 2, 3) + * @idlest_reg: CM_IDLESTx register   * @idlest_shift: shift of the bit in the CM_IDLEST* register to check   *   * Wait for the PRCM to indicate that the module identified by @@ -83,7 +84,8 @@ int cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,   * no per-SoC wait_module_ready() function pointer has been registered   * or if the idlest register is unknown on the SoC.   */ -int cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) +int omap_cm_wait_module_ready(u8 part, s16 prcm_mod, u16 idlest_reg, +			      u8 idlest_shift)  {  	if (!cm_ll_data->wait_module_ready) {  		WARN_ONCE(1, "cm: %s: no low-level function defined\n", @@ -91,7 +93,79 @@ int cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift)  		return -EINVAL;  	} -	return cm_ll_data->wait_module_ready(prcm_mod, idlest_id, idlest_shift); +	return cm_ll_data->wait_module_ready(part, prcm_mod, idlest_reg, +					     idlest_shift); +} + +/** + * omap_cm_wait_module_idle - wait for a module to enter idle or standby + * @part: PRCM partition + * @prcm_mod: PRCM module offset + * @idlest_reg: CM_IDLESTx register + * @idlest_shift: shift of the bit in the CM_IDLEST* register to check + * + * Wait for the PRCM to indicate that the module identified by + * (@prcm_mod, @idlest_id, @idlest_shift) is no longer clocked.  Return + * 0 upon success, -EBUSY if the module doesn't enable in time, or + * -EINVAL if no per-SoC wait_module_idle() function pointer has been + * registered or if the idlest register is unknown on the SoC. + */ +int omap_cm_wait_module_idle(u8 part, s16 prcm_mod, u16 idlest_reg, +			     u8 idlest_shift) +{ +	if (!cm_ll_data->wait_module_idle) { +		WARN_ONCE(1, "cm: %s: no low-level function defined\n", +			  __func__); +		return -EINVAL; +	} + +	return cm_ll_data->wait_module_idle(part, prcm_mod, idlest_reg, +					    idlest_shift); +} + +/** + * omap_cm_module_enable - enable a module + * @mode: target mode for the module + * @part: PRCM partition + * @inst: PRCM instance + * @clkctrl_offs: CM_CLKCTRL register offset for the module + * + * Enables clocks for a module identified by (@part, @inst, @clkctrl_offs) + * making its IO space accessible. Return 0 upon success, -EINVAL if no + * per-SoC module_enable() function pointer has been registered. + */ +int omap_cm_module_enable(u8 mode, u8 part, u16 inst, u16 clkctrl_offs) +{ +	if (!cm_ll_data->module_enable) { +		WARN_ONCE(1, "cm: %s: no low-level function defined\n", +			  __func__); +		return -EINVAL; +	} + +	cm_ll_data->module_enable(mode, part, inst, clkctrl_offs); +	return 0; +} + +/** + * omap_cm_module_disable - disable a module + * @part: PRCM partition + * @inst: PRCM instance + * @clkctrl_offs: CM_CLKCTRL register offset for the module + * + * Disables clocks for a module identified by (@part, @inst, @clkctrl_offs) + * makings its IO space inaccessible. Return 0 upon success, -EINVAL if + * no per-SoC module_disable() function pointer has been registered. + */ +int omap_cm_module_disable(u8 part, u16 inst, u16 clkctrl_offs) +{ +	if (!cm_ll_data->module_disable) { +		WARN_ONCE(1, "cm: %s: no low-level function defined\n", +			  __func__); +		return -EINVAL; +	} + +	cm_ll_data->module_disable(part, inst, clkctrl_offs); +	return 0;  }  /** diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index 12aca56942c0..95a8cff66aff 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c @@ -26,7 +26,6 @@  #include "cm1_44xx.h"  #include "cm2_44xx.h"  #include "cm44xx.h" -#include "cminst44xx.h"  #include "cm-regbits-34xx.h"  #include "prcm44xx.h"  #include "prm44xx.h" @@ -74,17 +73,18 @@ void omap_cm_base_init(void)  /* Private functions */ +static u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx); +  /**   * _clkctrl_idlest - read a CM_*_CLKCTRL register; mask & shift IDLEST bitfield   * @part: PRCM partition ID that the CM_CLKCTRL register exists in   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * Return the IDLEST bitfield of a CM_*_CLKCTRL register, shifted down to   * bit 0.   */ -static u32 _clkctrl_idlest(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs) +static u32 _clkctrl_idlest(u8 part, u16 inst, u16 clkctrl_offs)  {  	u32 v = omap4_cminst_read_inst_reg(part, inst, clkctrl_offs);  	v &= OMAP4430_IDLEST_MASK; @@ -96,26 +96,23 @@ static u32 _clkctrl_idlest(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs)   * _is_module_ready - can module registers be accessed without causing an abort?   * @part: PRCM partition ID that the CM_CLKCTRL register exists in   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * Returns true if the module's CM_*_CLKCTRL.IDLEST bitfield is either   * *FUNCTIONAL or *INTERFACE_IDLE; false otherwise.   */ -static bool _is_module_ready(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs) +static bool _is_module_ready(u8 part, u16 inst, u16 clkctrl_offs)  {  	u32 v; -	v = _clkctrl_idlest(part, inst, cdoffs, clkctrl_offs); +	v = _clkctrl_idlest(part, inst, clkctrl_offs);  	return (v == CLKCTRL_IDLEST_FUNCTIONAL ||  		v == CLKCTRL_IDLEST_INTERFACE_IDLE) ? true : false;  } -/* Public functions */ -  /* Read a register in a CM instance */ -u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx) +static u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx)  {  	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||  	       part == OMAP4430_INVALID_PRCM_PARTITION || @@ -124,7 +121,7 @@ u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx)  }  /* Write into a register in a CM instance */ -void omap4_cminst_write_inst_reg(u32 val, u8 part, u16 inst, u16 idx) +static void omap4_cminst_write_inst_reg(u32 val, u8 part, u16 inst, u16 idx)  {  	BUG_ON(part >= OMAP4_MAX_PRCM_PARTITIONS ||  	       part == OMAP4430_INVALID_PRCM_PARTITION || @@ -133,8 +130,8 @@ void omap4_cminst_write_inst_reg(u32 val, u8 part, u16 inst, u16 idx)  }  /* Read-modify-write a register in CM1. Caller must lock */ -u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, u16 inst, -				   s16 idx) +static u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, u16 inst, +					  s16 idx)  {  	u32 v; @@ -146,17 +143,18 @@ u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, u16 inst,  	return v;  } -u32 omap4_cminst_set_inst_reg_bits(u32 bits, u8 part, u16 inst, s16 idx) +static u32 omap4_cminst_set_inst_reg_bits(u32 bits, u8 part, u16 inst, s16 idx)  {  	return omap4_cminst_rmw_inst_reg_bits(bits, bits, part, inst, idx);  } -u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, u16 inst, s16 idx) +static u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, u16 inst, +					    s16 idx)  {  	return omap4_cminst_rmw_inst_reg_bits(bits, 0x0, part, inst, idx);  } -u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx, u32 mask) +static u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx, u32 mask)  {  	u32 v; @@ -200,7 +198,7 @@ static void _clktrctrl_write(u8 c, u8 part, u16 inst, u16 cdoffs)   * Returns true if the clockdomain referred to by (@part, @inst, @cdoffs)   * is in hardware-supervised idle mode, or 0 otherwise.   */ -bool omap4_cminst_is_clkdm_in_hwsup(u8 part, u16 inst, u16 cdoffs) +static bool omap4_cminst_is_clkdm_in_hwsup(u8 part, u16 inst, u16 cdoffs)  {  	u32 v; @@ -220,7 +218,7 @@ bool omap4_cminst_is_clkdm_in_hwsup(u8 part, u16 inst, u16 cdoffs)   * Put a clockdomain referred to by (@part, @inst, @cdoffs) into   * hardware-supervised idle mode.  No return value.   */ -void omap4_cminst_clkdm_enable_hwsup(u8 part, u16 inst, u16 cdoffs) +static void omap4_cminst_clkdm_enable_hwsup(u8 part, u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_ENABLE_AUTO, part, inst, cdoffs);  } @@ -235,7 +233,7 @@ void omap4_cminst_clkdm_enable_hwsup(u8 part, u16 inst, u16 cdoffs)   * software-supervised idle mode, i.e., controlled manually by the   * Linux OMAP clockdomain code.  No return value.   */ -void omap4_cminst_clkdm_disable_hwsup(u8 part, u16 inst, u16 cdoffs) +static void omap4_cminst_clkdm_disable_hwsup(u8 part, u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_DISABLE_AUTO, part, inst, cdoffs);  } @@ -249,7 +247,7 @@ void omap4_cminst_clkdm_disable_hwsup(u8 part, u16 inst, u16 cdoffs)   * Take a clockdomain referred to by (@part, @inst, @cdoffs) out of idle,   * waking it up.  No return value.   */ -void omap4_cminst_clkdm_force_wakeup(u8 part, u16 inst, u16 cdoffs) +static void omap4_cminst_clkdm_force_wakeup(u8 part, u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, part, inst, cdoffs);  } @@ -258,7 +256,7 @@ void omap4_cminst_clkdm_force_wakeup(u8 part, u16 inst, u16 cdoffs)   *   */ -void omap4_cminst_clkdm_force_sleep(u8 part, u16 inst, u16 cdoffs) +static void omap4_cminst_clkdm_force_sleep(u8 part, u16 inst, u16 cdoffs)  {  	_clktrctrl_write(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, part, inst, cdoffs);  } @@ -267,23 +265,23 @@ void omap4_cminst_clkdm_force_sleep(u8 part, u16 inst, u16 cdoffs)   * omap4_cminst_wait_module_ready - wait for a module to be in 'func' state   * @part: PRCM partition ID that the CM_CLKCTRL register exists in   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * @bit_shift: bit shift for the register, ignored for OMAP4+   *   * Wait for the module IDLEST to be functional. If the idle state is in any   * the non functional state (trans, idle or disabled), module and thus the   * sysconfig cannot be accessed and will probably lead to an "imprecise   * external abort"   */ -int omap4_cminst_wait_module_ready(u8 part, u16 inst, s16 cdoffs, -				   u16 clkctrl_offs) +static int omap4_cminst_wait_module_ready(u8 part, s16 inst, u16 clkctrl_offs, +					  u8 bit_shift)  {  	int i = 0;  	if (!clkctrl_offs)  		return 0; -	omap_test_timeout(_is_module_ready(part, inst, cdoffs, clkctrl_offs), +	omap_test_timeout(_is_module_ready(part, inst, clkctrl_offs),  			  MAX_MODULE_READY_TIME, i);  	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; @@ -294,21 +292,22 @@ int omap4_cminst_wait_module_ready(u8 part, u16 inst, s16 cdoffs,   * state   * @part: PRCM partition ID that the CM_CLKCTRL register exists in   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) + * @bit_shift: Bit shift for the register, ignored for OMAP4+   *   * Wait for the module IDLEST to be disabled. Some PRCM transition,   * like reset assertion or parent clock de-activation must wait the   * module to be fully disabled.   */ -int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs) +static int omap4_cminst_wait_module_idle(u8 part, s16 inst, u16 clkctrl_offs, +					 u8 bit_shift)  {  	int i = 0;  	if (!clkctrl_offs)  		return 0; -	omap_test_timeout((_clkctrl_idlest(part, inst, cdoffs, clkctrl_offs) == +	omap_test_timeout((_clkctrl_idlest(part, inst, clkctrl_offs) ==  			   CLKCTRL_IDLEST_DISABLED),  			  MAX_MODULE_DISABLE_TIME, i); @@ -320,13 +319,12 @@ int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_off   * @mode: Module mode (SW or HW)   * @part: PRCM partition ID that the CM_CLKCTRL register exists in   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * No return value.   */ -void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs, -			    u16 clkctrl_offs) +static void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, +				       u16 clkctrl_offs)  {  	u32 v; @@ -340,13 +338,11 @@ void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs,   * omap4_cminst_module_disable - Disable the module inside CLKCTRL   * @part: PRCM partition ID that the CM_CLKCTRL register exists in   * @inst: CM instance register offset (*_INST macro) - * @cdoffs: Clockdomain register offset (*_CDOFFS macro)   * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)   *   * No return value.   */ -void omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs, -			     u16 clkctrl_offs) +static void omap4_cminst_module_disable(u8 part, u16 inst, u16 clkctrl_offs)  {  	u32 v; @@ -510,3 +506,21 @@ struct clkdm_ops am43xx_clkdm_operations = {  	.clkdm_clk_enable	= omap4_clkdm_clk_enable,  	.clkdm_clk_disable	= omap4_clkdm_clk_disable,  }; + +static struct cm_ll_data omap4xxx_cm_ll_data = { +	.wait_module_ready	= &omap4_cminst_wait_module_ready, +	.wait_module_idle	= &omap4_cminst_wait_module_idle, +	.module_enable		= &omap4_cminst_module_enable, +	.module_disable		= &omap4_cminst_module_disable, +}; + +int __init omap4_cm_init(void) +{ +	return cm_register(&omap4xxx_cm_ll_data); +} + +static void __exit omap4_cm_exit(void) +{ +	cm_unregister(&omap4xxx_cm_ll_data); +} +__exitcall(omap4_cm_exit); diff --git a/arch/arm/mach-omap2/cminst44xx.h b/arch/arm/mach-omap2/cminst44xx.h deleted file mode 100644 index 7f56ea444bc4..000000000000 --- a/arch/arm/mach-omap2/cminst44xx.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * OMAP4 Clock Management (CM) function prototypes - * - * Copyright (C) 2010 Nokia Corporation - * 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_ASM_MACH_OMAP2_CMINST44XX_H -#define __ARCH_ASM_MACH_OMAP2_CMINST44XX_H - -bool omap4_cminst_is_clkdm_in_hwsup(u8 part, u16 inst, u16 cdoffs); -void omap4_cminst_clkdm_enable_hwsup(u8 part, u16 inst, u16 cdoffs); -void omap4_cminst_clkdm_disable_hwsup(u8 part, u16 inst, u16 cdoffs); -void omap4_cminst_clkdm_force_sleep(u8 part, u16 inst, u16 cdoffs); -void omap4_cminst_clkdm_force_wakeup(u8 part, u16 inst, u16 cdoffs); -extern int omap4_cminst_wait_module_ready(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs); -extern int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, -					 u16 clkctrl_offs); -extern void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs, -				       u16 clkctrl_offs); -extern void omap4_cminst_module_disable(u8 part, u16 inst, s16 cdoffs, -					u16 clkctrl_offs); -/* - * In an ideal world, we would not export these low-level functions, - * but this will probably take some time to fix properly - */ -u32 omap4_cminst_read_inst_reg(u8 part, u16 inst, u16 idx); -void omap4_cminst_write_inst_reg(u32 val, u8 part, u16 inst, u16 idx); -u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, -				   u16 inst, s16 idx); -u32 omap4_cminst_set_inst_reg_bits(u32 bits, u8 part, u16 inst, -				   s16 idx); -u32 omap4_cminst_clear_inst_reg_bits(u32 bits, u8 part, u16 inst, -				     s16 idx); -extern u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx, -					   u32 mask); - -extern void omap_cm_base_init(void); - -#endif diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 03cbb16898a3..4fc838354e31 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -45,13 +45,15 @@  #include "sram.h"  #include "cm2xxx.h"  #include "cm3xxx.h" +#include "cm33xx.h" +#include "cm44xx.h"  #include "prm.h"  #include "cm.h"  #include "prcm_mpu44xx.h"  #include "prminst44xx.h" -#include "cminst44xx.h"  #include "prm2xxx.h"  #include "prm3xxx.h" +#include "prm33xx.h"  #include "prm44xx.h"  #include "opp2xxx.h" @@ -565,6 +567,8 @@ void __init am33xx_init_early(void)  	omap2_set_globals_cm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE), NULL);  	omap3xxx_check_revision();  	am33xx_check_features(); +	am33xx_prm_init(); +	am33xx_cm_init();  	am33xx_powerdomains_init();  	am33xx_clockdomains_init();  	am33xx_hwmod_init(); @@ -591,6 +595,8 @@ void __init am43xx_init_early(void)  	omap_cm_base_init();  	omap3xxx_check_revision();  	am33xx_check_features(); +	omap44xx_prm_init(); +	omap4_cm_init();  	am43xx_powerdomains_init();  	am43xx_clockdomains_init();  	am43xx_hwmod_init(); @@ -620,6 +626,7 @@ void __init omap4430_init_early(void)  	omap_cm_base_init();  	omap4xxx_check_revision();  	omap4xxx_check_features(); +	omap4_cm_init();  	omap4_pm_init_early();  	omap44xx_prm_init();  	omap44xx_voltagedomains_init(); @@ -655,6 +662,7 @@ void __init omap5_init_early(void)  	omap_cm_base_init();  	omap44xx_prm_init();  	omap5xxx_check_revision(); +	omap4_cm_init();  	omap54xx_voltagedomains_init();  	omap54xx_powerdomains_init();  	omap54xx_clockdomains_init(); @@ -686,6 +694,7 @@ void __init dra7xx_init_early(void)  	omap_cm_base_init();  	omap44xx_prm_init();  	dra7xxx_check_revision(); +	omap4_cm_init();  	dra7xx_powerdomains_init();  	dra7xx_clockdomains_init();  	dra7xx_hwmod_init(); diff --git a/arch/arm/mach-omap2/omap2-restart.c b/arch/arm/mach-omap2/omap2-restart.c index 68423e26399d..d937b2e4040b 100644 --- a/arch/arm/mach-omap2/omap2-restart.c +++ b/arch/arm/mach-omap2/omap2-restart.c @@ -15,7 +15,7 @@  #include "soc.h"  #include "common.h" -#include "prm2xxx.h" +#include "prm.h"  /*   * reset_virt_prcm_set_ck, reset_sys_ck: pointers to the virt_prcm_set @@ -40,8 +40,7 @@ void omap2xxx_restart(enum reboot_mode mode, const char *cmd)  	/* XXX Should save the cmd argument for use after the reboot */ -	omap2xxx_prm_dpll_reset(); /* never returns */ -	while (1); +	omap_prm_reset_system();  }  /** diff --git a/arch/arm/mach-omap2/omap3-restart.c b/arch/arm/mach-omap2/omap3-restart.c index 5de2a0c2979d..103a49f68bcb 100644 --- a/arch/arm/mach-omap2/omap3-restart.c +++ b/arch/arm/mach-omap2/omap3-restart.c @@ -14,10 +14,8 @@  #include <linux/init.h>  #include <linux/reboot.h> -#include "iomap.h" -#include "common.h"  #include "control.h" -#include "prm3xxx.h" +#include "prm.h"  /* Global address base setup code */ @@ -32,6 +30,5 @@  void omap3xxx_restart(enum reboot_mode mode, const char *cmd)  {  	omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0)); -	omap3xxx_prm_dpll3_reset(); /* never returns */ -	while (1); +	omap_prm_reset_system();  } diff --git a/arch/arm/mach-omap2/omap4-restart.c b/arch/arm/mach-omap2/omap4-restart.c index 41dfd7da8170..a99e7f7fb5be 100644 --- a/arch/arm/mach-omap2/omap4-restart.c +++ b/arch/arm/mach-omap2/omap4-restart.c @@ -9,7 +9,7 @@  #include <linux/types.h>  #include <linux/reboot.h> -#include "prminst44xx.h" +#include "prm.h"  /**   * omap44xx_restart - trigger a software restart of the SoC @@ -22,7 +22,5 @@  void omap44xx_restart(enum reboot_mode mode, const char *cmd)  {  	/* XXX Should save 'cmd' into scratchpad for use after reboot */ -	omap4_prminst_global_warm_sw_reset(); /* never returns */ -	while (1) -		; +	omap_prm_reset_system();  } diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index acae6d5d1151..ee5f38df477d 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -153,7 +153,6 @@  #include "powerdomain.h"  #include "cm2xxx.h"  #include "cm3xxx.h" -#include "cminst44xx.h"  #include "cm33xx.h"  #include "prm.h"  #include "prm3xxx.h" @@ -979,31 +978,9 @@ static void _omap4_enable_module(struct omap_hwmod *oh)  	pr_debug("omap_hwmod: %s: %s: %d\n",  		 oh->name, __func__, oh->prcm.omap4.modulemode); -	omap4_cminst_module_enable(oh->prcm.omap4.modulemode, -				   oh->clkdm->prcm_partition, -				   oh->clkdm->cm_inst, -				   oh->clkdm->clkdm_offs, -				   oh->prcm.omap4.clkctrl_offs); -} - -/** - * _am33xx_enable_module - enable CLKCTRL modulemode on AM33XX - * @oh: struct omap_hwmod * - * - * Enables the PRCM module mode related to the hwmod @oh. - * No return value. - */ -static void _am33xx_enable_module(struct omap_hwmod *oh) -{ -	if (!oh->clkdm || !oh->prcm.omap4.modulemode) -		return; - -	pr_debug("omap_hwmod: %s: %s: %d\n", -		 oh->name, __func__, oh->prcm.omap4.modulemode); - -	am33xx_cm_module_enable(oh->prcm.omap4.modulemode, oh->clkdm->cm_inst, -				oh->clkdm->clkdm_offs, -				oh->prcm.omap4.clkctrl_offs); +	omap_cm_module_enable(oh->prcm.omap4.modulemode, +			      oh->clkdm->prcm_partition, +			      oh->clkdm->cm_inst, oh->prcm.omap4.clkctrl_offs);  }  /** @@ -1026,35 +1003,9 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh)  	if (oh->flags & HWMOD_NO_IDLEST)  		return 0; -	return omap4_cminst_wait_module_idle(oh->clkdm->prcm_partition, -					     oh->clkdm->cm_inst, -					     oh->clkdm->clkdm_offs, -					     oh->prcm.omap4.clkctrl_offs); -} - -/** - * _am33xx_wait_target_disable - wait for a module to be disabled on AM33XX - * @oh: struct omap_hwmod * - * - * Wait for a module @oh to enter slave idle.  Returns 0 if the module - * does not have an IDLEST bit or if the module successfully enters - * slave idle; otherwise, pass along the return value of the - * appropriate *_cm*_wait_module_idle() function. - */ -static int _am33xx_wait_target_disable(struct omap_hwmod *oh) -{ -	if (!oh) -		return -EINVAL; - -	if (oh->_int_flags & _HWMOD_NO_MPU_PORT) -		return 0; - -	if (oh->flags & HWMOD_NO_IDLEST) -		return 0; - -	return am33xx_cm_wait_module_idle(oh->clkdm->cm_inst, -					     oh->clkdm->clkdm_offs, -					     oh->prcm.omap4.clkctrl_offs); +	return omap_cm_wait_module_idle(oh->clkdm->prcm_partition, +					oh->clkdm->cm_inst, +					oh->prcm.omap4.clkctrl_offs, 0);  }  /** @@ -1859,10 +1810,8 @@ static int _omap4_disable_module(struct omap_hwmod *oh)  	pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__); -	omap4_cminst_module_disable(oh->clkdm->prcm_partition, -				    oh->clkdm->cm_inst, -				    oh->clkdm->clkdm_offs, -				    oh->prcm.omap4.clkctrl_offs); +	omap_cm_module_disable(oh->clkdm->prcm_partition, oh->clkdm->cm_inst, +			       oh->prcm.omap4.clkctrl_offs);  	v = _omap4_wait_target_disable(oh);  	if (v) @@ -1873,36 +1822,6 @@ static int _omap4_disable_module(struct omap_hwmod *oh)  }  /** - * _am33xx_disable_module - enable CLKCTRL modulemode on AM33XX - * @oh: struct omap_hwmod * - * - * Disable the PRCM module mode related to the hwmod @oh. - * Return EINVAL if the modulemode is not supported and 0 in case of success. - */ -static int _am33xx_disable_module(struct omap_hwmod *oh) -{ -	int v; - -	if (!oh->clkdm || !oh->prcm.omap4.modulemode) -		return -EINVAL; - -	pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__); - -	if (_are_any_hardreset_lines_asserted(oh)) -		return 0; - -	am33xx_cm_module_disable(oh->clkdm->cm_inst, oh->clkdm->clkdm_offs, -				 oh->prcm.omap4.clkctrl_offs); - -	v = _am33xx_wait_target_disable(oh); -	if (v) -		pr_warn("omap_hwmod: %s: _wait_target_disable failed\n", -			oh->name); - -	return 0; -} - -/**   * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit   * @oh: struct omap_hwmod *   * @@ -2065,10 +1984,7 @@ static void _reconfigure_io_chain(void)  	spin_lock_irqsave(&io_chain_lock, flags); -	if (cpu_is_omap34xx()) -		omap3xxx_prm_reconfigure_io_chain(); -	else if (cpu_is_omap44xx()) -		omap44xx_prm_reconfigure_io_chain(); +	omap_prm_reconfigure_io_chain();  	spin_unlock_irqrestore(&io_chain_lock, flags);  } @@ -2925,7 +2841,7 @@ static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)  /* Static functions intended only for use in soc_ops field function pointers */  /** - * _omap2xxx_wait_target_ready - wait for a module to leave slave idle + * _omap2xxx_3xxx_wait_target_ready - wait for a module to leave slave idle   * @oh: struct omap_hwmod *   *   * Wait for a module @oh to leave slave idle.  Returns 0 if the module @@ -2933,7 +2849,7 @@ static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)   * slave idle; otherwise, pass along the return value of the   * appropriate *_cm*_wait_module_ready() function.   */ -static int _omap2xxx_wait_target_ready(struct omap_hwmod *oh) +static int _omap2xxx_3xxx_wait_target_ready(struct omap_hwmod *oh)  {  	if (!oh)  		return -EINVAL; @@ -2946,36 +2862,9 @@ static int _omap2xxx_wait_target_ready(struct omap_hwmod *oh)  	/* XXX check module SIDLEMODE, hardreset status, enabled clocks */ -	return omap2xxx_cm_wait_module_ready(oh->prcm.omap2.module_offs, -					     oh->prcm.omap2.idlest_reg_id, -					     oh->prcm.omap2.idlest_idle_bit); -} - -/** - * _omap3xxx_wait_target_ready - wait for a module to leave slave idle - * @oh: struct omap_hwmod * - * - * Wait for a module @oh to leave slave idle.  Returns 0 if the module - * does not have an IDLEST bit or if the module successfully leaves - * slave idle; otherwise, pass along the return value of the - * appropriate *_cm*_wait_module_ready() function. - */ -static int _omap3xxx_wait_target_ready(struct omap_hwmod *oh) -{ -	if (!oh) -		return -EINVAL; - -	if (oh->flags & HWMOD_NO_IDLEST) -		return 0; - -	if (!_find_mpu_rt_port(oh)) -		return 0; - -	/* XXX check module SIDLEMODE, hardreset status, enabled clocks */ - -	return omap3xxx_cm_wait_module_ready(oh->prcm.omap2.module_offs, -					     oh->prcm.omap2.idlest_reg_id, -					     oh->prcm.omap2.idlest_idle_bit); +	return omap_cm_wait_module_ready(0, oh->prcm.omap2.module_offs, +					 oh->prcm.omap2.idlest_reg_id, +					 oh->prcm.omap2.idlest_idle_bit);  }  /** @@ -3000,37 +2889,9 @@ static int _omap4_wait_target_ready(struct omap_hwmod *oh)  	/* XXX check module SIDLEMODE, hardreset status */ -	return omap4_cminst_wait_module_ready(oh->clkdm->prcm_partition, -					      oh->clkdm->cm_inst, -					      oh->clkdm->clkdm_offs, -					      oh->prcm.omap4.clkctrl_offs); -} - -/** - * _am33xx_wait_target_ready - wait for a module to leave slave idle - * @oh: struct omap_hwmod * - * - * Wait for a module @oh to leave slave idle.  Returns 0 if the module - * does not have an IDLEST bit or if the module successfully leaves - * slave idle; otherwise, pass along the return value of the - * appropriate *_cm*_wait_module_ready() function. - */ -static int _am33xx_wait_target_ready(struct omap_hwmod *oh) -{ -	if (!oh || !oh->clkdm) -		return -EINVAL; - -	if (oh->flags & HWMOD_NO_IDLEST) -		return 0; - -	if (!_find_mpu_rt_port(oh)) -		return 0; - -	/* XXX check module SIDLEMODE, hardreset status */ - -	return am33xx_cm_wait_module_ready(oh->clkdm->cm_inst, -					      oh->clkdm->clkdm_offs, -					      oh->prcm.omap4.clkctrl_offs); +	return omap_cm_wait_module_ready(oh->clkdm->prcm_partition, +					 oh->clkdm->cm_inst, +					 oh->prcm.omap4.clkctrl_offs, 0);  }  /** @@ -3047,8 +2908,8 @@ static int _am33xx_wait_target_ready(struct omap_hwmod *oh)  static int _omap2_assert_hardreset(struct omap_hwmod *oh,  				   struct omap_hwmod_rst_info *ohri)  { -	return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs, -					  ohri->rst_shift); +	return omap_prm_assert_hardreset(ohri->rst_shift, 0, +					 oh->prcm.omap2.module_offs, 0);  }  /** @@ -3065,9 +2926,8 @@ static int _omap2_assert_hardreset(struct omap_hwmod *oh,  static int _omap2_deassert_hardreset(struct omap_hwmod *oh,  				     struct omap_hwmod_rst_info *ohri)  { -	return omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs, -					    ohri->rst_shift, -					    ohri->st_shift); +	return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->st_shift, 0, +					   oh->prcm.omap2.module_offs, 0, 0);  }  /** @@ -3085,8 +2945,8 @@ static int _omap2_deassert_hardreset(struct omap_hwmod *oh,  static int _omap2_is_hardreset_asserted(struct omap_hwmod *oh,  					struct omap_hwmod_rst_info *ohri)  { -	return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs, -					       ohri->st_shift); +	return omap_prm_is_hardreset_asserted(ohri->st_shift, 0, +					      oh->prcm.omap2.module_offs, 0);  }  /** @@ -3107,10 +2967,10 @@ static int _omap4_assert_hardreset(struct omap_hwmod *oh,  	if (!oh->clkdm)  		return -EINVAL; -	return omap4_prminst_assert_hardreset(ohri->rst_shift, -				oh->clkdm->pwrdm.ptr->prcm_partition, -				oh->clkdm->pwrdm.ptr->prcm_offs, -				oh->prcm.omap4.rstctrl_offs); +	return omap_prm_assert_hardreset(ohri->rst_shift, +					 oh->clkdm->pwrdm.ptr->prcm_partition, +					 oh->clkdm->pwrdm.ptr->prcm_offs, +					 oh->prcm.omap4.rstctrl_offs);  }  /** @@ -3134,10 +2994,10 @@ static int _omap4_deassert_hardreset(struct omap_hwmod *oh,  	if (ohri->st_shift)  		pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",  		       oh->name, ohri->name); -	return omap4_prminst_deassert_hardreset(ohri->rst_shift, -				oh->clkdm->pwrdm.ptr->prcm_partition, -				oh->clkdm->pwrdm.ptr->prcm_offs, -				oh->prcm.omap4.rstctrl_offs); +	return omap_prm_deassert_hardreset(ohri->rst_shift, 0, +					   oh->clkdm->pwrdm.ptr->prcm_partition, +					   oh->clkdm->pwrdm.ptr->prcm_offs, +					   oh->prcm.omap4.rstctrl_offs, 0);  }  /** @@ -3158,10 +3018,11 @@ static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh,  	if (!oh->clkdm)  		return -EINVAL; -	return omap4_prminst_is_hardreset_asserted(ohri->rst_shift, -				oh->clkdm->pwrdm.ptr->prcm_partition, -				oh->clkdm->pwrdm.ptr->prcm_offs, -				oh->prcm.omap4.rstctrl_offs); +	return omap_prm_is_hardreset_asserted(ohri->rst_shift, +					      oh->clkdm->pwrdm.ptr-> +					      prcm_partition, +					      oh->clkdm->pwrdm.ptr->prcm_offs, +					      oh->prcm.omap4.rstctrl_offs);  }  /** @@ -3180,9 +3041,9 @@ static int _am33xx_assert_hardreset(struct omap_hwmod *oh,  				   struct omap_hwmod_rst_info *ohri)  { -	return am33xx_prm_assert_hardreset(ohri->rst_shift, -				oh->clkdm->pwrdm.ptr->prcm_offs, -				oh->prcm.omap4.rstctrl_offs); +	return omap_prm_assert_hardreset(ohri->rst_shift, 0, +					 oh->clkdm->pwrdm.ptr->prcm_offs, +					 oh->prcm.omap4.rstctrl_offs);  }  /** @@ -3200,11 +3061,10 @@ static int _am33xx_assert_hardreset(struct omap_hwmod *oh,  static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,  				     struct omap_hwmod_rst_info *ohri)  { -	return am33xx_prm_deassert_hardreset(ohri->rst_shift, -				ohri->st_shift, -				oh->clkdm->pwrdm.ptr->prcm_offs, -				oh->prcm.omap4.rstctrl_offs, -				oh->prcm.omap4.rstst_offs); +	return omap_prm_deassert_hardreset(ohri->rst_shift, ohri->st_shift, 0, +					   oh->clkdm->pwrdm.ptr->prcm_offs, +					   oh->prcm.omap4.rstctrl_offs, +					   oh->prcm.omap4.rstst_offs);  }  /** @@ -3222,9 +3082,9 @@ static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,  static int _am33xx_is_hardreset_asserted(struct omap_hwmod *oh,  					struct omap_hwmod_rst_info *ohri)  { -	return am33xx_prm_is_hardreset_asserted(ohri->rst_shift, -				oh->clkdm->pwrdm.ptr->prcm_offs, -				oh->prcm.omap4.rstctrl_offs); +	return omap_prm_is_hardreset_asserted(ohri->rst_shift, 0, +					      oh->clkdm->pwrdm.ptr->prcm_offs, +					      oh->prcm.omap4.rstctrl_offs);  }  /* Public functions */ @@ -4232,12 +4092,12 @@ int omap_hwmod_pad_route_irq(struct omap_hwmod *oh, int pad_idx, int irq_idx)  void __init omap_hwmod_init(void)  {  	if (cpu_is_omap24xx()) { -		soc_ops.wait_target_ready = _omap2xxx_wait_target_ready; +		soc_ops.wait_target_ready = _omap2xxx_3xxx_wait_target_ready;  		soc_ops.assert_hardreset = _omap2_assert_hardreset;  		soc_ops.deassert_hardreset = _omap2_deassert_hardreset;  		soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted;  	} else if (cpu_is_omap34xx()) { -		soc_ops.wait_target_ready = _omap3xxx_wait_target_ready; +		soc_ops.wait_target_ready = _omap2xxx_3xxx_wait_target_ready;  		soc_ops.assert_hardreset = _omap2_assert_hardreset;  		soc_ops.deassert_hardreset = _omap2_deassert_hardreset;  		soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted; @@ -4256,14 +4116,14 @@ void __init omap_hwmod_init(void)  		soc_ops.enable_module = _omap4_enable_module;  		soc_ops.disable_module = _omap4_disable_module;  		soc_ops.wait_target_ready = _omap4_wait_target_ready; -		soc_ops.assert_hardreset = _am33xx_assert_hardreset; -		soc_ops.deassert_hardreset = _am33xx_deassert_hardreset; -		soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted; +		soc_ops.assert_hardreset = _omap4_assert_hardreset; +		soc_ops.deassert_hardreset = _omap4_deassert_hardreset; +		soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;  		soc_ops.init_clkdm = _init_clkdm;  	} else if (soc_is_am33xx()) { -		soc_ops.enable_module = _am33xx_enable_module; -		soc_ops.disable_module = _am33xx_disable_module; -		soc_ops.wait_target_ready = _am33xx_wait_target_ready; +		soc_ops.enable_module = _omap4_enable_module; +		soc_ops.disable_module = _omap4_disable_module; +		soc_ops.wait_target_ready = _omap4_wait_target_ready;  		soc_ops.assert_hardreset = _am33xx_assert_hardreset;  		soc_ops.deassert_hardreset = _am33xx_deassert_hardreset;  		soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted; diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h index 48480d557b61..77752e49d8d4 100644 --- a/arch/arm/mach-omap2/prm.h +++ b/arch/arm/mach-omap2/prm.h @@ -29,6 +29,7 @@ int of_prcm_init(void);   * PRM_HAS_VOLTAGE: has voltage domains   */  #define PRM_HAS_IO_WAKEUP	(1 << 0) +#define PRM_HAS_VOLTAGE		(1 << 1)  /*   * MAX_MODULE_SOFTRESET_WAIT: Maximum microseconds to wait for OMAP @@ -127,6 +128,8 @@ struct prm_reset_src_map {   * @was_any_context_lost_old: ptr to the SoC PRM context loss test fn   * @clear_context_loss_flags_old: ptr to the SoC PRM context loss flag clear fn   * @late_init: ptr to the late init function + * @assert_hardreset: ptr to the SoC PRM hardreset assert impl + * @deassert_hardreset: ptr to the SoC PRM hardreset deassert impl   *   * XXX @was_any_context_lost_old and @clear_context_loss_flags_old are   * deprecated. @@ -136,14 +139,27 @@ struct prm_ll_data {  	bool (*was_any_context_lost_old)(u8 part, s16 inst, u16 idx);  	void (*clear_context_loss_flags_old)(u8 part, s16 inst, u16 idx);  	int (*late_init)(void); +	int (*assert_hardreset)(u8 shift, u8 part, s16 prm_mod, u16 offset); +	int (*deassert_hardreset)(u8 shift, u8 st_shift, u8 part, s16 prm_mod, +				  u16 offset, u16 st_offset); +	int (*is_hardreset_asserted)(u8 shift, u8 part, s16 prm_mod, +				     u16 offset); +	void (*reset_system)(void);  };  extern int prm_register(struct prm_ll_data *pld);  extern int prm_unregister(struct prm_ll_data *pld); +int omap_prm_assert_hardreset(u8 shift, u8 part, s16 prm_mod, u16 offset); +int omap_prm_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 prm_mod, +				u16 offset, u16 st_offset); +int omap_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset);  extern u32 prm_read_reset_sources(void);  extern bool prm_was_any_context_lost_old(u8 part, s16 inst, u16 idx);  extern void prm_clear_context_loss_flags_old(u8 part, s16 inst, u16 idx); +void omap_prm_reset_system(void); + +void omap_prm_reconfigure_io_chain(void);  #endif diff --git a/arch/arm/mach-omap2/prm2xxx.c b/arch/arm/mach-omap2/prm2xxx.c index 86958050547a..af0f15278fc2 100644 --- a/arch/arm/mach-omap2/prm2xxx.c +++ b/arch/arm/mach-omap2/prm2xxx.c @@ -106,7 +106,7 @@ static int omap2xxx_pwrst_to_common_pwrst(u8 omap2xxx_pwrst)   * Set the DPLL reset bit, which should reboot the SoC.  This is the   * recommended way to restart the SoC.  No return value.   */ -void omap2xxx_prm_dpll_reset(void) +static void omap2xxx_prm_dpll_reset(void)  {  	omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, WKUP_MOD,  				   OMAP2_RM_RSTCTRL); @@ -212,6 +212,10 @@ struct pwrdm_ops omap2_pwrdm_operations = {  static struct prm_ll_data omap2xxx_prm_ll_data = {  	.read_reset_sources = &omap2xxx_prm_read_reset_sources, +	.assert_hardreset = &omap2_prm_assert_hardreset, +	.deassert_hardreset = &omap2_prm_deassert_hardreset, +	.is_hardreset_asserted = &omap2_prm_is_hardreset_asserted, +	.reset_system = &omap2xxx_prm_dpll_reset,  };  int __init omap2xxx_prm_init(void) diff --git a/arch/arm/mach-omap2/prm2xxx.h b/arch/arm/mach-omap2/prm2xxx.h index d73414139292..1d51643062f7 100644 --- a/arch/arm/mach-omap2/prm2xxx.h +++ b/arch/arm/mach-omap2/prm2xxx.h @@ -124,7 +124,6 @@  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); diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index c13b4e293ffa..cc3341f263cd 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c @@ -24,14 +24,16 @@  /**   * omap2_prm_is_hardreset_asserted - read the HW reset line state of   * submodules contained in the hwmod module - * @prm_mod: PRM submodule base (e.g. CORE_MOD)   * @shift: register bit shift corresponding to the reset line to check + * @part: PRM partition, ignored for OMAP2 + * @prm_mod: PRM submodule base (e.g. CORE_MOD) + * @offset: register offset, ignored for OMAP2   *   * Returns 1 if the (sub)module hardreset line is currently asserted,   * 0 if the (sub)module hardreset line is not currently asserted, or   * -EINVAL if called while running on a non-OMAP2/3 chip.   */ -int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift) +int omap2_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset)  {  	return omap2_prm_read_mod_bits_shift(prm_mod, OMAP2_RM_RSTCTRL,  				       (1 << shift)); @@ -39,8 +41,10 @@ int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift)  /**   * omap2_prm_assert_hardreset - assert the HW reset line of a submodule - * @prm_mod: PRM submodule base (e.g. CORE_MOD)   * @shift: register bit shift corresponding to the reset line to assert + * @part: PRM partition, ignored for OMAP2 + * @prm_mod: PRM submodule base (e.g. CORE_MOD) + * @offset: register offset, ignored for OMAP2   *   * Some IPs like dsp or iva contain processors that require an HW   * reset line to be asserted / deasserted in order to fully enable the @@ -49,7 +53,7 @@ int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift)   * place the submodule into reset.  Returns 0 upon success or -EINVAL   * upon an argument error.   */ -int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift) +int omap2_prm_assert_hardreset(u8 shift, u8 part, s16 prm_mod, u16 offset)  {  	u32 mask; @@ -64,6 +68,10 @@ int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift)   * @prm_mod: PRM submodule base (e.g. CORE_MOD)   * @rst_shift: register bit shift corresponding to the reset line to deassert   * @st_shift: register bit shift for the status of the deasserted submodule + * @part: PRM partition, not used for OMAP2 + * @prm_mod: PRM submodule base (e.g. CORE_MOD) + * @rst_offset: reset register offset, not used for OMAP2 + * @st_offset: reset status register offset, not used for OMAP2   *   * Some IPs like dsp or iva contain processors that require an HW   * reset line to be asserted / deasserted in order to fully enable the @@ -74,7 +82,8 @@ int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift)   * -EINVAL upon an argument error, -EEXIST if the submodule was already out   * of reset, or -EBUSY if the submodule did not exit reset promptly.   */ -int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift) +int omap2_prm_deassert_hardreset(u8 rst_shift, u8 st_shift, u8 part, +				 s16 prm_mod, u16 rst_offset, u16 st_offset)  {  	u32 rst, st;  	int c; diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.h b/arch/arm/mach-omap2/prm2xxx_3xxx.h index 1a3a96392b97..f57e29b0e041 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.h +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.h @@ -100,9 +100,12 @@ static inline u32 omap2_prm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)  }  /* These omap2_ PRM functions apply to both OMAP2 and 3 */ -extern int omap2_prm_is_hardreset_asserted(s16 prm_mod, u8 shift); -extern int omap2_prm_assert_hardreset(s16 prm_mod, u8 shift); -extern int omap2_prm_deassert_hardreset(s16 prm_mod, u8 rst_shift, u8 st_shift); +int omap2_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset); +int omap2_prm_assert_hardreset(u8 shift, u8 part, s16 prm_mod, +			       u16 offset); +int omap2_prm_deassert_hardreset(u8 rst_shift, u8 st_shift, u8 part, +				 s16 prm_mod, u16 reset_offset, +				 u16 st_offset);  extern int omap2_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst);  extern int omap2_pwrdm_read_next_pwrst(struct powerdomain *pwrdm); diff --git a/arch/arm/mach-omap2/prm33xx.c b/arch/arm/mach-omap2/prm33xx.c index 62709cd2f9c5..02f628601b09 100644 --- a/arch/arm/mach-omap2/prm33xx.c +++ b/arch/arm/mach-omap2/prm33xx.c @@ -23,20 +23,24 @@  #include "prm33xx.h"  #include "prm-regbits-33xx.h" +#define AM33XX_PRM_RSTCTRL_OFFSET		0x0000 + +#define AM33XX_RST_GLOBAL_WARM_SW_MASK		(1 << 0) +  /* Read a register in a PRM instance */ -u32 am33xx_prm_read_reg(s16 inst, u16 idx) +static u32 am33xx_prm_read_reg(s16 inst, u16 idx)  {  	return readl_relaxed(prm_base + inst + idx);  }  /* Write into a register in a PRM instance */ -void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx) +static void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx)  {  	writel_relaxed(val, prm_base + inst + idx);  }  /* Read-modify-write a register in PRM. Caller must lock */ -u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx) +static u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx)  {  	u32 v; @@ -52,6 +56,7 @@ u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx)   * am33xx_prm_is_hardreset_asserted - read the HW reset line state of   * submodules contained in the hwmod module   * @shift: register bit shift corresponding to the reset line to check + * @part: PRM partition, ignored for AM33xx   * @inst: CM instance register offset (*_INST macro)   * @rstctrl_offs: RM_RSTCTRL register address offset for this module   * @@ -59,7 +64,8 @@ u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx)   * 0 if the (sub)module hardreset line is not currently asserted, or   * -EINVAL upon parameter error.   */ -int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, u16 rstctrl_offs) +static int am33xx_prm_is_hardreset_asserted(u8 shift, u8 part, s16 inst, +					    u16 rstctrl_offs)  {  	u32 v; @@ -73,6 +79,7 @@ int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, u16 rstctrl_offs)  /**   * am33xx_prm_assert_hardreset - assert the HW reset line of a submodule   * @shift: register bit shift corresponding to the reset line to assert + * @part: CM partition, ignored for AM33xx   * @inst: CM instance register offset (*_INST macro)   * @rstctrl_reg: RM_RSTCTRL register address for this module   * @@ -83,7 +90,8 @@ int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, u16 rstctrl_offs)   * place the submodule into reset.  Returns 0 upon success or -EINVAL   * upon an argument error.   */ -int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs) +static int am33xx_prm_assert_hardreset(u8 shift, u8 part, s16 inst, +				       u16 rstctrl_offs)  {  	u32 mask = 1 << shift; @@ -96,6 +104,8 @@ int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs)   * am33xx_prm_deassert_hardreset - deassert a submodule hardreset line and   * wait   * @shift: register bit shift corresponding to the reset line to deassert + * @st_shift: reset status register bit shift corresponding to the reset line + * @part: PRM partition, not used for AM33xx   * @inst: CM instance register offset (*_INST macro)   * @rstctrl_reg: RM_RSTCTRL register address for this module   * @rstst_reg: RM_RSTST register address for this module @@ -109,14 +119,15 @@ int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs)   * -EINVAL upon an argument error, -EEXIST if the submodule was already out   * of reset, or -EBUSY if the submodule did not exit reset promptly.   */ -int am33xx_prm_deassert_hardreset(u8 shift, u8 st_shift, s16 inst, -		u16 rstctrl_offs, u16 rstst_offs) +static int am33xx_prm_deassert_hardreset(u8 shift, u8 st_shift, u8 part, +					 s16 inst, u16 rstctrl_offs, +					 u16 rstst_offs)  {  	int c;  	u32 mask = 1 << st_shift;  	/* Check the current status to avoid  de-asserting the line twice */ -	if (am33xx_prm_is_hardreset_asserted(shift, inst, rstctrl_offs) == 0) +	if (am33xx_prm_is_hardreset_asserted(shift, 0, inst, rstctrl_offs) == 0)  		return -EEXIST;  	/* Clear the reset status by writing 1 to the status bit */ @@ -128,7 +139,7 @@ int am33xx_prm_deassert_hardreset(u8 shift, u8 st_shift, s16 inst,  	am33xx_prm_rmw_reg_bits(mask, 0, inst, rstctrl_offs);  	/* wait the status to be set */ -	omap_test_timeout(am33xx_prm_is_hardreset_asserted(st_shift, inst, +	omap_test_timeout(am33xx_prm_is_hardreset_asserted(st_shift, 0, inst,  							   rstst_offs),  			  MAX_MODULE_HARDRESET_WAIT, c); @@ -325,6 +336,23 @@ static int am33xx_check_vcvp(void)  	return 0;  } +/** + * am33xx_prm_global_warm_sw_reset - reboot the device via warm reset + * + * Immediately reboots the device through warm reset. + */ +static void am33xx_prm_global_warm_sw_reset(void) +{ +	am33xx_prm_rmw_reg_bits(AM33XX_RST_GLOBAL_WARM_SW_MASK, +				AM33XX_RST_GLOBAL_WARM_SW_MASK, +				AM33XX_PRM_DEVICE_MOD, +				AM33XX_PRM_RSTCTRL_OFFSET); + +	/* OCP barrier */ +	(void)am33xx_prm_read_reg(AM33XX_PRM_DEVICE_MOD, +				  AM33XX_PRM_RSTCTRL_OFFSET); +} +  struct pwrdm_ops am33xx_pwrdm_operations = {  	.pwrdm_set_next_pwrst		= am33xx_pwrdm_set_next_pwrst,  	.pwrdm_read_next_pwrst		= am33xx_pwrdm_read_next_pwrst, @@ -342,3 +370,21 @@ struct pwrdm_ops am33xx_pwrdm_operations = {  	.pwrdm_wait_transition		= am33xx_pwrdm_wait_transition,  	.pwrdm_has_voltdm		= am33xx_check_vcvp,  }; + +static struct prm_ll_data am33xx_prm_ll_data = { +	.assert_hardreset		= am33xx_prm_assert_hardreset, +	.deassert_hardreset		= am33xx_prm_deassert_hardreset, +	.is_hardreset_asserted		= am33xx_prm_is_hardreset_asserted, +	.reset_system			= am33xx_prm_global_warm_sw_reset, +}; + +int __init am33xx_prm_init(void) +{ +	return prm_register(&am33xx_prm_ll_data); +} + +static void __exit am33xx_prm_exit(void) +{ +	prm_unregister(&am33xx_prm_ll_data); +} +__exitcall(am33xx_prm_exit); diff --git a/arch/arm/mach-omap2/prm33xx.h b/arch/arm/mach-omap2/prm33xx.h index 9b9918dfb119..98ac41f271da 100644 --- a/arch/arm/mach-omap2/prm33xx.h +++ b/arch/arm/mach-omap2/prm33xx.h @@ -118,14 +118,7 @@  #define AM33XX_PM_CEFUSE_PWRSTST		AM33XX_PRM_REGADDR(AM33XX_PRM_CEFUSE_MOD, 0x0004)  #ifndef __ASSEMBLER__ -extern u32 am33xx_prm_read_reg(s16 inst, u16 idx); -extern void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx); -extern u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); -extern void am33xx_prm_global_warm_sw_reset(void); -extern int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, -		u16 rstctrl_offs); -extern int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs); -extern int am33xx_prm_deassert_hardreset(u8 shift, u8 st_shift, s16 inst, -		u16 rstctrl_offs, u16 rstst_offs); +int am33xx_prm_init(void); +  #endif /* ASSEMBLER */  #endif diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index ff08da385a2d..c5e00c6714b1 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c @@ -30,6 +30,11 @@  #include "cm3xxx.h"  #include "cm-regbits-34xx.h" +static void omap3xxx_prm_read_pending_irqs(unsigned long *events); +static void omap3xxx_prm_ocp_barrier(void); +static void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask); +static void omap3xxx_prm_restore_irqen(u32 *saved_mask); +  static const struct omap_prcm_irq omap3_prcm_irqs[] = {  	OMAP_PRCM_IRQ("wkup",	0,	0),  	OMAP_PRCM_IRQ("io",	9,	1), @@ -131,7 +136,7 @@ u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset)   * recommended way to restart the SoC, considering Errata i520.  No   * return value.   */ -void omap3xxx_prm_dpll3_reset(void) +static void omap3xxx_prm_dpll3_reset(void)  {  	omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, OMAP3430_GR_MOD,  				   OMAP2_RM_RSTCTRL); @@ -147,7 +152,7 @@ void omap3xxx_prm_dpll3_reset(void)   * MPU IRQs, and store the result into the u32 pointed to by @events.   * No return value.   */ -void omap3xxx_prm_read_pending_irqs(unsigned long *events) +static void omap3xxx_prm_read_pending_irqs(unsigned long *events)  {  	u32 mask, st; @@ -166,7 +171,7 @@ void omap3xxx_prm_read_pending_irqs(unsigned long *events)   * block, to avoid race conditions after acknowledging or clearing IRQ   * bits.  No return value.   */ -void omap3xxx_prm_ocp_barrier(void) +static void omap3xxx_prm_ocp_barrier(void)  {  	omap2_prm_read_mod_reg(OCP_MOD, OMAP3_PRM_REVISION_OFFSET);  } @@ -182,7 +187,7 @@ void omap3xxx_prm_ocp_barrier(void)   * returning; otherwise, spurious interrupts might occur.  No return   * value.   */ -void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask) +static void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask)  {  	saved_mask[0] = omap2_prm_read_mod_reg(OCP_MOD,  					       OMAP3_PRM_IRQENABLE_MPU_OFFSET); @@ -202,7 +207,7 @@ void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask)   * barrier should be needed here; any pending PRM interrupts will fire   * once the writes reach the PRM.  No return value.   */ -void omap3xxx_prm_restore_irqen(u32 *saved_mask) +static void omap3xxx_prm_restore_irqen(u32 *saved_mask)  {  	omap2_prm_write_mod_reg(saved_mask[0], OCP_MOD,  				OMAP3_PRM_IRQENABLE_MPU_OFFSET); @@ -375,7 +380,7 @@ void __init omap3_prm_init_pm(bool has_uart4, bool has_iva)   * The ST_IO_CHAIN bit does not exist in 3430 before es3.1. The only   * thing we can do is toggle EN_IO bit for earlier omaps.   */ -void omap3430_pre_es3_1_reconfigure_io_chain(void) +static void omap3430_pre_es3_1_reconfigure_io_chain(void)  {  	omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,  				     PM_WKEN); @@ -393,7 +398,7 @@ void omap3430_pre_es3_1_reconfigure_io_chain(void)   * deasserting WUCLKIN and clearing the ST_IO_CHAIN WKST bit.  No   * return value. These registers are only available in 3430 es3.1 and later.   */ -void omap3_prm_reconfigure_io_chain(void) +static void omap3_prm_reconfigure_io_chain(void)  {  	int i = 0; @@ -416,15 +421,6 @@ void omap3_prm_reconfigure_io_chain(void)  }  /** - * omap3xxx_prm_reconfigure_io_chain - reconfigure I/O chain - */ -void omap3xxx_prm_reconfigure_io_chain(void) -{ -	if (omap3_prcm_irq_setup.reconfigure_io_chain) -		omap3_prcm_irq_setup.reconfigure_io_chain(); -} - -/**   * omap3xxx_prm_enable_io_wakeup - enable wakeup events from I/O wakeup latches   *   * Activates the I/O wakeup event latches and allows events logged by @@ -664,6 +660,10 @@ static int omap3xxx_prm_late_init(void);  static struct prm_ll_data omap3xxx_prm_ll_data = {  	.read_reset_sources = &omap3xxx_prm_read_reset_sources,  	.late_init = &omap3xxx_prm_late_init, +	.assert_hardreset = &omap2_prm_assert_hardreset, +	.deassert_hardreset = &omap2_prm_deassert_hardreset, +	.is_hardreset_asserted = &omap2_prm_is_hardreset_asserted, +	.reset_system = &omap3xxx_prm_dpll3_reset,  };  int __init omap3xxx_prm_init(void) diff --git a/arch/arm/mach-omap2/prm3xxx.h b/arch/arm/mach-omap2/prm3xxx.h index bc37d42a8704..cfde3f4a03cc 100644 --- a/arch/arm/mach-omap2/prm3xxx.h +++ b/arch/arm/mach-omap2/prm3xxx.h @@ -144,22 +144,6 @@ extern u32 omap3_prm_vcvp_read(u8 offset);  extern void omap3_prm_vcvp_write(u32 val, u8 offset);  extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); -#ifdef CONFIG_ARCH_OMAP3 -void omap3xxx_prm_reconfigure_io_chain(void); -#else -static inline void omap3xxx_prm_reconfigure_io_chain(void) -{ -} -#endif - -/* PRM interrupt-related functions */ -extern void omap3xxx_prm_read_pending_irqs(unsigned long *events); -extern void omap3xxx_prm_ocp_barrier(void); -extern void omap3xxx_prm_save_and_clear_irqen(u32 *saved_mask); -extern void omap3xxx_prm_restore_irqen(u32 *saved_mask); - -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); diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 0958d070d3db..cc170fb81ff7 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c @@ -32,6 +32,12 @@  /* Static data */ +static void omap44xx_prm_read_pending_irqs(unsigned long *events); +static void omap44xx_prm_ocp_barrier(void); +static void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask); +static void omap44xx_prm_restore_irqen(u32 *saved_mask); +static void omap44xx_prm_reconfigure_io_chain(void); +  static const struct omap_prcm_irq omap4_prcm_irqs[] = {  	OMAP_PRCM_IRQ("io",     9,      1),  }; @@ -80,19 +86,19 @@ static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = {  /* PRM low-level functions */  /* Read a register in a CM/PRM instance in the PRM module */ -u32 omap4_prm_read_inst_reg(s16 inst, u16 reg) +static u32 omap4_prm_read_inst_reg(s16 inst, u16 reg)  {  	return readl_relaxed(prm_base + inst + reg);  }  /* Write into a register in a CM/PRM instance in the PRM module */ -void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg) +static void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg)  {  	writel_relaxed(val, prm_base + inst + reg);  }  /* Read-modify-write a register in a PRM module. Caller must lock */ -u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg) +static u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 reg)  {  	u32 v; @@ -207,7 +213,7 @@ static inline u32 _read_pending_irq_reg(u16 irqen_offs, u16 irqst_offs)   * MPU IRQs, and store the result into the two u32s pointed to by @events.   * No return value.   */ -void omap44xx_prm_read_pending_irqs(unsigned long *events) +static void omap44xx_prm_read_pending_irqs(unsigned long *events)  {  	events[0] = _read_pending_irq_reg(OMAP4_PRM_IRQENABLE_MPU_OFFSET,  					  OMAP4_PRM_IRQSTATUS_MPU_OFFSET); @@ -224,7 +230,7 @@ void omap44xx_prm_read_pending_irqs(unsigned long *events)   * block, to avoid race conditions after acknowledging or clearing IRQ   * bits.  No return value.   */ -void omap44xx_prm_ocp_barrier(void) +static void omap44xx_prm_ocp_barrier(void)  {  	omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST,  				OMAP4_REVISION_PRM_OFFSET); @@ -241,7 +247,7 @@ void omap44xx_prm_ocp_barrier(void)   * interrupts reaches the PRM before returning; otherwise, spurious   * interrupts might occur.  No return value.   */ -void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) +static void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask)  {  	saved_mask[0] =  		omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, @@ -270,7 +276,7 @@ void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask)   * No OCP barrier should be needed here; any pending PRM interrupts will fire   * once the writes reach the PRM.  No return value.   */ -void omap44xx_prm_restore_irqen(u32 *saved_mask) +static void omap44xx_prm_restore_irqen(u32 *saved_mask)  {  	omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_OCP_SOCKET_INST,  				 OMAP4_PRM_IRQENABLE_MPU_OFFSET); @@ -287,7 +293,7 @@ void omap44xx_prm_restore_irqen(u32 *saved_mask)   * deasserting WUCLKIN and waiting for WUCLKOUT to be deasserted.   * No return value. XXX Are the final two steps necessary?   */ -void omap44xx_prm_reconfigure_io_chain(void) +static void omap44xx_prm_reconfigure_io_chain(void)  {  	int i = 0;  	s32 inst = omap4_prmst_get_prm_dev_inst(); @@ -652,11 +658,10 @@ static int omap4_pwrdm_wait_transition(struct powerdomain *pwrdm)  static int omap4_check_vcvp(void)  { -	/* No VC/VP on dra7xx devices */ -	if (soc_is_dra7xx()) -		return 0; +	if (prm_features & PRM_HAS_VOLTAGE) +		return 1; -	return 1; +	return 0;  }  struct pwrdm_ops omap4_pwrdm_operations = { @@ -689,6 +694,10 @@ static struct prm_ll_data omap44xx_prm_ll_data = {  	.was_any_context_lost_old = &omap44xx_prm_was_any_context_lost_old,  	.clear_context_loss_flags_old = &omap44xx_prm_clear_context_loss_flags_old,  	.late_init = &omap44xx_prm_late_init, +	.assert_hardreset	= omap4_prminst_assert_hardreset, +	.deassert_hardreset	= omap4_prminst_deassert_hardreset, +	.is_hardreset_asserted	= omap4_prminst_is_hardreset_asserted, +	.reset_system		= omap4_prminst_global_warm_sw_reset,  };  int __init omap44xx_prm_init(void) @@ -696,6 +705,9 @@ int __init omap44xx_prm_init(void)  	if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx())  		prm_features |= PRM_HAS_IO_WAKEUP; +	if (!soc_is_dra7xx()) +		prm_features |= PRM_HAS_VOLTAGE; +  	return prm_register(&omap44xx_prm_ll_data);  } diff --git a/arch/arm/mach-omap2/prm44xx_54xx.h b/arch/arm/mach-omap2/prm44xx_54xx.h index 8d95aa543ef5..f7512515fde5 100644 --- a/arch/arm/mach-omap2/prm44xx_54xx.h +++ b/arch/arm/mach-omap2/prm44xx_54xx.h @@ -26,10 +26,6 @@  /* Function prototypes */  #ifndef __ASSEMBLER__ -extern u32 omap4_prm_read_inst_reg(s16 inst, u16 idx); -extern void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 idx); -extern u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); -  /* OMAP4/OMAP5-specific VP functions */  u32 omap4_prm_vp_check_txdone(u8 vp_id);  void omap4_prm_vp_clear_txdone(u8 vp_id); @@ -42,21 +38,6 @@ extern u32 omap4_prm_vcvp_read(u8 offset);  extern void omap4_prm_vcvp_write(u32 val, u8 offset);  extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); -#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \ -	defined(CONFIG_SOC_DRA7XX) || defined(CONFIG_SOC_AM43XX) -void omap44xx_prm_reconfigure_io_chain(void); -#else -static inline void omap44xx_prm_reconfigure_io_chain(void) -{ -} -#endif - -/* PRM interrupt-related functions */ -extern void omap44xx_prm_read_pending_irqs(unsigned long *events); -extern void omap44xx_prm_ocp_barrier(void); -extern void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask); -extern void omap44xx_prm_restore_irqen(u32 *saved_mask); -  extern int __init omap44xx_prm_init(void);  extern u32 omap44xx_prm_get_reset_sources(void); diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index ee2b5222eac0..779940cb6e56 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c @@ -423,6 +423,105 @@ void prm_clear_context_loss_flags_old(u8 part, s16 inst, u16 idx)  }  /** + * omap_prm_assert_hardreset - assert hardreset for an IP block + * @shift: register bit shift corresponding to the reset line + * @part: PRM partition + * @prm_mod: PRM submodule base or instance offset + * @offset: register offset + * + * Asserts a hardware reset line for an IP block. + */ +int omap_prm_assert_hardreset(u8 shift, u8 part, s16 prm_mod, u16 offset) +{ +	if (!prm_ll_data->assert_hardreset) { +		WARN_ONCE(1, "prm: %s: no mapping function defined\n", +			  __func__); +		return -EINVAL; +	} + +	return prm_ll_data->assert_hardreset(shift, part, prm_mod, offset); +} + +/** + * omap_prm_deassert_hardreset - deassert hardreset for an IP block + * @shift: register bit shift corresponding to the reset line + * @st_shift: reset status bit shift corresponding to the reset line + * @part: PRM partition + * @prm_mod: PRM submodule base or instance offset + * @offset: register offset + * @st_offset: status register offset + * + * Deasserts a hardware reset line for an IP block. + */ +int omap_prm_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 prm_mod, +				u16 offset, u16 st_offset) +{ +	if (!prm_ll_data->deassert_hardreset) { +		WARN_ONCE(1, "prm: %s: no mapping function defined\n", +			  __func__); +		return -EINVAL; +	} + +	return prm_ll_data->deassert_hardreset(shift, st_shift, part, prm_mod, +					       offset, st_offset); +} + +/** + * omap_prm_is_hardreset_asserted - check the hardreset status for an IP block + * @shift: register bit shift corresponding to the reset line + * @part: PRM partition + * @prm_mod: PRM submodule base or instance offset + * @offset: register offset + * + * Checks if a hardware reset line for an IP block is enabled or not. + */ +int omap_prm_is_hardreset_asserted(u8 shift, u8 part, s16 prm_mod, u16 offset) +{ +	if (!prm_ll_data->is_hardreset_asserted) { +		WARN_ONCE(1, "prm: %s: no mapping function defined\n", +			  __func__); +		return -EINVAL; +	} + +	return prm_ll_data->is_hardreset_asserted(shift, part, prm_mod, offset); +} + +/** + * omap_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain + * + * Clear any previously-latched I/O wakeup events and ensure that the + * I/O wakeup gates are aligned with the current mux settings. + * Calls SoC specific I/O chain reconfigure function if available, + * otherwise does nothing. + */ +void omap_prm_reconfigure_io_chain(void) +{ +	if (!prcm_irq_setup || !prcm_irq_setup->reconfigure_io_chain) +		return; + +	prcm_irq_setup->reconfigure_io_chain(); +} + +/** + * omap_prm_reset_system - trigger global SW reset + * + * Triggers SoC specific global warm reset to reboot the device. + */ +void omap_prm_reset_system(void) +{ +	if (!prm_ll_data->reset_system) { +		WARN_ONCE(1, "prm: %s: no mapping function defined\n", +			  __func__); +		return; +	} + +	prm_ll_data->reset_system(); + +	while (1) +		cpu_relax(); +} + +/**   * prm_register - register per-SoC low-level data with the PRM   * @pld: low-level per-SoC OMAP PRM data & function pointers to register   * diff --git a/arch/arm/mach-omap2/prminst44xx.c b/arch/arm/mach-omap2/prminst44xx.c index 225e0258d76d..8adf7b1a1dce 100644 --- a/arch/arm/mach-omap2/prminst44xx.c +++ b/arch/arm/mach-omap2/prminst44xx.c @@ -148,8 +148,12 @@ int omap4_prminst_assert_hardreset(u8 shift, u8 part, s16 inst,  /**   * omap4_prminst_deassert_hardreset - deassert a submodule hardreset line and   * wait - * @rstctrl_reg: RM_RSTCTRL register address for this module   * @shift: register bit shift corresponding to the reset line to deassert + * @st_shift: status bit offset, not used for OMAP4+ + * @part: PRM partition + * @inst: PRM instance offset + * @rstctrl_offs: reset register offset + * @st_offs: reset status register offset, not used for OMAP4+   *   * Some IPs like dsp, ipu or iva contain processors that require an HW   * reset line to be asserted / deasserted in order to fully enable the @@ -160,8 +164,8 @@ int omap4_prminst_assert_hardreset(u8 shift, u8 part, s16 inst,   * -EINVAL upon an argument error, -EEXIST if the submodule was already out   * of reset, or -EBUSY if the submodule did not exit reset promptly.   */ -int omap4_prminst_deassert_hardreset(u8 shift, u8 part, s16 inst, -				     u16 rstctrl_offs) +int omap4_prminst_deassert_hardreset(u8 shift, u8 st_shift, u8 part, s16 inst, +				     u16 rstctrl_offs, u16 st_offs)  {  	int c;  	u32 mask = 1 << shift; diff --git a/arch/arm/mach-omap2/prminst44xx.h b/arch/arm/mach-omap2/prminst44xx.h index 583aa3774571..fb1c9d7a2f9d 100644 --- a/arch/arm/mach-omap2/prminst44xx.h +++ b/arch/arm/mach-omap2/prminst44xx.h @@ -30,8 +30,9 @@ extern int omap4_prminst_is_hardreset_asserted(u8 shift, u8 part, s16 inst,  					       u16 rstctrl_offs);  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); +int omap4_prminst_deassert_hardreset(u8 shift, u8 st_shift, u8 part, +				     s16 inst, u16 rstctrl_offs, +				     u16 rstst_offs);  extern void omap_prm_base_init(void); | 
