Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / arch / powerpc / platforms / 52xx / mpc52xx_sleep.S
bloba66eb311b6390c641fe0faf57779ce6a670536c0
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <asm/reg.h>
3 #include <asm/ppc_asm.h>
4 #include <asm/processor.h>
7 .text
9 _GLOBAL(mpc52xx_deep_sleep)
10 mpc52xx_deep_sleep: /* args r3-r6: SRAM, SDRAM regs, CDM regs, INTR regs */
12         /* enable interrupts */
13         mfmsr   r7
14         ori     r7, r7, 0x8000 /* EE */
15         mtmsr   r7
16         sync; isync;
18         li      r10, 0 /* flag that irq handler sets */
20         /* enable tmr7 (or any other) interrupt */
21         lwz     r8, 0x14(r6) /* intr->main_mask */
22         ori     r8, r8, 0x1
23         xori    r8, r8, 0x1
24         stw     r8, 0x14(r6)
25         sync
27         /* emulate tmr7 interrupt */
28         li      r8, 0x1
29         stw     r8, 0x40(r6) /* intr->main_emulate */
30         sync
32         /* wait for it to happen */
34         cmpi    cr0, r10, 1
35         bne     cr0, 1b
37         /* lock icache */
38         mfspr   r10, SPRN_HID0
39         ori     r10, r10, 0x2000
40         sync; isync;
41         mtspr   SPRN_HID0, r10
42         sync; isync;
45         mflr    r9 /* save LR */
47         /* jump to sram */
48         mtlr    r3
49         blrl
51         mtlr    r9 /* restore LR */
53         /* unlock icache */
54         mfspr   r10, SPRN_HID0
55         ori     r10, r10, 0x2000
56         xori    r10, r10, 0x2000
57         sync; isync;
58         mtspr   SPRN_HID0, r10
59         sync; isync;
62         /* return to C code */
63         blr
66 _GLOBAL(mpc52xx_ds_sram)
67 mpc52xx_ds_sram:
68         /* put SDRAM into self-refresh */
69         lwz     r8, 0x4(r4)     /* sdram->ctrl */
71         oris    r8, r8, 0x8000 /* mode_en */
72         stw     r8, 0x4(r4)
73         sync
75         ori     r8, r8, 0x0002 /* soft_pre */
76         stw     r8, 0x4(r4)
77         sync
78         xori    r8, r8, 0x0002
80         xoris   r8, r8, 0x8000 /* !mode_en */
81         stw     r8, 0x4(r4)
82         sync
84         oris    r8, r8, 0x5000
85         xoris   r8, r8, 0x4000 /* ref_en !cke */
86         stw     r8, 0x4(r4)
87         sync
89         /* disable SDRAM clock */
90         lwz     r8, 0x14(r5) /* cdm->clkenable */
91         ori     r8, r8, 0x0008
92         xori    r8, r8, 0x0008
93         stw     r8, 0x14(r5)
94         sync
97         /* put mpc5200 to sleep */
98         mfmsr   r10
99         oris    r10, r10, 0x0004        /* POW = 1 */
100         sync; isync;
101         mtmsr   r10
102         sync; isync;
105         /* enable clock */
106         lwz     r8, 0x14(r5)
107         ori     r8, r8, 0x0008
108         stw     r8, 0x14(r5)
109         sync
111         /* get ram out of self-refresh */
112         lwz     r8, 0x4(r4)
113         oris    r8, r8, 0x5000 /* cke ref_en */
114         stw     r8, 0x4(r4)
115         sync
117         blr
118 _GLOBAL(mpc52xx_ds_sram_size)
119 mpc52xx_ds_sram_size:
120         .long $-mpc52xx_ds_sram
123 /* ### interrupt handler for wakeup from deep-sleep ### */
124 _GLOBAL(mpc52xx_ds_cached)
125 mpc52xx_ds_cached:
126         mtspr   SPRN_SPRG0, r7
127         mtspr   SPRN_SPRG1, r8
129         /* disable emulated interrupt */
130         mfspr   r7, 311 /* MBAR */
131         addi    r7, r7, 0x540   /* intr->main_emul */
132         li      r8, 0
133         stw     r8, 0(r7)
134         sync
135         dcbf    0, r7
137         /* acknowledge wakeup, so CCS releases power pown */
138         mfspr   r7, 311 /* MBAR */
139         addi    r7, r7, 0x524   /* intr->enc_status */
140         lwz     r8, 0(r7)
141         ori     r8, r8, 0x0400
142         stw     r8, 0(r7)
143         sync
144         dcbf    0, r7
146         /* flag - we handled the interrupt */
147         li      r10, 1
149         mfspr   r8, SPRN_SPRG1
150         mfspr   r7, SPRN_SPRG0
152         rfi
153 _GLOBAL(mpc52xx_ds_cached_size)
154 mpc52xx_ds_cached_size:
155         .long $-mpc52xx_ds_cached