From: "Govindraj.R" <govindraj.raja@xxxxxx> On 24xx/34xx/36xx Module level wakeup events are enabled/disabled using PM_WKEN1_CORE/PM_WKEN_PER regs. Add api to control the module level wakeup mechanism from info provided from hwmod data. If module level wakeups are available from hwmod data then they have to be enabled/disabled as per driver request. omap_hwmod_enable/disable_wakeup is used from serial.c which should act on those registers to enable or disable the module level wakeup Cc: Paul Walmsley <paul@xxxxxxxxx> Cc: Kevin Hilman <khilman@xxxxxx> Signed-off-by: Govindraj.R <govindraj.raja@xxxxxx> --- arch/arm/mach-omap2/omap_hwmod.c | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 2c27fdb..05576ae 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -382,6 +382,35 @@ static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle, } /** + * _enable_module_level_wakeup - enable/disable module level wakeup on hwmod. + * @oh: struct omap_hwmod * + * @set_wake: bool value indicating to set (true) or clear (false) module level + * wakeup enable + * + * Set or clear the module level wakeup capability the + * hwmod @oh. This function configures th PM_WKEN reg bits if they + * are available from hwmod. No return value + */ +static void _enable_module_level_wakeup(struct omap_hwmod *oh, bool set_wake) +{ + u32 v; + + if (oh->prcm.omap2.module_wakeup_offs && + oh->prcm.omap2.module_wakeup_bit) { + v = omap2_prm_read_mod_reg(oh->prcm.omap2.module_offs, + oh->prcm.omap2.module_wakeup_offs); + + if (set_wake) + v |= oh->prcm.omap2.module_wakeup_bit; + else + v &= ~oh->prcm.omap2.module_wakeup_bit; + + omap2_prm_write_mod_reg(v, oh->prcm.omap2.module_offs, + oh->prcm.omap2.module_wakeup_offs); + } +} + +/** * _set_idle_ioring_wakeup - enable/disable IO pad wakeup on hwmod idle for mux * @oh: struct omap_hwmod * * @set_wake: bool value indicating to set (true) or clear (false) wakeup enable @@ -2471,6 +2500,7 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) _write_sysconfig(v, oh); } + _enable_module_level_wakeup(oh, true); _set_idle_ioring_wakeup(oh, true); spin_unlock_irqrestore(&oh->_lock, flags); @@ -2504,6 +2534,7 @@ int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) _write_sysconfig(v, oh); } + _enable_module_level_wakeup(oh, false); _set_idle_ioring_wakeup(oh, false); spin_unlock_irqrestore(&oh->_lock, flags); -- 1.7.9 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html