@@ -2140,12 +2140,15 @@ static int _enable(struct omap_hwmod *oh)
r = (soc_ops.wait_target_ready) ? soc_ops.wait_target_ready(oh) :
-EINVAL;
if (!r) {
+ if (oh->clkdm && (oh->flags & HWMOD_CLKDM_NOAUTO))
+ clkdm_hwmod_prevent_hwauto(oh->clkdm, oh);
+
/*
* Set the clockdomain to HW_AUTO only if the target is ready,
* assuming that the previous state was HW_AUTO
*/
if (oh->clkdm && hwsup)
- clkdm_allow_idle(oh->clkdm);
+ clkdm_hwmod_hwauto(oh->clkdm, oh);
oh->_state = _HWMOD_STATE_ENABLED;
@@ -2207,8 +2210,15 @@ static int _idle(struct omap_hwmod *oh)
* transition to complete properly.
*/
_disable_clocks(oh);
- if (oh->clkdm)
+
+ if (oh->clkdm) {
+ if (oh->flags & HWMOD_CLKDM_NOAUTO) {
+ clkdm_hwmod_allow_hwauto(oh->clkdm, oh);
+ clkdm_hwmod_hwauto(oh->clkdm, oh);
+ }
+
clkdm_hwmod_disable(oh->clkdm, oh);
+ }
/* Mux pins for device idle if populated */
if (oh->mux && oh->mux->pads_dynamic) {
@@ -532,6 +532,7 @@ struct omap_hwmod_omap4_prcm {
#define HWMOD_FORCE_MSTANDBY (1 << 11)
#define HWMOD_SWSUP_SIDLE_ACT (1 << 12)
#define HWMOD_RECONFIG_IO_CHAIN (1 << 13)
+#define HWMOD_CLKDM_NOAUTO (1 << 14)
/*
* omap_hwmod._int_flags definitions
Introduce HWMOD_CLKDM_NOAUTO flag that allows the hwmod's clockdomain to be prevented from HW_AUTO while the hwmod is active. This is needed to workaround some modules which don't function correctly with HW_AUTO. e.g. DCAN on DRA7. Signed-off-by: Roger Quadros <rogerq@ti.com> --- arch/arm/mach-omap2/omap_hwmod.c | 14 ++++++++++++-- arch/arm/mach-omap2/omap_hwmod.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-)