When the kernel is configured to use the Thumb-2 instruction set "suspend-to-memory" fails to resume while in ARM mode it works as expected. (I used imx_v6_v7_defconfig and deselected ARCH_MULTI_V6 and selected THUMB2_KERNEL)
The system prints what is expected when suspending but an event of a wakeup source does give no output. root@colibri-imx6ull:~# echo mem > /sys/power/state [ 58.610809] PM: suspend entry (deep) [ 58.629354] Filesystems sync: 0.014 seconds [ 58.653411] Freezing user space processes ... (elapsed 0.001 seconds) done. [ 58.661941] OOM killer disabled. [ 58.665176] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done. [ 58.674028] printk: Suspending console(s) (use no_console_suspend to debug) -> trigger wakeup event, no reaction. It looks like the CPU resumes unconditionally in ARM instruction mode and then chokes on the presented Thumb-2 code it should execute on resume. With the following code change resume succeeds. --- a/arch/arm/mach-imx/suspend-imx6.S +++ b/arch/arm/mach-imx/suspend-imx6.S @@ -287,11 +286,20 @@ rbc_loop: bne rbc_loop /* Zzz, enter stop mode */ wfi +#ifdef CONFIG_THUMB2_KERNEL + /* i.MX CPUs seem to leave stop mode set to ARM instruction set */ + .arm +#endif nop nop nop nop +#ifdef CONFIG_THUMB2_KERNEL + /* switch to Thumb2 mode */ + sub pc, pc, #3 + .thumb +#endif /* I propose however to compile the whole file in ARM mode and have the linker taking care of the ARM/Thumb-2 switching. This would also keep the code working if a i.MX CPU variant exists that resumes in the same mode in which it went to sleep. Max Krummenacher (1): ARM: imx: build suspend-imx6.S with arm instruction set arch/arm/mach-imx/suspend-imx6.S | 1 + 1 file changed, 1 insertion(+) -- 2.26.2