Hi Russell, On Thu, Jun 23, 2011 at 9:09 PM, Russell King - ARM Linux <linux@xxxxxxxxxxxxxxxx> wrote: > 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. That is a great set of patches! We are now close to have a clean suspend code, all the way from arch code to low level OMAP-specific ASM implementation. FWIW: Acked-by: Jean Pihet <j-pihet@xxxxxx> Regards, Jean > > 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 > -- 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