diff options
Diffstat (limited to 'arch/blackfin/mach-common/dpmc.S')
-rw-r--r-- | arch/blackfin/mach-common/dpmc.S | 74 |
1 files changed, 51 insertions, 23 deletions
diff --git a/arch/blackfin/mach-common/dpmc.S b/arch/blackfin/mach-common/dpmc.S index 39fbc2861107..b82c096e1980 100644 --- a/arch/blackfin/mach-common/dpmc.S +++ b/arch/blackfin/mach-common/dpmc.S | |||
@@ -38,6 +38,9 @@ ENTRY(_unmask_wdog_wakeup_evt) | |||
38 | #if defined(CONFIG_BF561) | 38 | #if defined(CONFIG_BF561) |
39 | P0.H = hi(SICA_IWR1); | 39 | P0.H = hi(SICA_IWR1); |
40 | P0.L = lo(SICA_IWR1); | 40 | P0.L = lo(SICA_IWR1); |
41 | #elif defined(CONFIG_BF54x) || defined(CONFIG_BF52x) | ||
42 | P0.h = HI(SIC_IWR0); | ||
43 | P0.l = LO(SIC_IWR0); | ||
41 | #else | 44 | #else |
42 | P0.h = HI(SIC_IWR); | 45 | P0.h = HI(SIC_IWR); |
43 | P0.l = LO(SIC_IWR); | 46 | P0.l = LO(SIC_IWR); |
@@ -172,7 +175,7 @@ ENTRY(_sleep_mode) | |||
172 | call _set_sic_iwr; | 175 | call _set_sic_iwr; |
173 | 176 | ||
174 | R0 = 0xFFFF (Z); | 177 | R0 = 0xFFFF (Z); |
175 | call _set_rtc_istat | 178 | call _set_rtc_istat; |
176 | 179 | ||
177 | P0.H = hi(PLL_CTL); | 180 | P0.H = hi(PLL_CTL); |
178 | P0.L = lo(PLL_CTL); | 181 | P0.L = lo(PLL_CTL); |
@@ -210,7 +213,7 @@ ENTRY(_hibernate_mode) | |||
210 | call _set_sic_iwr; | 213 | call _set_sic_iwr; |
211 | 214 | ||
212 | R0 = 0xFFFF (Z); | 215 | R0 = 0xFFFF (Z); |
213 | call _set_rtc_istat | 216 | call _set_rtc_istat; |
214 | 217 | ||
215 | P0.H = hi(VR_CTL); | 218 | P0.H = hi(VR_CTL); |
216 | P0.L = lo(VR_CTL); | 219 | P0.L = lo(VR_CTL); |
@@ -236,7 +239,7 @@ ENTRY(_deep_sleep) | |||
236 | 239 | ||
237 | call _set_sic_iwr; | 240 | call _set_sic_iwr; |
238 | 241 | ||
239 | call _set_sdram_srfs; | 242 | call _set_dram_srfs; |
240 | 243 | ||
241 | /* Clear all the interrupts,bits sticky */ | 244 | /* Clear all the interrupts,bits sticky */ |
242 | R0 = 0xFFFF (Z); | 245 | R0 = 0xFFFF (Z); |
@@ -253,7 +256,7 @@ ENTRY(_deep_sleep) | |||
253 | SSYNC; | 256 | SSYNC; |
254 | IDLE; | 257 | IDLE; |
255 | 258 | ||
256 | call _unset_sdram_srfs; | 259 | call _unset_dram_srfs; |
257 | 260 | ||
258 | call _test_pll_locked; | 261 | call _test_pll_locked; |
259 | 262 | ||
@@ -285,23 +288,22 @@ ENTRY(_sleep_deeper) | |||
285 | P3 = R0; | 288 | P3 = R0; |
286 | R0 = IWR_ENABLE(0); | 289 | R0 = IWR_ENABLE(0); |
287 | call _set_sic_iwr; | 290 | call _set_sic_iwr; |
288 | call _set_sdram_srfs; | 291 | call _set_dram_srfs; /* Set SDRAM Self Refresh */ |
289 | 292 | ||
290 | /* Clear all the interrupts,bits sticky */ | 293 | /* Clear all the interrupts,bits sticky */ |
291 | R0 = 0xFFFF (Z); | 294 | R0 = 0xFFFF (Z); |
292 | call _set_rtc_istat | 295 | call _set_rtc_istat; |
293 | |||
294 | P0.H = hi(PLL_DIV); | 296 | P0.H = hi(PLL_DIV); |
295 | P0.L = lo(PLL_DIV); | 297 | P0.L = lo(PLL_DIV); |
296 | R6 = W[P0](z); | 298 | R6 = W[P0](z); |
297 | R0.L = 0xF; | 299 | R0.L = 0xF; |
298 | W[P0] = R0.l; | 300 | W[P0] = R0.l; /* Set Max VCO to SCLK divider */ |
299 | 301 | ||
300 | P0.H = hi(PLL_CTL); | 302 | P0.H = hi(PLL_CTL); |
301 | P0.L = lo(PLL_CTL); | 303 | P0.L = lo(PLL_CTL); |
302 | R5 = W[P0](z); | 304 | R5 = W[P0](z); |
303 | R0.L = (CONFIG_MIN_VCO_HZ/CONFIG_CLKIN_HZ) << 9; | 305 | R0.L = (CONFIG_MIN_VCO_HZ/CONFIG_CLKIN_HZ) << 9; |
304 | W[P0] = R0.l; | 306 | W[P0] = R0.l; /* Set Min CLKIN to VCO multiplier */ |
305 | 307 | ||
306 | SSYNC; | 308 | SSYNC; |
307 | IDLE; | 309 | IDLE; |
@@ -317,29 +319,28 @@ ENTRY(_sleep_deeper) | |||
317 | R1 = R1|R2; | 319 | R1 = R1|R2; |
318 | 320 | ||
319 | R2 = DEPOSIT(R7, R1); | 321 | R2 = DEPOSIT(R7, R1); |
320 | W[P0] = R2; | 322 | W[P0] = R2; /* Set Min Core Voltage */ |
321 | 323 | ||
322 | SSYNC; | 324 | SSYNC; |
323 | IDLE; | 325 | IDLE; |
324 | 326 | ||
325 | call _test_pll_locked; | 327 | call _test_pll_locked; |
326 | 328 | ||
329 | R0 = P3; | ||
330 | call _set_sic_iwr; /* Set Awake from IDLE */ | ||
331 | |||
327 | P0.H = hi(PLL_CTL); | 332 | P0.H = hi(PLL_CTL); |
328 | P0.L = lo(PLL_CTL); | 333 | P0.L = lo(PLL_CTL); |
329 | R0 = W[P0](z); | 334 | R0 = W[P0](z); |
330 | BITSET (R0, 3); | 335 | BITSET (R0, 3); |
331 | W[P0] = R0.L; | 336 | W[P0] = R0.L; /* Turn CCLK OFF */ |
332 | |||
333 | R0 = P3; | ||
334 | call _set_sic_iwr; | ||
335 | |||
336 | SSYNC; | 337 | SSYNC; |
337 | IDLE; | 338 | IDLE; |
338 | 339 | ||
339 | call _test_pll_locked; | 340 | call _test_pll_locked; |
340 | 341 | ||
341 | R0 = IWR_ENABLE(0); | 342 | R0 = IWR_ENABLE(0); |
342 | call _set_sic_iwr; | 343 | call _set_sic_iwr; /* Set Awake from IDLE PLL */ |
343 | 344 | ||
344 | P0.H = hi(VR_CTL); | 345 | P0.H = hi(VR_CTL); |
345 | P0.L = lo(VR_CTL); | 346 | P0.L = lo(VR_CTL); |
@@ -352,15 +353,15 @@ ENTRY(_sleep_deeper) | |||
352 | 353 | ||
353 | P0.H = hi(PLL_DIV); | 354 | P0.H = hi(PLL_DIV); |
354 | P0.L = lo(PLL_DIV); | 355 | P0.L = lo(PLL_DIV); |
355 | W[P0]= R6; | 356 | W[P0]= R6; /* Restore CCLK and SCLK divider */ |
356 | 357 | ||
357 | P0.H = hi(PLL_CTL); | 358 | P0.H = hi(PLL_CTL); |
358 | P0.L = lo(PLL_CTL); | 359 | P0.L = lo(PLL_CTL); |
359 | w[p0] = R5; | 360 | w[p0] = R5; /* Restore VCO multiplier */ |
360 | IDLE; | 361 | IDLE; |
361 | call _test_pll_locked; | 362 | call _test_pll_locked; |
362 | 363 | ||
363 | call _unset_sdram_srfs; | 364 | call _unset_dram_srfs; /* SDRAM Self Refresh Off */ |
364 | 365 | ||
365 | STI R4; | 366 | STI R4; |
366 | 367 | ||
@@ -368,25 +369,47 @@ ENTRY(_sleep_deeper) | |||
368 | ( R7:0, P5:0 ) = [SP++]; | 369 | ( R7:0, P5:0 ) = [SP++]; |
369 | RTS; | 370 | RTS; |
370 | 371 | ||
371 | ENTRY(_set_sdram_srfs) | 372 | ENTRY(_set_dram_srfs) |
372 | /* set the sdram to self refresh mode */ | 373 | /* set the dram to self refresh mode */ |
374 | #if defined(CONFIG_BF54x) | ||
375 | P0.H = hi(EBIU_RSTCTL); | ||
376 | P0.L = lo(EBIU_RSTCTL); | ||
377 | R2 = [P0]; | ||
378 | R3.H = hi(SRREQ); | ||
379 | R3.L = lo(SRREQ); | ||
380 | #else | ||
373 | P0.H = hi(EBIU_SDGCTL); | 381 | P0.H = hi(EBIU_SDGCTL); |
374 | P0.L = lo(EBIU_SDGCTL); | 382 | P0.L = lo(EBIU_SDGCTL); |
375 | R2 = [P0]; | 383 | R2 = [P0]; |
376 | R3.H = hi(SRFS); | 384 | R3.H = hi(SRFS); |
377 | R3.L = lo(SRFS); | 385 | R3.L = lo(SRFS); |
386 | #endif | ||
378 | R2 = R2|R3; | 387 | R2 = R2|R3; |
379 | [P0] = R2; | 388 | [P0] = R2; |
380 | ssync; | 389 | ssync; |
390 | #if defined(CONFIG_BF54x) | ||
391 | .LSRR_MODE: | ||
392 | R2 = [P0]; | ||
393 | CC = BITTST(R2, 4); | ||
394 | if !CC JUMP .LSRR_MODE; | ||
395 | #endif | ||
381 | RTS; | 396 | RTS; |
382 | 397 | ||
383 | ENTRY(_unset_sdram_srfs) | 398 | ENTRY(_unset_dram_srfs) |
384 | /* set the sdram out of self refresh mode */ | 399 | /* set the dram out of self refresh mode */ |
400 | #if defined(CONFIG_BF54x) | ||
401 | P0.H = hi(EBIU_RSTCTL); | ||
402 | P0.L = lo(EBIU_RSTCTL); | ||
403 | R2 = [P0]; | ||
404 | R3.H = hi(SRREQ); | ||
405 | R3.L = lo(SRREQ); | ||
406 | #else | ||
385 | P0.H = hi(EBIU_SDGCTL); | 407 | P0.H = hi(EBIU_SDGCTL); |
386 | P0.L = lo(EBIU_SDGCTL); | 408 | P0.L = lo(EBIU_SDGCTL); |
387 | R2 = [P0]; | 409 | R2 = [P0]; |
388 | R3.H = hi(SRFS); | 410 | R3.H = hi(SRFS); |
389 | R3.L = lo(SRFS); | 411 | R3.L = lo(SRFS); |
412 | #endif | ||
390 | R3 = ~R3; | 413 | R3 = ~R3; |
391 | R2 = R2&R3; | 414 | R2 = R2&R3; |
392 | [P0] = R2; | 415 | [P0] = R2; |
@@ -394,8 +417,13 @@ ENTRY(_unset_sdram_srfs) | |||
394 | RTS; | 417 | RTS; |
395 | 418 | ||
396 | ENTRY(_set_sic_iwr) | 419 | ENTRY(_set_sic_iwr) |
420 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) | ||
421 | P0.H = hi(SIC_IWR0); | ||
422 | P0.L = lo(SIC_IWR0); | ||
423 | #else | ||
397 | P0.H = hi(SIC_IWR); | 424 | P0.H = hi(SIC_IWR); |
398 | P0.L = lo(SIC_IWR); | 425 | P0.L = lo(SIC_IWR); |
426 | #endif | ||
399 | [P0] = R0; | 427 | [P0] = R0; |
400 | SSYNC; | 428 | SSYNC; |
401 | RTS; | 429 | RTS; |