diff options
Diffstat (limited to 'arch/arm/mach-zynq/slcr.c')
-rw-r--r-- | arch/arm/mach-zynq/slcr.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/arch/arm/mach-zynq/slcr.c b/arch/arm/mach-zynq/slcr.c index c43a2d16e223..d4cb50cf97c0 100644 --- a/arch/arm/mach-zynq/slcr.c +++ b/arch/arm/mach-zynq/slcr.c | |||
@@ -138,6 +138,8 @@ void zynq_slcr_cpu_start(int cpu) | |||
138 | zynq_slcr_write(reg, SLCR_A9_CPU_RST_CTRL_OFFSET); | 138 | zynq_slcr_write(reg, SLCR_A9_CPU_RST_CTRL_OFFSET); |
139 | reg &= ~(SLCR_A9_CPU_CLKSTOP << cpu); | 139 | reg &= ~(SLCR_A9_CPU_CLKSTOP << cpu); |
140 | zynq_slcr_write(reg, SLCR_A9_CPU_RST_CTRL_OFFSET); | 140 | zynq_slcr_write(reg, SLCR_A9_CPU_RST_CTRL_OFFSET); |
141 | |||
142 | zynq_slcr_cpu_state_write(cpu, false); | ||
141 | } | 143 | } |
142 | 144 | ||
143 | /** | 145 | /** |
@@ -154,8 +156,47 @@ void zynq_slcr_cpu_stop(int cpu) | |||
154 | } | 156 | } |
155 | 157 | ||
156 | /** | 158 | /** |
157 | * zynq_slcr_init - Regular slcr driver init | 159 | * zynq_slcr_cpu_state - Read/write cpu state |
160 | * @cpu: cpu number | ||
158 | * | 161 | * |
162 | * SLCR_REBOOT_STATUS save upper 2 bits (31/30 cpu states for cpu0 and cpu1) | ||
163 | * 0 means cpu is running, 1 cpu is going to die. | ||
164 | * | ||
165 | * Return: true if cpu is running, false if cpu is going to die | ||
166 | */ | ||
167 | bool zynq_slcr_cpu_state_read(int cpu) | ||
168 | { | ||
169 | u32 state; | ||
170 | |||
171 | state = readl(zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET); | ||
172 | state &= 1 << (31 - cpu); | ||
173 | |||
174 | return !state; | ||
175 | } | ||
176 | |||
177 | /** | ||
178 | * zynq_slcr_cpu_state - Read/write cpu state | ||
179 | * @cpu: cpu number | ||
180 | * @die: cpu state - true if cpu is going to die | ||
181 | * | ||
182 | * SLCR_REBOOT_STATUS save upper 2 bits (31/30 cpu states for cpu0 and cpu1) | ||
183 | * 0 means cpu is running, 1 cpu is going to die. | ||
184 | */ | ||
185 | void zynq_slcr_cpu_state_write(int cpu, bool die) | ||
186 | { | ||
187 | u32 state, mask; | ||
188 | |||
189 | state = readl(zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET); | ||
190 | mask = 1 << (31 - cpu); | ||
191 | if (die) | ||
192 | state |= mask; | ||
193 | else | ||
194 | state &= ~mask; | ||
195 | writel(state, zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET); | ||
196 | } | ||
197 | |||
198 | /** | ||
199 | * zynq_slcr_init - Regular slcr driver init | ||
159 | * Return: 0 on success, negative errno otherwise. | 200 | * Return: 0 on success, negative errno otherwise. |
160 | * | 201 | * |
161 | * Called early during boot from platform code to remap SLCR area. | 202 | * Called early during boot from platform code to remap SLCR area. |