Version 3. Currently cpu_suspend is not like a normal C function - when it's called it returns normally to a bunch of code which is not expected to return. The return path is via code pointed to by 'r3'. It also corrupts a bunch of registers in ways which make it non-compliant with a C API. If we do make this compliant as a normal C-like function, it eliminates this register saving, and also allows us to make greater savings. We also swap 'lr' and 'r3', so cpu_suspend effectively only returns to following code on resume - and r3 points to the suspend code. I've also changed cpu_suspend() to have a saner visible prototype for calling from platforms, hiding the needed v:p offset parameter in the inline function. So, this becomes: static void soc_suspend(void) { [soc specific preparation] cpu_suspend(soc_suspend_arg, soc_finish_suspend); [soc specific cleanup ] } where soc_suspend_fn can be either assembly or C code - but must never return. (See separate patch posted on 13th June to allow it to return.) This patch series also merges the call to cpu_init() into cpu_suspend(), and makes cpu_init() call the per-CPU initialization function to ensure that various registers are setup (eg, clock switching on StrongARM, read-buffer enabled for userspace, etc.) This allows some more custom platform suspend code to be removed. I've been able to convert OMAP3 suspend support and test it in both retention and off modes. The only platform not converted to cpu_suspend() is the shmobile stuff, which I've requested their assistance with. This patch set also eliminates 300 LOC from platform code. Tested on Assabet (SA1100) and 3430LDP only. arch/arm/include/asm/suspend.h | 21 ++++ arch/arm/kernel/setup.c | 99 ++++++++++---------- arch/arm/kernel/sleep.S | 73 ++++++--------- arch/arm/mach-exynos4/pm.c | 2 +- arch/arm/mach-exynos4/sleep.S | 22 ---- arch/arm/mach-omap2/pm34xx.c | 48 ++------- arch/arm/mach-omap2/sleep34xx.S | 160 ++----------------------------- arch/arm/mach-pxa/include/mach/pm.h | 4 +- arch/arm/mach-pxa/palmz72.c | 1 + arch/arm/mach-pxa/pm.c | 1 - arch/arm/mach-pxa/pxa25x.c | 3 +- arch/arm/mach-pxa/pxa27x.c | 11 ++- arch/arm/mach-pxa/pxa3xx.c | 14 +++- arch/arm/mach-pxa/sleep.S | 55 ++--------- arch/arm/mach-pxa/zeus.c | 3 +- arch/arm/mach-s3c2412/pm.c | 4 +- arch/arm/mach-s3c2416/pm.c | 4 +- arch/arm/mach-s3c64xx/pm.c | 2 +- arch/arm/mach-s3c64xx/sleep.S | 23 ----- arch/arm/mach-s5pv210/pm.c | 2 +- arch/arm/mach-s5pv210/sleep.S | 21 ---- arch/arm/mach-sa1100/pm.c | 7 +- arch/arm/mach-sa1100/sleep.S | 19 +---- arch/arm/mm/proc-sa1100.S | 4 +- arch/arm/mm/proc-v7.S | 10 ++- arch/arm/plat-s3c24xx/sleep.S | 25 ----- arch/arm/plat-samsung/include/plat/pm.h | 5 +- arch/arm/plat-samsung/pm.c | 11 +-- 28 files changed, 180 insertions(+), 474 deletions(-) -- 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