linux-ti33x-psp 3.2: backport PM and USB fixes from PSP
[glsdk/meta-ti-glsdk.git] / recipes-kernel / linux / linux-ti33x-psp-3.2 / psp / 0002-ARM-OMAP-AM33XX-PM-Get-rid-of-hardcoded-resume-addre.patch
1 From 29ed395e3c56764a994ed4528e10c8835359a34b Mon Sep 17 00:00:00 2001
2 From: Vaibhav Bedia <vaibhav.bedia@ti.com>
3 Date: Tue, 22 May 2012 12:02:02 +0530
4 Subject: [PATCH 02/18] ARM: OMAP: AM33XX: PM: Get rid of hardcoded resume
5  address
7 Instead of using a harcoded resume address in the IPC registers
8 add a dynamically computed offset to the start of OCMC address.
10 Note: This approach currently assumes that the suspend-resume code
11 is the first block of code that is copied to internal RAM. Due to
12 the initcall level used by the SRAM mapping code this holds true.
13 Ideally the sram mapping code should provide an API for doing this.
14 This will be done at a later point of time when the generic SRAM
15 allocator gets merged in mainline kernel.
17 Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com>
18 ---
19  arch/arm/mach-omap2/pm.h        |    1 +
20  arch/arm/mach-omap2/pm33xx.c    |    8 +++++++-
21  arch/arm/mach-omap2/pm33xx.h    |    2 +-
22  arch/arm/mach-omap2/sleep33xx.S |   16 +++-------------
23  4 files changed, 12 insertions(+), 15 deletions(-)
25 diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
26 index 68aeafc..f7a7500 100644
27 --- a/arch/arm/mach-omap2/pm.h
28 +++ b/arch/arm/mach-omap2/pm.h
29 @@ -100,6 +100,7 @@ extern void omap3_save_scratchpad_contents(void);
30  /* am33xx_do_wfi function pointer and size, for copy to SRAM */
31  extern void am33xx_do_wfi(void);
32  extern unsigned int am33xx_do_wfi_sz;
33 +extern unsigned int am33xx_resume_offset;
34  /* ... and its pointer from SRAM after copy */
35  extern void (*am33xx_do_wfi_sram)(void);
36  /* The resume location */
37 diff --git a/arch/arm/mach-omap2/pm33xx.c b/arch/arm/mach-omap2/pm33xx.c
38 index 70bcb42..c4c5187 100644
39 --- a/arch/arm/mach-omap2/pm33xx.c
40 +++ b/arch/arm/mach-omap2/pm33xx.c
41 @@ -217,7 +217,13 @@ static int am33xx_pm_begin(suspend_state_t state)
42  
43         disable_hlt();
44  
45 -       am33xx_lp_ipc.resume_addr = DS_RESUME_ADDR;
46 +       /*
47 +        * Populate the resume address as part of IPC data
48 +        * The offset to be added comes from sleep33xx.S
49 +        * Add 4 bytes to ensure that resume happens from
50 +        * the word *after* the word which holds the resume offset
51 +        */
52 +       am33xx_lp_ipc.resume_addr = (DS_RESUME_BASE + am33xx_resume_offset + 4);
53         am33xx_lp_ipc.sleep_mode  = DS_MODE;
54         am33xx_lp_ipc.ipc_data1   = DS_IPC_DEFAULT;
55         am33xx_lp_ipc.ipc_data2   = DS_IPC_DEFAULT;
56 diff --git a/arch/arm/mach-omap2/pm33xx.h b/arch/arm/mach-omap2/pm33xx.h
57 index f72c28e..7b3504b 100644
58 --- a/arch/arm/mach-omap2/pm33xx.h
59 +++ b/arch/arm/mach-omap2/pm33xx.h
60 @@ -47,7 +47,7 @@ struct am33xx_padconf {
61  
62  #define M3_TXEV_EOI                    (AM33XX_CTRL_BASE + 0x1324)
63  #define A8_M3_IPC_REGS                 (AM33XX_CTRL_BASE + 0x1328)
64 -#define DS_RESUME_ADDR                 0x40300340
65 +#define DS_RESUME_BASE                 0x40300000
66  #define DS_IPC_DEFAULT                 0xffffffff
67  #define M3_UMEM                                0x44D00000
68  
69 diff --git a/arch/arm/mach-omap2/sleep33xx.S b/arch/arm/mach-omap2/sleep33xx.S
70 index 69b49ea..9c57335 100644
71 --- a/arch/arm/mach-omap2/sleep33xx.S
72 +++ b/arch/arm/mach-omap2/sleep33xx.S
73 @@ -234,20 +234,10 @@ wait_emif_enable:
74         mov     r0, #7
75         ldmfd   sp!, {r4 - r11, pc}     @ restore regs and return
76  
77 -       nop
78 -       nop
79 -       nop
80 -       nop
81 -       nop
82 -       nop
83 -       nop
84 -       nop
85 -       nop
86 -       nop
87 -       nop
88 -       nop
89 -       nop
90 +ENTRY(am33xx_resume_offset)
91 +       .word . - am33xx_do_wfi
92  
93 +ENTRY(am33xx_resume_from_deep_sleep)
94         /* Take the PLLs out of LP_BYPASS */
95         pll_lock        mpu, phys_mpu_clk_mode, phys_mpu_idlest
96         pll_lock        per, phys_per_clk_mode, phys_per_idlest
97 -- 
98 1.7.7.6