~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/mach-at91/pm_suspend.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/arm/mach-at91/pm_suspend.S (Version linux-6.12-rc7) and /arch/i386/mach-at91/pm_suspend.S (Version linux-6.1.116)


  1 /* SPDX-License-Identifier: GPL-2.0-only */       
  2 /*                                                
  3  * arch/arm/mach-at91/pm_slow_clock.S             
  4  *                                                
  5  *  Copyright (C) 2006 Savin Zlobec               
  6  *                                                
  7  * AT91SAM9 support:                              
  8  *  Copyright (C) 2007 Anti Sullin <anti.sullin    
  9  */                                               
 10 #include <linux/linkage.h>                        
 11 #include <linux/clk/at91_pmc.h>                   
 12 #include "pm.h"                                   
 13 #include "pm_data-offsets.h"                      
 14                                                   
 15 #ifdef CONFIG_CPU_V7                              
 16 .arch armv7-a                                     
 17 #endif                                            
 18                                                   
 19 #define SRAMC_SELF_FRESH_ACTIVE         0x01      
 20 #define SRAMC_SELF_FRESH_EXIT           0x00      
 21                                                   
 22 pmc     .req    r0                                
 23 tmp1    .req    r4                                
 24 tmp2    .req    r5                                
 25 tmp3    .req    r6                                
 26                                                   
 27 /*                                                
 28  * Wait until master clock is ready (after swi    
 29  *                                                
 30  * @r_mckid:    register holding master clock     
 31  *                                                
 32  * Side effects: overwrites r7, r8                
 33  */                                               
 34         .macro wait_mckrdy r_mckid                
 35 #ifdef CONFIG_SOC_SAMA7                           
 36         cmp     \r_mckid, #0                      
 37         beq     1f                                
 38         mov     r7, #AT91_PMC_MCKXRDY             
 39         b       2f                                
 40 #endif                                            
 41 1:      mov     r7, #AT91_PMC_MCKRDY              
 42 2:      ldr     r8, [pmc, #AT91_PMC_SR]           
 43         and     r8, r7                            
 44         cmp     r8, r7                            
 45         bne     2b                                
 46         .endm                                     
 47                                                   
 48 /*                                                
 49  * Wait until master oscillator has stabilized    
 50  *                                                
 51  * Side effects: overwrites r7                    
 52  */                                               
 53         .macro wait_moscrdy                       
 54 1:      ldr     r7, [pmc, #AT91_PMC_SR]           
 55         tst     r7, #AT91_PMC_MOSCS               
 56         beq     1b                                
 57         .endm                                     
 58                                                   
 59 /*                                                
 60  * Wait for main oscillator selection is done     
 61  *                                                
 62  * Side effects: overwrites r7                    
 63  */                                               
 64         .macro wait_moscsels                      
 65 1:      ldr     r7, [pmc, #AT91_PMC_SR]           
 66         tst     r7, #AT91_PMC_MOSCSELS            
 67         beq     1b                                
 68         .endm                                     
 69                                                   
 70 /*                                                
 71  * Put the processor to enter the idle state      
 72  *                                                
 73  * Side effects: overwrites r7                    
 74  */                                               
 75         .macro at91_cpu_idle                      
 76                                                   
 77 #if defined(CONFIG_CPU_V7)                        
 78         mov     r7, #AT91_PMC_PCK                 
 79         str     r7, [pmc, #AT91_PMC_SCDR]         
 80                                                   
 81         dsb                                       
 82                                                   
 83         wfi             @ Wait For Interrupt      
 84 #else                                             
 85         mcr     p15, 0, tmp1, c7, c0, 4           
 86 #endif                                            
 87                                                   
 88         .endm                                     
 89                                                   
 90 /**                                               
 91  * Set state for 2.5V low power regulator         
 92  * @ena: 0 - disable regulator                    
 93  *       1 - enable regulator                     
 94  *                                                
 95  * Side effects: overwrites r7, r8, r9, r10       
 96  */                                               
 97         .macro at91_2_5V_reg_set_low_power ena    
 98 #ifdef CONFIG_SOC_SAMA7                           
 99         ldr     r7, .sfrbu                        
100         mov     r8, #\ena                         
101         ldr     r9, [r7, #AT91_SFRBU_25LDOCR]     
102         orr     r9, r9, #AT91_SFRBU_25LDOCR_LP    
103         cmp     r8, #1                            
104         beq     lp_done_\ena                      
105         bic     r9, r9, #AT91_SFRBU_25LDOCR_LP    
106 lp_done_\ena:                                     
107         ldr     r10, =AT91_SFRBU_25LDOCR_LDOAN    
108         orr     r9, r9, r10                       
109         str     r9, [r7, #AT91_SFRBU_25LDOCR]     
110 #endif                                            
111         .endm                                     
112                                                   
113         .macro at91_backup_set_lpm reg            
114 #ifdef CONFIG_SOC_SAMA7                           
115         orr     \reg, \reg, #0x200000             
116 #endif                                            
117         .endm                                     
118                                                   
119         .text                                     
120                                                   
121         .arm                                      
122                                                   
123 #ifdef CONFIG_SOC_SAMA7                           
124 /**                                               
125  * Enable self-refresh                            
126  *                                                
127  * Side effects: overwrites r2, r3, tmp1, tmp2    
128  */                                               
129 .macro at91_sramc_self_refresh_ena                
130         ldr     r2, .sramc_base                   
131         ldr     r3, .sramc_phy_base               
132         ldr     r7, .pm_mode                      
133                                                   
134         dsb                                       
135                                                   
136         /* Disable all AXI ports. */              
137         ldr     tmp1, [r2, #UDDRC_PCTRL_0]        
138         bic     tmp1, tmp1, #0x1                  
139         str     tmp1, [r2, #UDDRC_PCTRL_0]        
140                                                   
141         ldr     tmp1, [r2, #UDDRC_PCTRL_1]        
142         bic     tmp1, tmp1, #0x1                  
143         str     tmp1, [r2, #UDDRC_PCTRL_1]        
144                                                   
145         ldr     tmp1, [r2, #UDDRC_PCTRL_2]        
146         bic     tmp1, tmp1, #0x1                  
147         str     tmp1, [r2, #UDDRC_PCTRL_2]        
148                                                   
149         ldr     tmp1, [r2, #UDDRC_PCTRL_3]        
150         bic     tmp1, tmp1, #0x1                  
151         str     tmp1, [r2, #UDDRC_PCTRL_3]        
152                                                   
153         ldr     tmp1, [r2, #UDDRC_PCTRL_4]        
154         bic     tmp1, tmp1, #0x1                  
155         str     tmp1, [r2, #UDDRC_PCTRL_4]        
156                                                   
157 sr_ena_1:                                         
158         /* Wait for all ports to disable. */      
159         ldr     tmp1, [r2, #UDDRC_PSTAT]          
160         ldr     tmp2, =UDDRC_PSTAT_ALL_PORTS      
161         tst     tmp1, tmp2                        
162         bne     sr_ena_1                          
163                                                   
164         /* Switch to self-refresh. */             
165         ldr     tmp1, [r2, #UDDRC_PWRCTL]         
166         orr     tmp1, tmp1, #UDDRC_PWRCTL_SELF    
167         str     tmp1, [r2, #UDDRC_PWRCTL]         
168                                                   
169 sr_ena_2:                                         
170         /* Wait for self-refresh enter. */        
171         ldr     tmp1, [r2, #UDDRC_STAT]           
172         bic     tmp1, tmp1, #~UDDRC_STAT_SELFR    
173         cmp     tmp1, #UDDRC_STAT_SELFREF_TYPE    
174         bne     sr_ena_2                          
175                                                   
176         /* Disable DX DLLs for non-backup mode    
177         cmp     r7, #AT91_PM_BACKUP               
178         beq     sr_ena_3                          
179                                                   
180         /* Do not soft reset the AC DLL. */       
181         ldr     tmp1, [r3, DDR3PHY_ACDLLCR]       
182         bic     tmp1, tmp1, DDR3PHY_ACDLLCR_DL    
183         str     tmp1, [r3, DDR3PHY_ACDLLCR]       
184                                                   
185         /* Disable DX DLLs. */                    
186         ldr     tmp1, [r3, #DDR3PHY_DX0DLLCR]     
187         orr     tmp1, tmp1, #DDR3PHY_DXDLLCR_D    
188         str     tmp1, [r3, #DDR3PHY_DX0DLLCR]     
189                                                   
190         ldr     tmp1, [r3, #DDR3PHY_DX1DLLCR]     
191         orr     tmp1, tmp1, #DDR3PHY_DXDLLCR_D    
192         str     tmp1, [r3, #DDR3PHY_DX1DLLCR]     
193                                                   
194 sr_ena_3:                                         
195         /* Power down DDR PHY data receivers.     
196         ldr     tmp1, [r3, #DDR3PHY_DXCCR]        
197         orr     tmp1, tmp1, #DDR3PHY_DXCCR_DXP    
198         str     tmp1, [r3, #DDR3PHY_DXCCR]        
199                                                   
200         /* Power down ADDR/CMD IO. */             
201         ldr     tmp1, [r3, #DDR3PHY_ACIOCR]       
202         orr     tmp1, tmp1, #DDR3PHY_ACIORC_AC    
203         orr     tmp1, tmp1, #DDR3PHY_ACIOCR_CK    
204         orr     tmp1, tmp1, #DDR3PHY_ACIOCR_CS    
205         str     tmp1, [r3, #DDR3PHY_ACIOCR]       
206                                                   
207         /* Power down ODT. */                     
208         ldr     tmp1, [r3, #DDR3PHY_DSGCR]        
209         orr     tmp1, tmp1, #DDR3PHY_DSGCR_ODT    
210         str     tmp1, [r3, #DDR3PHY_DSGCR]        
211 .endm                                             
212                                                   
213 /**                                               
214  * Disable self-refresh                           
215  *                                                
216  * Side effects: overwrites r2, r3, tmp1, tmp2    
217  */                                               
218 .macro at91_sramc_self_refresh_dis                
219         ldr     r2, .sramc_base                   
220         ldr     r3, .sramc_phy_base               
221                                                   
222         /* Power up DDR PHY data receivers. */    
223         ldr     tmp1, [r3, #DDR3PHY_DXCCR]        
224         bic     tmp1, tmp1, #DDR3PHY_DXCCR_DXP    
225         str     tmp1, [r3, #DDR3PHY_DXCCR]        
226                                                   
227         /* Power up the output of CK and CS pi    
228         ldr     tmp1, [r3, #DDR3PHY_ACIOCR]       
229         bic     tmp1, tmp1, #DDR3PHY_ACIORC_AC    
230         bic     tmp1, tmp1, #DDR3PHY_ACIOCR_CK    
231         bic     tmp1, tmp1, #DDR3PHY_ACIOCR_CS    
232         str     tmp1, [r3, #DDR3PHY_ACIOCR]       
233                                                   
234         /* Power up ODT. */                       
235         ldr     tmp1, [r3, #DDR3PHY_DSGCR]        
236         bic     tmp1, tmp1, #DDR3PHY_DSGCR_ODT    
237         str     tmp1, [r3, #DDR3PHY_DSGCR]        
238                                                   
239         /* Enable DX DLLs. */                     
240         ldr     tmp1, [r3, #DDR3PHY_DX0DLLCR]     
241         bic     tmp1, tmp1, #DDR3PHY_DXDLLCR_D    
242         str     tmp1, [r3, #DDR3PHY_DX0DLLCR]     
243                                                   
244         ldr     tmp1, [r3, #DDR3PHY_DX1DLLCR]     
245         bic     tmp1, tmp1, #DDR3PHY_DXDLLCR_D    
246         str     tmp1, [r3, #DDR3PHY_DX1DLLCR]     
247                                                   
248         /* Enable quasi-dynamic programming. *    
249         mov     tmp1, #0                          
250         str     tmp1, [r2, #UDDRC_SWCTRL]         
251                                                   
252         /* De-assert SDRAM initialization. */     
253         ldr     tmp1, [r2, #UDDRC_DFIMISC]        
254         bic     tmp1, tmp1, #UDDRC_DFIMISC_DFI    
255         str     tmp1, [r2, #UDDRC_DFIMISC]        
256                                                   
257         /* Quasi-dynamic programming done. */     
258         mov     tmp1, #UDDRC_SWCTRL_SW_DONE       
259         str     tmp1, [r2, #UDDRC_SWCTRL]         
260                                                   
261 sr_dis_1:                                         
262         ldr     tmp1, [r2, #UDDRC_SWSTAT]         
263         tst     tmp1, #UDDRC_SWSTAT_SW_DONE_AC    
264         beq     sr_dis_1                          
265                                                   
266         /* DLL soft-reset + DLL lock wait + IT    
267         mov     tmp1, #(DDR3PHY_PIR_INIT | DDR    
268                         DDR3PHY_PIR_DLLLOCK |     
269         str     tmp1, [r3, #DDR3PHY_PIR]          
270                                                   
271 sr_dis_4:                                         
272         /* Wait for it. */                        
273         ldr     tmp1, [r3, #DDR3PHY_PGSR]         
274         tst     tmp1, #DDR3PHY_PGSR_IDONE         
275         beq     sr_dis_4                          
276                                                   
277         /* Enable quasi-dynamic programming. *    
278         mov     tmp1, #0                          
279         str     tmp1, [r2, #UDDRC_SWCTRL]         
280                                                   
281         /* Assert PHY init complete enable sig    
282         ldr     tmp1, [r2, #UDDRC_DFIMISC]        
283         orr     tmp1, tmp1, #UDDRC_DFIMISC_DFI    
284         str     tmp1, [r2, #UDDRC_DFIMISC]        
285                                                   
286         /* Programming is done. Set sw_done. *    
287         mov     tmp1, #UDDRC_SWCTRL_SW_DONE       
288         str     tmp1, [r2, #UDDRC_SWCTRL]         
289                                                   
290 sr_dis_5:                                         
291         /* Wait for it. */                        
292         ldr     tmp1, [r2, #UDDRC_SWSTAT]         
293         tst     tmp1, #UDDRC_SWSTAT_SW_DONE_AC    
294         beq     sr_dis_5                          
295                                                   
296         /* Trigger self-refresh exit. */          
297         ldr     tmp1, [r2, #UDDRC_PWRCTL]         
298         bic     tmp1, tmp1, #UDDRC_PWRCTL_SELF    
299         str     tmp1, [r2, #UDDRC_PWRCTL]         
300                                                   
301 sr_dis_6:                                         
302         /* Wait for self-refresh exit done. */    
303         ldr     tmp1, [r2, #UDDRC_STAT]           
304         bic     tmp1, tmp1, #~UDDRC_STAT_OPMOD    
305         cmp     tmp1, #UDDRC_STAT_OPMODE_NORMA    
306         bne     sr_dis_6                          
307                                                   
308         /* Enable all AXI ports. */               
309         ldr     tmp1, [r2, #UDDRC_PCTRL_0]        
310         orr     tmp1, tmp1, #0x1                  
311         str     tmp1, [r2, #UDDRC_PCTRL_0]        
312                                                   
313         ldr     tmp1, [r2, #UDDRC_PCTRL_1]        
314         orr     tmp1, tmp1, #0x1                  
315         str     tmp1, [r2, #UDDRC_PCTRL_1]        
316                                                   
317         ldr     tmp1, [r2, #UDDRC_PCTRL_2]        
318         orr     tmp1, tmp1, #0x1                  
319         str     tmp1, [r2, #UDDRC_PCTRL_2]        
320                                                   
321         ldr     tmp1, [r2, #UDDRC_PCTRL_3]        
322         orr     tmp1, tmp1, #0x1                  
323         str     tmp1, [r2, #UDDRC_PCTRL_3]        
324                                                   
325         ldr     tmp1, [r2, #UDDRC_PCTRL_4]        
326         orr     tmp1, tmp1, #0x1                  
327         str     tmp1, [r2, #UDDRC_PCTRL_4]        
328                                                   
329         dsb                                       
330 .endm                                             
331 #else                                             
332 /**                                               
333  * Enable self-refresh                            
334  *                                                
335  * register usage:                                
336  *      @r1: memory type                          
337  *      @r2: base address of the sram controll    
338  *      @r3: temporary                            
339  */                                               
340 .macro at91_sramc_self_refresh_ena                
341         ldr     r1, .memtype                      
342         ldr     r2, .sramc_base                   
343                                                   
344         cmp     r1, #AT91_MEMCTRL_MC              
345         bne     sr_ena_ddrc_sf                    
346                                                   
347         /* Active SDRAM self-refresh mode */      
348         mov     r3, #1                            
349         str     r3, [r2, #AT91_MC_SDRAMC_SRR]     
350         b       sr_ena_exit                       
351                                                   
352 sr_ena_ddrc_sf:                                   
353         cmp     r1, #AT91_MEMCTRL_DDRSDR          
354         bne     sr_ena_sdramc_sf                  
355                                                   
356         /*                                        
357          * DDR Memory controller                  
358          */                                       
359                                                   
360         /* LPDDR1 --> force DDR2 mode during s    
361         ldr     r3, [r2, #AT91_DDRSDRC_MDR]       
362         str     r3, .saved_sam9_mdr               
363         bic     r3, r3, #~AT91_DDRSDRC_MD         
364         cmp     r3, #AT91_DDRSDRC_MD_LOW_POWER    
365         ldreq   r3, [r2, #AT91_DDRSDRC_MDR]       
366         biceq   r3, r3, #AT91_DDRSDRC_MD          
367         orreq   r3, r3, #AT91_DDRSDRC_MD_DDR2     
368         streq   r3, [r2, #AT91_DDRSDRC_MDR]       
369                                                   
370         /* Active DDRC self-refresh mode */       
371         ldr     r3, [r2, #AT91_DDRSDRC_LPR]       
372         str     r3, .saved_sam9_lpr               
373         bic     r3, r3, #AT91_DDRSDRC_LPCB        
374         orr     r3, r3, #AT91_DDRSDRC_LPCB_SEL    
375         str     r3, [r2, #AT91_DDRSDRC_LPR]       
376                                                   
377         /* If using the 2nd ddr controller */     
378         ldr     r2, .sramc1_base                  
379         cmp     r2, #0                            
380         beq     sr_ena_no_2nd_ddrc                
381                                                   
382         ldr     r3, [r2, #AT91_DDRSDRC_MDR]       
383         str     r3, .saved_sam9_mdr1              
384         bic     r3, r3, #~AT91_DDRSDRC_MD         
385         cmp     r3, #AT91_DDRSDRC_MD_LOW_POWER    
386         ldreq   r3, [r2, #AT91_DDRSDRC_MDR]       
387         biceq   r3, r3, #AT91_DDRSDRC_MD          
388         orreq   r3, r3, #AT91_DDRSDRC_MD_DDR2     
389         streq   r3, [r2, #AT91_DDRSDRC_MDR]       
390                                                   
391         /* Active DDRC self-refresh mode */       
392         ldr     r3, [r2, #AT91_DDRSDRC_LPR]       
393         str     r3, .saved_sam9_lpr1              
394         bic     r3, r3, #AT91_DDRSDRC_LPCB        
395         orr     r3, r3, #AT91_DDRSDRC_LPCB_SEL    
396         str     r3, [r2, #AT91_DDRSDRC_LPR]       
397                                                   
398 sr_ena_no_2nd_ddrc:                               
399         b       sr_ena_exit                       
400                                                   
401         /*                                        
402          * SDRAMC Memory controller               
403          */                                       
404 sr_ena_sdramc_sf:                                 
405         /* Active SDRAMC self-refresh mode */     
406         ldr     r3, [r2, #AT91_SDRAMC_LPR]        
407         str     r3, .saved_sam9_lpr               
408         bic     r3, r3, #AT91_SDRAMC_LPCB         
409         orr     r3, r3, #AT91_SDRAMC_LPCB_SELF    
410         str     r3, [r2, #AT91_SDRAMC_LPR]        
411                                                   
412         ldr     r3, .saved_sam9_lpr               
413         str     r3, [r2, #AT91_SDRAMC_LPR]        
414                                                   
415 sr_ena_exit:                                      
416 .endm                                             
417                                                   
418 /**                                               
419  * Disable self-refresh                           
420  *                                                
421  * register usage:                                
422  *      @r1: memory type                          
423  *      @r2: base address of the sram controll    
424  *      @r3: temporary                            
425  */                                               
426 .macro at91_sramc_self_refresh_dis                
427         ldr     r1, .memtype                      
428         ldr     r2, .sramc_base                   
429                                                   
430         cmp     r1, #AT91_MEMCTRL_MC              
431         bne     sr_dis_ddrc_exit_sf               
432                                                   
433         /*                                        
434          * at91rm9200 Memory controller           
435          */                                       
436                                                   
437          /*                                       
438           * For exiting the self-refresh mode,    
439           * automatically exit the self-refres    
440           */                                      
441         b       sr_dis_exit                       
442                                                   
443 sr_dis_ddrc_exit_sf:                              
444         cmp     r1, #AT91_MEMCTRL_DDRSDR          
445         bne     sdramc_exit_sf                    
446                                                   
447         /* DDR Memory controller */               
448                                                   
449         /* Restore MDR in case of LPDDR1 */       
450         ldr     r3, .saved_sam9_mdr               
451         str     r3, [r2, #AT91_DDRSDRC_MDR]       
452         /* Restore LPR on AT91 with DDRAM */      
453         ldr     r3, .saved_sam9_lpr               
454         str     r3, [r2, #AT91_DDRSDRC_LPR]       
455                                                   
456         /* If using the 2nd ddr controller */     
457         ldr     r2, .sramc1_base                  
458         cmp     r2, #0                            
459         ldrne   r3, .saved_sam9_mdr1              
460         strne   r3, [r2, #AT91_DDRSDRC_MDR]       
461         ldrne   r3, .saved_sam9_lpr1              
462         strne   r3, [r2, #AT91_DDRSDRC_LPR]       
463                                                   
464         b       sr_dis_exit                       
465                                                   
466 sdramc_exit_sf:                                   
467         /* SDRAMC Memory controller */            
468         ldr     r3, .saved_sam9_lpr               
469         str     r3, [r2, #AT91_SDRAMC_LPR]        
470                                                   
471 sr_dis_exit:                                      
472 .endm                                             
473 #endif                                            
474                                                   
475 .macro at91_pm_ulp0_mode                          
476         ldr     pmc, .pmc_base                    
477         ldr     tmp2, .pm_mode                    
478         ldr     tmp3, .mckr_offset                
479                                                   
480         /* Check if ULP0 fast variant has been    
481         cmp     tmp2, #AT91_PM_ULP0_FAST          
482         bne     0f                                
483                                                   
484         /* Set highest prescaler for power sav    
485         ldr     tmp1, [pmc, tmp3]                 
486         bic     tmp1, tmp1, #AT91_PMC_PRES        
487         orr     tmp1, tmp1, #AT91_PMC_PRES_64     
488         str     tmp1, [pmc, tmp3]                 
489                                                   
490         mov     tmp3, #0                          
491         wait_mckrdy tmp3                          
492         b       1f                                
493                                                   
494 0:                                                
495         /* Turn off the crystal oscillator */     
496         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
497         bic     tmp1, tmp1, #AT91_PMC_MOSCEN      
498         orr     tmp1, tmp1, #AT91_PMC_KEY         
499         str     tmp1, [pmc, #AT91_CKGR_MOR]       
500                                                   
501         /* Save RC oscillator state */            
502         ldr     tmp1, [pmc, #AT91_PMC_SR]         
503         str     tmp1, .saved_osc_status           
504         tst     tmp1, #AT91_PMC_MOSCRCS           
505         bne     1f                                
506                                                   
507         /* Turn off RC oscillator */              
508         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
509         bic     tmp1, tmp1, #AT91_PMC_MOSCRCEN    
510         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
511         orr     tmp1, tmp1, #AT91_PMC_KEY         
512         str     tmp1, [pmc, #AT91_CKGR_MOR]       
513                                                   
514         /* Wait main RC disabled done */          
515 2:      ldr     tmp1, [pmc, #AT91_PMC_SR]         
516         tst     tmp1, #AT91_PMC_MOSCRCS           
517         bne     2b                                
518                                                   
519         /* Wait for interrupt */                  
520 1:      at91_cpu_idle                             
521                                                   
522         /* Check if ULP0 fast variant has been    
523         cmp     tmp2, #AT91_PM_ULP0_FAST          
524         bne     5f                                
525                                                   
526         /* Set lowest prescaler for fast resum    
527         ldr     tmp3, .mckr_offset                
528         ldr     tmp1, [pmc, tmp3]                 
529         bic     tmp1, tmp1, #AT91_PMC_PRES        
530         str     tmp1, [pmc, tmp3]                 
531                                                   
532         mov     tmp3, #0                          
533         wait_mckrdy tmp3                          
534         b       6f                                
535                                                   
536 5:      /* Restore RC oscillator state */         
537         ldr     tmp1, .saved_osc_status           
538         tst     tmp1, #AT91_PMC_MOSCRCS           
539         beq     4f                                
540                                                   
541         /* Turn on RC oscillator */               
542         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
543         orr     tmp1, tmp1, #AT91_PMC_MOSCRCEN    
544         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
545         orr     tmp1, tmp1, #AT91_PMC_KEY         
546         str     tmp1, [pmc, #AT91_CKGR_MOR]       
547                                                   
548         /* Wait main RC stabilization */          
549 3:      ldr     tmp1, [pmc, #AT91_PMC_SR]         
550         tst     tmp1, #AT91_PMC_MOSCRCS           
551         beq     3b                                
552                                                   
553         /* Turn on the crystal oscillator */      
554 4:      ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
555         orr     tmp1, tmp1, #AT91_PMC_MOSCEN      
556         orr     tmp1, tmp1, #AT91_PMC_KEY         
557         str     tmp1, [pmc, #AT91_CKGR_MOR]       
558                                                   
559         wait_moscrdy                              
560 6:                                                
561 .endm                                             
562                                                   
563 /**                                               
564  * Note: This procedure only applies on the pl    
565  * the external crystal oscillator as a main c    
566  */                                               
567 .macro at91_pm_ulp1_mode                          
568         ldr     pmc, .pmc_base                    
569         ldr     tmp2, .mckr_offset                
570         mov     tmp3, #0                          
571                                                   
572         /* Save RC oscillator state and check     
573         ldr     tmp1, [pmc, #AT91_PMC_SR]         
574         str     tmp1, .saved_osc_status           
575         tst     tmp1, #AT91_PMC_MOSCRCS           
576         bne     2f                                
577                                                   
578         /* Enable RC oscillator */                
579         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
580         orr     tmp1, tmp1, #AT91_PMC_MOSCRCEN    
581         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
582         orr     tmp1, tmp1, #AT91_PMC_KEY         
583         str     tmp1, [pmc, #AT91_CKGR_MOR]       
584                                                   
585         /* Wait main RC stabilization */          
586 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]         
587         tst     tmp1, #AT91_PMC_MOSCRCS           
588         beq     1b                                
589                                                   
590         /* Switch the main clock source to 12-    
591 2:      ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
592         bic     tmp1, tmp1, #AT91_PMC_MOSCSEL     
593         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
594         orr     tmp1, tmp1, #AT91_PMC_KEY         
595         str     tmp1, [pmc, #AT91_CKGR_MOR]       
596                                                   
597         wait_moscsels                             
598                                                   
599         /* Disable the crystal oscillator */      
600         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
601         bic     tmp1, tmp1, #AT91_PMC_MOSCEN      
602         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
603         orr     tmp1, tmp1, #AT91_PMC_KEY         
604         str     tmp1, [pmc, #AT91_CKGR_MOR]       
605                                                   
606         /* Switch the master clock source to m    
607         ldr     tmp1, [pmc, tmp2]                 
608         bic     tmp1, tmp1, #AT91_PMC_CSS         
609         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN    
610         str     tmp1, [pmc, tmp2]                 
611                                                   
612         wait_mckrdy tmp3                          
613                                                   
614         /* Enter the ULP1 mode by set WAITMODE    
615         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
616         orr     tmp1, tmp1, #AT91_PMC_WAITMODE    
617         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
618         orr     tmp1, tmp1, #AT91_PMC_KEY         
619         str     tmp1, [pmc, #AT91_CKGR_MOR]       
620                                                   
621         /* Quirk for SAM9X60's PMC */             
622         nop                                       
623         nop                                       
624                                                   
625         wait_mckrdy tmp3                          
626                                                   
627         /* Enable the crystal oscillator */       
628         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
629         orr     tmp1, tmp1, #AT91_PMC_MOSCEN      
630         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
631         orr     tmp1, tmp1, #AT91_PMC_KEY         
632         str     tmp1, [pmc, #AT91_CKGR_MOR]       
633                                                   
634         wait_moscrdy                              
635                                                   
636         /* Switch the master clock source to s    
637         ldr     tmp1, [pmc, tmp2]                 
638         bic     tmp1, tmp1, #AT91_PMC_CSS         
639         str     tmp1, [pmc, tmp2]                 
640                                                   
641         wait_mckrdy tmp3                          
642                                                   
643         /* Switch main clock source to crystal    
644         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
645         orr     tmp1, tmp1, #AT91_PMC_MOSCSEL     
646         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
647         orr     tmp1, tmp1, #AT91_PMC_KEY         
648         str     tmp1, [pmc, #AT91_CKGR_MOR]       
649                                                   
650         wait_moscsels                             
651                                                   
652         /* Switch the master clock source to m    
653         ldr     tmp1, [pmc, tmp2]                 
654         bic     tmp1, tmp1, #AT91_PMC_CSS         
655         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN    
656         str     tmp1, [pmc, tmp2]                 
657                                                   
658         wait_mckrdy tmp3                          
659                                                   
660         /* Restore RC oscillator state */         
661         ldr     tmp1, .saved_osc_status           
662         tst     tmp1, #AT91_PMC_MOSCRCS           
663         bne     3f                                
664                                                   
665         /* Disable RC oscillator */               
666         ldr     tmp1, [pmc, #AT91_CKGR_MOR]       
667         bic     tmp1, tmp1, #AT91_PMC_MOSCRCEN    
668         bic     tmp1, tmp1, #AT91_PMC_KEY_MASK    
669         orr     tmp1, tmp1, #AT91_PMC_KEY         
670         str     tmp1, [pmc, #AT91_CKGR_MOR]       
671                                                   
672         /* Wait RC oscillator disable done */     
673 4:      ldr     tmp1, [pmc, #AT91_PMC_SR]         
674         tst     tmp1, #AT91_PMC_MOSCRCS           
675         bne     4b                                
676                                                   
677 3:                                                
678 .endm                                             
679                                                   
680 .macro at91_plla_disable                          
681         /* Save PLLA setting and disable it */    
682         ldr     tmp1, .pmc_version                
683         cmp     tmp1, #AT91_PMC_V1                
684         beq     1f                                
685                                                   
686 #ifdef CONFIG_HAVE_AT91_SAM9X60_PLL               
687         /* Save PLLA settings. */                 
688         ldr     tmp2, [pmc, #AT91_PMC_PLL_UPDT    
689         bic     tmp2, tmp2, #AT91_PMC_PLL_UPDT    
690         str     tmp2, [pmc, #AT91_PMC_PLL_UPDT    
691                                                   
692         /* save div. */                           
693         mov     tmp1, #0                          
694         ldr     tmp2, [pmc, #AT91_PMC_PLL_CTRL    
695         bic     tmp2, tmp2, #0xffffff00           
696         orr     tmp1, tmp1, tmp2                  
697                                                   
698         /* save mul. */                           
699         ldr     tmp2, [pmc, #AT91_PMC_PLL_CTRL    
700         bic     tmp2, tmp2, #0xffffff             
701         orr     tmp1, tmp1, tmp2                  
702         str     tmp1, .saved_pllar                
703                                                   
704         /* step 2. */                             
705         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
706         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
707         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
708         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
709                                                   
710         /* step 3. */                             
711         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
712         bic     tmp1, tmp1, #AT91_PMC_PLL_CTRL    
713         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL    
714         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
715                                                   
716         /* step 4. */                             
717         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
718         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
719         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
720         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
721                                                   
722         /* step 5. */                             
723         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
724         bic     tmp1, tmp1, #AT91_PMC_PLL_CTRL    
725         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
726                                                   
727         /* step 7. */                             
728         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
729         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
730         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
731         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
732                                                   
733         b       2f                                
734 #endif                                            
735                                                   
736 1:      /* Save PLLA setting and disable it */    
737         ldr     tmp1, [pmc, #AT91_CKGR_PLLAR]     
738         str     tmp1, .saved_pllar                
739                                                   
740         /* Disable PLLA. */                       
741         mov     tmp1, #AT91_PMC_PLLCOUNT          
742         orr     tmp1, tmp1, #(1 << 29)            
743         str     tmp1, [pmc, #AT91_CKGR_PLLAR]     
744 2:                                                
745 .endm                                             
746                                                   
747 .macro at91_plla_enable                           
748         ldr     tmp2, .saved_pllar                
749         ldr     tmp3, .pmc_version                
750         cmp     tmp3, #AT91_PMC_V1                
751         beq     4f                                
752                                                   
753 #ifdef CONFIG_HAVE_AT91_SAM9X60_PLL               
754         /* step 1. */                             
755         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
756         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
757         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
758         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
759                                                   
760         /* step 2. */                             
761         ldr     tmp1, =AT91_PMC_PLL_ACR_DEFAUL    
762         str     tmp1, [pmc, #AT91_PMC_PLL_ACR]    
763                                                   
764         /* step 3. */                             
765         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
766         mov     tmp3, tmp2                        
767         bic     tmp3, tmp3, #0xffffff             
768         orr     tmp1, tmp1, tmp3                  
769         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
770                                                   
771         /* step 8. */                             
772         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
773         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
774         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
775         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
776                                                   
777         /* step 9. */                             
778         ldr     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
779         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL    
780         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL    
781         orr     tmp1, tmp1, #AT91_PMC_PLL_CTRL    
782         bic     tmp1, tmp1, #0xff                 
783         mov     tmp3, tmp2                        
784         bic     tmp3, tmp3, #0xffffff00           
785         orr     tmp1, tmp1, tmp3                  
786         str     tmp1, [pmc, #AT91_PMC_PLL_CTRL    
787                                                   
788         /* step 10. */                            
789         ldr     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
790         orr     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
791         bic     tmp1, tmp1, #AT91_PMC_PLL_UPDT    
792         str     tmp1, [pmc, #AT91_PMC_PLL_UPDT    
793                                                   
794         /* step 11. */                            
795 3:      ldr     tmp1, [pmc, #AT91_PMC_PLL_ISR0    
796         tst     tmp1, #0x1                        
797         beq     3b                                
798         b       2f                                
799 #endif                                            
800                                                   
801         /* Restore PLLA setting */                
802 4:      str     tmp2, [pmc, #AT91_CKGR_PLLAR]     
803                                                   
804         /* Enable PLLA. */                        
805         tst     tmp2, #(AT91_PMC_MUL &  0xff00    
806         bne     1f                                
807         tst     tmp2, #(AT91_PMC_MUL & ~0xff00    
808         beq     2f                                
809                                                   
810 1:      ldr     tmp1, [pmc, #AT91_PMC_SR]         
811         tst     tmp1, #AT91_PMC_LOCKA             
812         beq     1b                                
813 2:                                                
814 .endm                                             
815                                                   
816 /**                                               
817  * at91_mckx_ps_enable: save MCK1..4 settings     
818  *                                                
819  * Side effects: overwrites tmp1, tmp2            
820  */                                               
821 .macro at91_mckx_ps_enable                        
822 #ifdef CONFIG_SOC_SAMA7                           
823         ldr     pmc, .pmc_base                    
824                                                   
825         /* There are 4 MCKs we need to handle:    
826         mov     tmp1, #1                          
827 e_loop: cmp     tmp1, #5                          
828         beq     e_done                            
829                                                   
830         /* Write MCK ID to retrieve the settin    
831         str     tmp1, [pmc, #AT91_PMC_MCR_V2]     
832         ldr     tmp2, [pmc, #AT91_PMC_MCR_V2]     
833                                                   
834 e_save_mck1:                                      
835         cmp     tmp1, #1                          
836         bne     e_save_mck2                       
837         str     tmp2, .saved_mck1                 
838         b       e_ps                              
839                                                   
840 e_save_mck2:                                      
841         cmp     tmp1, #2                          
842         bne     e_save_mck3                       
843         str     tmp2, .saved_mck2                 
844         b       e_ps                              
845                                                   
846 e_save_mck3:                                      
847         cmp     tmp1, #3                          
848         bne     e_save_mck4                       
849         str     tmp2, .saved_mck3                 
850         b       e_ps                              
851                                                   
852 e_save_mck4:                                      
853         str     tmp2, .saved_mck4                 
854                                                   
855 e_ps:                                             
856         /* Use CSS=MAINCK and DIV=1. */           
857         bic     tmp2, tmp2, #AT91_PMC_MCR_V2_C    
858         bic     tmp2, tmp2, #AT91_PMC_MCR_V2_D    
859         orr     tmp2, tmp2, #AT91_PMC_MCR_V2_C    
860         orr     tmp2, tmp2, #AT91_PMC_MCR_V2_D    
861         str     tmp2, [pmc, #AT91_PMC_MCR_V2]     
862                                                   
863         wait_mckrdy tmp1                          
864                                                   
865         add     tmp1, tmp1, #1                    
866         b       e_loop                            
867                                                   
868 e_done:                                           
869 #endif                                            
870 .endm                                             
871                                                   
872 /**                                               
873  * at91_mckx_ps_restore: restore MCK1..4 setti    
874  *                                                
875  * Side effects: overwrites tmp1, tmp2            
876  */                                               
877 .macro at91_mckx_ps_restore                       
878 #ifdef CONFIG_SOC_SAMA7                           
879         ldr     pmc, .pmc_base                    
880                                                   
881         /* There are 4 MCKs we need to handle:    
882         mov     tmp1, #1                          
883 r_loop: cmp     tmp1, #5                          
884         beq     r_done                            
885                                                   
886 r_save_mck1:                                      
887         cmp     tmp1, #1                          
888         bne     r_save_mck2                       
889         ldr     tmp2, .saved_mck1                 
890         b       r_ps                              
891                                                   
892 r_save_mck2:                                      
893         cmp     tmp1, #2                          
894         bne     r_save_mck3                       
895         ldr     tmp2, .saved_mck2                 
896         b       r_ps                              
897                                                   
898 r_save_mck3:                                      
899         cmp     tmp1, #3                          
900         bne     r_save_mck4                       
901         ldr     tmp2, .saved_mck3                 
902         b       r_ps                              
903                                                   
904 r_save_mck4:                                      
905         ldr     tmp2, .saved_mck4                 
906                                                   
907 r_ps:                                             
908         /* Write MCK ID to retrieve the settin    
909         str     tmp1, [pmc, #AT91_PMC_MCR_V2]     
910         ldr     tmp3, [pmc, #AT91_PMC_MCR_V2]     
911                                                   
912         /* We need to restore CSS and DIV. */     
913         bic     tmp3, tmp3, #AT91_PMC_MCR_V2_C    
914         bic     tmp3, tmp3, #AT91_PMC_MCR_V2_D    
915         orr     tmp3, tmp3, tmp2                  
916         bic     tmp3, tmp3, #AT91_PMC_MCR_V2_I    
917         orr     tmp3, tmp3, tmp1                  
918         orr     tmp3, tmp3, #AT91_PMC_MCR_V2_C    
919         str     tmp2, [pmc, #AT91_PMC_MCR_V2]     
920                                                   
921         wait_mckrdy tmp1                          
922                                                   
923         add     tmp1, tmp1, #1                    
924         b       r_loop                            
925 r_done:                                           
926 #endif                                            
927 .endm                                             
928                                                   
929 .macro at91_ulp_mode                              
930         at91_mckx_ps_enable                       
931                                                   
932         ldr     pmc, .pmc_base                    
933         ldr     tmp2, .mckr_offset                
934         ldr     tmp3, .pm_mode                    
935                                                   
936         /* Save Master clock setting */           
937         ldr     tmp1, [pmc, tmp2]                 
938         str     tmp1, .saved_mckr                 
939                                                   
940         /*                                        
941          * Set master clock source to:            
942          * - MAINCK if using ULP0 fast variant    
943          * - slow clock, otherwise                
944          */                                       
945         bic     tmp1, tmp1, #AT91_PMC_CSS         
946         cmp     tmp3, #AT91_PM_ULP0_FAST          
947         bne     save_mck                          
948         orr     tmp1, tmp1, #AT91_PMC_CSS_MAIN    
949 save_mck:                                         
950         str     tmp1, [pmc, tmp2]                 
951                                                   
952         mov     tmp3, #0                          
953         wait_mckrdy tmp3                          
954                                                   
955         at91_plla_disable                         
956                                                   
957         /* Enable low power mode for 2.5V regu    
958         at91_2_5V_reg_set_low_power 1             
959                                                   
960         ldr     tmp3, .pm_mode                    
961         cmp     tmp3, #AT91_PM_ULP1               
962         beq     ulp1_mode                         
963                                                   
964         at91_pm_ulp0_mode                         
965         b       ulp_exit                          
966                                                   
967 ulp1_mode:                                        
968         at91_pm_ulp1_mode                         
969         b       ulp_exit                          
970                                                   
971 ulp_exit:                                         
972         /* Disable low power mode for 2.5V reg    
973         at91_2_5V_reg_set_low_power 0             
974                                                   
975         ldr     pmc, .pmc_base                    
976                                                   
977         at91_plla_enable                          
978                                                   
979         /*                                        
980          * Restore master clock setting           
981          */                                       
982         ldr     tmp1, .mckr_offset                
983         ldr     tmp2, .saved_mckr                 
984         str     tmp2, [pmc, tmp1]                 
985                                                   
986         mov     tmp3, #0                          
987         wait_mckrdy tmp3                          
988                                                   
989         at91_mckx_ps_restore                      
990 .endm                                             
991                                                   
992 .macro at91_backup_mode                           
993         /* Switch the master clock source to s    
994         ldr     pmc, .pmc_base                    
995         ldr     tmp2, .mckr_offset                
996         ldr     tmp1, [pmc, tmp2]                 
997         bic     tmp1, tmp1, #AT91_PMC_CSS         
998         str     tmp1, [pmc, tmp2]                 
999                                                   
1000         mov     tmp3, #0                         
1001         wait_mckrdy tmp3                         
1002                                                  
1003         /*BUMEN*/                                
1004         ldr     r0, .sfrbu                       
1005         mov     tmp1, #0x1                       
1006         str     tmp1, [r0, #0x10]                
1007                                                  
1008         /* Wait for it. */                       
1009 1:      ldr     tmp1, [r0, #0x10]                
1010         tst     tmp1, #0x1                       
1011         beq     1b                               
1012                                                  
1013         /* Shutdown */                           
1014         ldr     r0, .shdwc                       
1015         mov     tmp1, #0xA5000000                
1016         add     tmp1, tmp1, #0x1                 
1017         at91_backup_set_lpm tmp1                 
1018         str     tmp1, [r0, #0]                   
1019 .endm                                            
1020                                                  
1021 /*                                               
1022  * void at91_suspend_sram_fn(struct at91_pm_d    
1023  * @input param:                                 
1024  *      @r0: base address of struct at91_pm_d    
1025  */                                              
1026 /* at91_pm_suspend_in_sram must be 8-byte ali    
1027         .align 3                                 
1028 ENTRY(at91_pm_suspend_in_sram)                   
1029         /* Save registers on stack */            
1030         stmfd   sp!, {r4 - r12, lr}              
1031                                                  
1032         /* Drain write buffer */                 
1033         mov     tmp1, #0                         
1034         mcr     p15, 0, tmp1, c7, c10, 4         
1035                                                  
1036         /* Flush tlb. */                         
1037         mov     r4, #0                           
1038         mcr     p15, 0, r4, c8, c7, 0            
1039                                                  
1040         ldr     tmp1, [r0, #PM_DATA_PMC_MCKR_    
1041         str     tmp1, .mckr_offset               
1042         ldr     tmp1, [r0, #PM_DATA_PMC_VERSI    
1043         str     tmp1, .pmc_version               
1044         ldr     tmp1, [r0, #PM_DATA_MEMCTRL]     
1045         str     tmp1, .memtype                   
1046         ldr     tmp1, [r0, #PM_DATA_MODE]        
1047         str     tmp1, .pm_mode                   
1048                                                  
1049         /*                                       
1050          * ldrne below are here to preload th    
1051          * to RAM may be limited while in sel    
1052          */                                      
1053         ldr     tmp1, [r0, #PM_DATA_PMC]         
1054         str     tmp1, .pmc_base                  
1055         cmp     tmp1, #0                         
1056         ldrne   tmp2, [tmp1, #0]                 
1057                                                  
1058         ldr     tmp1, [r0, #PM_DATA_RAMC0]       
1059         str     tmp1, .sramc_base                
1060         cmp     tmp1, #0                         
1061         ldrne   tmp2, [tmp1, #0]                 
1062                                                  
1063         ldr     tmp1, [r0, #PM_DATA_RAMC1]       
1064         str     tmp1, .sramc1_base               
1065         cmp     tmp1, #0                         
1066         ldrne   tmp2, [tmp1, #0]                 
1067                                                  
1068 #ifndef CONFIG_SOC_SAM_V4_V5                     
1069         /* ldrne below are here to preload th    
1070         ldr     tmp1, [r0, #PM_DATA_RAMC_PHY]    
1071         str     tmp1, .sramc_phy_base            
1072         cmp     tmp1, #0                         
1073         ldrne   tmp2, [tmp1, #0]                 
1074                                                  
1075         ldr     tmp1, [r0, #PM_DATA_SHDWC]       
1076         str     tmp1, .shdwc                     
1077         cmp     tmp1, #0                         
1078         ldrne   tmp2, [tmp1, #0]                 
1079                                                  
1080         ldr     tmp1, [r0, #PM_DATA_SFRBU]       
1081         str     tmp1, .sfrbu                     
1082         cmp     tmp1, #0                         
1083         ldrne   tmp2, [tmp1, #0x10]              
1084 #endif                                           
1085                                                  
1086         /* Active the self-refresh mode */       
1087         at91_sramc_self_refresh_ena              
1088                                                  
1089         ldr     r0, .pm_mode                     
1090         cmp     r0, #AT91_PM_STANDBY             
1091         beq     standby                          
1092         cmp     r0, #AT91_PM_BACKUP              
1093         beq     backup_mode                      
1094                                                  
1095         at91_ulp_mode                            
1096         b       exit_suspend                     
1097                                                  
1098 standby:                                         
1099         /* Wait for interrupt */                 
1100         ldr     pmc, .pmc_base                   
1101         at91_cpu_idle                            
1102         b       exit_suspend                     
1103                                                  
1104 backup_mode:                                     
1105         at91_backup_mode                         
1106                                                  
1107 exit_suspend:                                    
1108         /* Exit the self-refresh mode */         
1109         at91_sramc_self_refresh_dis              
1110                                                  
1111         /* Restore registers, and return */      
1112         ldmfd   sp!, {r4 - r12, pc}              
1113 ENDPROC(at91_pm_suspend_in_sram)                 
1114                                                  
1115 .pmc_base:                                       
1116         .word 0                                  
1117 .sramc_base:                                     
1118         .word 0                                  
1119 .sramc1_base:                                    
1120         .word 0                                  
1121 .sramc_phy_base:                                 
1122         .word 0                                  
1123 .shdwc:                                          
1124         .word 0                                  
1125 .sfrbu:                                          
1126         .word 0                                  
1127 .memtype:                                        
1128         .word 0                                  
1129 .pm_mode:                                        
1130         .word 0                                  
1131 .mckr_offset:                                    
1132         .word 0                                  
1133 .pmc_version:                                    
1134         .word 0                                  
1135 .saved_mckr:                                     
1136         .word 0                                  
1137 .saved_pllar:                                    
1138         .word 0                                  
1139 .saved_sam9_lpr:                                 
1140         .word 0                                  
1141 .saved_sam9_lpr1:                                
1142         .word 0                                  
1143 .saved_sam9_mdr:                                 
1144         .word 0                                  
1145 .saved_sam9_mdr1:                                
1146         .word 0                                  
1147 .saved_osc_status:                               
1148         .word 0                                  
1149 #ifdef CONFIG_SOC_SAMA7                          
1150 .saved_mck1:                                     
1151         .word 0                                  
1152 .saved_mck2:                                     
1153         .word 0                                  
1154 .saved_mck3:                                     
1155         .word 0                                  
1156 .saved_mck4:                                     
1157         .word 0                                  
1158 #endif                                           
1159                                                  
1160 ENTRY(at91_pm_suspend_in_sram_sz)                
1161         .word .-at91_pm_suspend_in_sram          
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php