Kevin,
On Fri, Jun 24, 2011 at 2:16 AM, Kevin Hilman wrote:
> Upon return from off-mode, the ROM code jumps to a restore function
> saved in the scratchpad. Based on SoC revision or errata, this
> restore entry point is different. Current code uses some helper
> functions in sleep34xx.S (get_*_restore_pointer) to get the restore
> function entry point.
>
> When returning from off-mode, this code is executed from SDRAM, so
> there's no reason to use these helper functions when using the SDRAM
> entry points directly would work just fine.
>
> This patch uses ENTRY/ENDPROC to create "real" entry points for these
> functions, and uses those values directly when writing the scratchpad.
>
> Tested all three entry points
> - restore_es3: 3430/n900
> - restore_3630: 3630/Zoom3
> - restore: 3530/Overo
>
> Suggested-by: Russell King
> Cc: Jean Pihet
> Signed-off-by: Kevin Hilman
This makes sense. FWIW:
Acked-by: Jean Pihet ---
> Applies on top of Russell's suspend cleanup/rejig, and available
> (along with Russell's series) in my pm-wip/idle-suspend branch.
>
> Russell, since it depends on your series, feel free to add it to your
> series if you like. Or if you prefer, we can take it through the OMAP
> tree.
>
> arch/arm/mach-omap2/control.c | 7 ++--
> arch/arm/mach-omap2/control.h | 6 ++--
> arch/arm/mach-omap2/sleep34xx.S | 61 +++---
> 3 files changed, 19 insertions(+), 55 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c
> index da53ba3..aab884f 100644
> --- a/arch/arm/mach-omap2/control.c
> +++ b/arch/arm/mach-omap2/control.c
> @@ -286,14 +286,15 @@ void omap3_save_scratchpad_contents(void)
> scratchpad_contents.boot_config_ptr = 0x0;
> if (cpu_is_omap3630())
> scratchpad_contents.public_restore_ptr =
> - virt_to_phys(get_omap3630_restore_pointer());
> + virt_to_phys(omap3_restore_3630);
> else if (omap_rev() != OMAP3430_REV_ES3_0 &&
> omap_rev() != OMAP3430_REV_ES3_1)
> scratchpad_contents.public_restore_ptr =
> - virt_to_phys(get_restore_pointer());
> + virt_to_phys(omap3_restore);
> else
> scratchpad_contents.public_restore_ptr =
> - virt_to_phys(get_es3_restore_pointer());
> + virt_to_phys(omap3_restore_es3);
> +
> if (omap_type() == OMAP2_DEVICE_TYPE_GP)
> scratchpad_contents.secure_ram_restore_ptr = 0x0;
> else
> diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
> index a016c8b..d4ef75d 100644
> --- a/arch/arm/mach-omap2/control.h
> +++ b/arch/arm/mach-omap2/control.h
> @@ -386,9 +386,9 @@ extern void omap4_ctrl_pad_writel(u32 val, u16 offset);
>
> extern void omap3_save_scratchpad_contents(void);
> extern void omap3_clear_scratchpad_contents(void);
> -extern u32 *get_restore_pointer(void);
> -extern u32 *get_es3_restore_pointer(void);
> -extern u32 *get_omap3630_restore_pointer(void);
> +extern void omap3_restore(void);
> +extern void omap3_restore_es3(void);
> +extern void omap3_restore_3630(void);
> extern u32 omap3_arm_context[128];
> extern void omap3_control_save_context(void);
> extern void omap3_control_restore_context(void);
> diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
> index 9a1349e..177f70f 100644
> --- a/arch/arm/mach-omap2/sleep34xx.S
> +++ b/arch/arm/mach-omap2/sleep34xx.S
> @@ -74,46 +74,6 @@
> * API functions
> */
>
> -/*
> - * The "get_*restore_pointer" functions are used to provide a
> - * physical restore address where the ROM code jumps while waking
> - * up from MPU OFF/OSWR state.
> - * The restore pointer is stored into the scratchpad.
> - */
> -
> - .text
> -/* Function call to get the restore pointer for resume from OFF */
> -ENTRY(get_restore_pointer)
> - stmfd sp!, {lr} @ save registers on stack
> - adr r0, restore
> - ldmfd sp!, {pc} @ restore regs and return
> -ENDPROC(get_restore_pointer)
> - .align
> -ENTRY(get_restore_pointer_sz)
> - .word . - get_restore_pointer
> -
> - .text
> -/* Function call to get the restore pointer for 3630 resume from OFF */
> -ENTRY(get_omap3630_restore_pointer)
> - stmfd sp!, {lr} @ save registers on stack
> - adr r0, restore_3630
> - ldmfd sp!, {pc} @ restore regs and return
> -ENDPROC(get_omap3630_restore_pointer)
> - .align
> -ENTRY(get_omap3630_restore_pointer_sz)
> - .word . - get_omap3630_restore_pointer
> -
> - .text
> -/* Function call to get the restore pointer for ES3 to resume from OFF */
> -ENTRY(get_es3_restore_pointer)
> - stmfd sp!, {lr} @ save registers on stack
> - adr r0, restore_es3
> - ldmfd sp!, {pc} @ restore regs and return
> -ENDPROC