mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 09:50:55 +07:00
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. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJUYkHXAAoJEBvUPslcq6Vz0CQP/2SUPXiq5/WXIe0Q1g4V1BmD KQ8Jc9+DHbx3+7PBaG9QwKkPwI9f7xykNYnvqvanwU3FEqIeckL7yvkwZiN68zye 5QbBNPcco2X8mbs6PahDhkRcs5pUSAeqHkxB9hUipP9u0Np1MzmPV0pyltB0CyE4 6TI+F1u57HqqyyioeLdiyOTlIYQucfhqGitMMzgw7Z+YjcqUQBObKiu3f5xWj9kM W9EB2APsY9h9D9OXwz4SmVAV1J6vdCtMkZtPmDdFTlj8Fy3qMd/B7gqRMuTcQcTK L5LMu+n58e4jiuA0So4Hz9DcH+sM/Ui06bNWBFuZ69IGKSWpHKzwDn/tE6+r8cvq oKvdL6Tu3lJv0fa8M1R1JJWYkvZCKGIhiIUc2kMjOYY+Ds8+82M/P3ng0RvPRhAQ 38HA0RjNSlsxhrpY8iFLcme+brHmuneaH/Ekthv+U66Kwfn3mZGJHl+Z5suo4Wu8 ySdjpqh4g5MZeWF2o95P7pTFNT5nopzh3vbLvhRYCChRFenBxrzbcQXarf3LMgbG MVN1c4t1L9fK9bJoOF3kul9X+LsWdtMak6mMesN4RjlY/8X6cI3sfj4ptVJZRdz5 Vq1GPuouSzJ8dHR+tG5l4h9IQc9LrMtt/dVQrTQlvQF0jPP2RVxCWMnvdIG3SmoM fEN/GFYRZslx7uT2hhsg =r4xr -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
37f286e908
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
@ -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
|
||||
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
|
@ -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
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
@ -1872,36 +1821,6 @@ static int _omap4_disable_module(struct omap_hwmod *oh)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
@ -415,15 +420,6 @@ void omap3_prm_reconfigure_io_chain(void)
|
||||
omap2_prm_read_mod_reg(WKUP_MOD, PM_WKST);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*
|
||||
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -422,6 +422,105 @@ void prm_clear_context_loss_flags_old(u8 part, s16 inst, u16 idx)
|
||||
__func__);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user