Merge tag 'fixes-nc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[~shefty/rdma-dev.git] / arch / arm / mach-omap2 / omap_hwmod.c
index e5cafed8ef2584dc20a86bbbed5821e6063384c0..9553c9907d40930296f3af1103bf319d4f9d2ff9 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 #include <linux/bootmem.h>
+#include <linux/cpu.h>
 
 #include <asm/system_misc.h>
 
@@ -1364,7 +1365,9 @@ static void _enable_sysc(struct omap_hwmod *oh)
        }
 
        if (sf & SYSC_HAS_MIDLEMODE) {
-               if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
+               if (oh->flags & HWMOD_FORCE_MSTANDBY) {
+                       idlemode = HWMOD_IDLEMODE_FORCE;
+               } else if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
                        idlemode = HWMOD_IDLEMODE_NO;
                } else {
                        if (sf & SYSC_HAS_ENAWAKEUP)
@@ -1436,7 +1439,8 @@ static void _idle_sysc(struct omap_hwmod *oh)
        }
 
        if (sf & SYSC_HAS_MIDLEMODE) {
-               if (oh->flags & HWMOD_SWSUP_MSTANDBY) {
+               if ((oh->flags & HWMOD_SWSUP_MSTANDBY) ||
+                   (oh->flags & HWMOD_FORCE_MSTANDBY)) {
                        idlemode = HWMOD_IDLEMODE_FORCE;
                } else {
                        if (sf & SYSC_HAS_ENAWAKEUP)
@@ -2150,7 +2154,7 @@ static int _enable(struct omap_hwmod *oh)
        if (soc_ops.enable_module)
                soc_ops.enable_module(oh);
        if (oh->flags & HWMOD_BLOCK_WFI)
-               disable_hlt();
+               cpu_idle_poll_ctrl(true);
 
        if (soc_ops.update_context_lost)
                soc_ops.update_context_lost(oh);
@@ -2214,7 +2218,7 @@ static int _idle(struct omap_hwmod *oh)
        _del_initiator_dep(oh, mpu_oh);
 
        if (oh->flags & HWMOD_BLOCK_WFI)
-               enable_hlt();
+               cpu_idle_poll_ctrl(false);
        if (soc_ops.disable_module)
                soc_ops.disable_module(oh);
 
@@ -2324,7 +2328,7 @@ static int _shutdown(struct omap_hwmod *oh)
                _del_initiator_dep(oh, mpu_oh);
                /* XXX what about the other system initiators here? dma, dsp */
                if (oh->flags & HWMOD_BLOCK_WFI)
-                       enable_hlt();
+                       cpu_idle_poll_ctrl(false);
                if (soc_ops.disable_module)
                        soc_ops.disable_module(oh);
                _disable_clocks(oh);