Blame view

arch/arm/mach-sa1100/sleep.S 2.68 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  /*
   * SA11x0 Assembler Sleep/WakeUp Management Routines
   *
   * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License.
   *
   * History:
   *
   * 2001-02-06: Cliff Brake         Initial code
   *
   * 2001-08-29:	Nicolas Pitre	Simplified.
   *
   * 2002-05-27:	Nicolas Pitre	Revisited, more cleanup and simplification.
   *				Storage is on the stack now.
   */
  
  #include <linux/linkage.h>
  #include <asm/assembler.h>
a09e64fbc   Russell King   [ARM] Move includ...
21
  #include <mach/hardware.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  		.text
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
  /*
34c79de6b   Russell King   ARM: pm: sa1100: ...
25
   * sa1100_finish_suspend()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
   *
   * Causes sa11x0 to enter sleep state
   *
   */
34c79de6b   Russell King   ARM: pm: sa1100: ...
30
  ENTRY(sa1100_finish_suspend)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  	@ disable clock switching
  	mcr	p15, 0, r1, c15, c2, 2
  
          @ Adjust memory timing before lowering CPU clock
  	@ Clock speed adjustment without changing memory timing makes
  	@ CPU hang in some cases
          ldr     r0, =MDREFR
          ldr     r1, [r0]
          orr     r1, r1, #MDREFR_K1DB2
          str     r1, [r0]
  
  	@ delay 90us and set CPU PLL to lowest speed
  	@ fixes resume problem on high speed SA1110
  	mov	r0, #90
  	bl	__udelay
  	ldr	r0, =PPCR
  	mov	r1, #0
  	str	r1, [r0]
  	mov	r0, #90
  	bl	__udelay
  
  	/*
  	 * SA1110 SDRAM controller workaround.  register values:
  	 *
  	 * r0  = &MSC0
  	 * r1  = &MSC1
  	 * r2  = &MSC2
  	 * r3  = MSC0 value
  	 * r4  = MSC1 value
  	 * r5  = MSC2 value
  	 * r6  = &MDREFR
  	 * r7  = first MDREFR value
  	 * r8  = second MDREFR value
  	 * r9  = &MDCNFG
  	 * r10 = MDCNFG value
  	 * r11 = third MDREFR value
  	 * r12 = &PMCR
  	 * r13 = PMCR value (1)
  	 */
  
  	ldr	r0, =MSC0
  	ldr	r1, =MSC1
  	ldr	r2, =MSC2
93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
74
75
76
  	ldr	r3, [r0]
  	bic	r3, r3, #FMsk(MSC_RT)
  	bic	r3, r3, #FMsk(MSC_RT)<<16
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
78
79
80
  	ldr	r4, [r1]
  	bic	r4, r4, #FMsk(MSC_RT)
  	bic	r4, r4, #FMsk(MSC_RT)<<16
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
82
83
84
  	ldr	r5, [r2]
  	bic	r5, r5, #FMsk(MSC_RT)
  	bic	r5, r5, #FMsk(MSC_RT)<<16
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
86
  	ldr	r6, =MDREFR
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
88
89
90
91
  	ldr	r7, [r6]
  bic	r7, r7, #0x0000FF00
  bic	r7, r7, #0x000000F0
  orr	r8, r7, #MDREFR_SLFRSH
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
93
94
95
96
  	ldr	r9, =MDCNFG
  	ldr	r10, [r9]
  	bic	r10, r10, #(MDCNFG_DE0+MDCNFG_DE1)
  	bic	r10, r10, #(MDCNFG_DE2+MDCNFG_DE3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
98
99
  	bic	r11, r8, #MDREFR_SLFRSH
  	bic	r11, r11, #MDREFR_E1PIN
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
101
  	ldr	r12, =PMCR
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102

93982535a   Kristoffer Ericson   [ARM] 5336/1: For...
103
  	mov	r13, #PMCR_SF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  
  	b	sa1110_sdram_controller_fix
  
  	.align 5
  sa1110_sdram_controller_fix:
  
  	@ Step 1 clear RT field of all MSCx registers
  	str 	r3, [r0]
  	str	r4, [r1]
  	str	r5, [r2]
  
  	@ Step 2 clear DRI field in MDREFR
  	str	r7, [r6]
  
  	@ Step 3 set SLFRSH bit in MDREFR
  	str	r8, [r6]
  
  	@ Step 4 clear DE bis in MDCNFG
  	str	r10, [r9]
  
  	@ Step 5 clear DRAM refresh control register
  	str	r11, [r6]
  
  	@ Wow, now the hardware suspend request pins can be used, that makes them functional for
  	@ about 7 ns out of the	entire time that the CPU is running!
  
  	@ Step 6 set force sleep bit in PMCR
  
  	str	r13, [r12]
  
  20:	b	20b			@ loop waiting for sleep