2 * Copyright 2004-2008 Analog Devices Inc.
4 * Licensed under the GPL-2 or later.
7 #include <linux/linkage.h>
8 #include <asm/blackfin.h>
9 #include <asm/mach/irq.h>
15 [--SP] = ( R7:0, P5:0 );
34 call _test_pll_locked;
49 call _test_pll_locked;
52 ( R7:0, P5:0 ) = [SP++];
55 ENTRY(_hibernate_mode)
56 [--SP] = ( R7:0, P5:0 );
80 [--SP] = ( R7:0, P5:0 );
93 /* Clear all the interrupts,bits sticky */
103 call _test_pll_locked;
108 call _unset_dram_srfs;
110 call _test_pll_locked;
113 R1 = IWR_DISABLE_ALL;
114 R2 = IWR_DISABLE_ALL;
126 call _test_pll_locked;
131 ( R7:0, P5:0 ) = [SP++];
135 [--SP] = ( R7:0, P5:0 );
145 R1 = IWR_DISABLE_ALL;
146 R2 = IWR_DISABLE_ALL;
149 call _set_dram_srfs; /* Set SDRAM Self Refresh */
151 /* Clear all the interrupts,bits sticky */
158 W[P0] = R0.l; /* Set Max VCO to SCLK divider */
163 R0.L = (CONFIG_MIN_VCO_HZ/CONFIG_CLKIN_HZ) << 9;
164 W[P0] = R0.l; /* Set Min CLKIN to VCO multiplier */
169 call _test_pll_locked;
179 R2 = DEPOSIT(R7, R1);
180 W[P0] = R2; /* Set Min Core Voltage */
185 call _test_pll_locked;
190 call _set_sic_iwr; /* Set Awake from IDLE */
196 W[P0] = R0.L; /* Turn CCLK OFF */
200 call _test_pll_locked;
203 R1 = IWR_DISABLE_ALL;
204 R2 = IWR_DISABLE_ALL;
206 call _set_sic_iwr; /* Set Awake from IDLE PLL */
215 call _test_pll_locked;
219 W[P0]= R6; /* Restore CCLK and SCLK divider */
223 w[p0] = R5; /* Restore VCO multiplier */
225 call _test_pll_locked;
227 call _unset_dram_srfs; /* SDRAM Self Refresh Off */
232 ( R7:0, P5:0 ) = [SP++];
236 ENTRY(_set_dram_srfs)
237 /* set the dram to self refresh mode */
239 #if defined(EBIU_RSTCTL) /* DDR */
240 P0.H = hi(EBIU_RSTCTL);
241 P0.L = lo(EBIU_RSTCTL);
243 BITSET(R2, 3); /* SRREQ enter self-refresh mode */
251 P0.L = lo(EBIU_SDGCTL);
252 P0.H = hi(EBIU_SDGCTL);
254 BITSET(R2, 24); /* SRFS enter self-refresh mode */
258 P0.L = lo(EBIU_SDSTAT);
259 P0.H = hi(EBIU_SDSTAT);
263 cc = BITTST(R2, 1); /* SDSRA poll self-refresh status */
266 P0.L = lo(EBIU_SDGCTL);
267 P0.H = hi(EBIU_SDGCTL);
269 BITCLR(R2, 0); /* SCTLE disable CLKOUT */
275 ENTRY(_unset_dram_srfs)
276 /* set the dram out of self refresh mode */
277 #if defined(EBIU_RSTCTL) /* DDR */
278 P0.H = hi(EBIU_RSTCTL);
279 P0.L = lo(EBIU_RSTCTL);
281 BITCLR(R2, 3); /* clear SRREQ bit */
283 #elif defined(EBIU_SDGCTL) /* SDRAM */
285 P0.L = lo(EBIU_SDGCTL); /* release CLKOUT from self-refresh */
286 P0.H = hi(EBIU_SDGCTL);
288 BITSET(R2, 0); /* SCTLE enable CLKOUT */
292 P0.L = lo(EBIU_SDGCTL); /* release SDRAM from self-refresh */
293 P0.H = hi(EBIU_SDGCTL);
295 BITCLR(R2, 24); /* clear SRFS bit */
302 #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561)
308 #if defined(CONFIG_BF54x)
322 ENTRY(_set_rtc_istat)
324 P0.H = hi(RTC_ISTAT);
325 P0.L = lo(RTC_ISTAT);
328 #elif (ANOMALY_05000371)
336 ENTRY(_test_pll_locked)
349 [--SP] = ( R7:0, P5:0 );
351 /* Save System MMRs */
357 PM_SYS_PUSH(SIC_IMASK0)
360 PM_SYS_PUSH(SIC_IMASK1)
363 PM_SYS_PUSH(SIC_IMASK2)
366 PM_SYS_PUSH(SIC_IMASK)
369 PM_SYS_PUSH(SICA_IMASK0)
372 PM_SYS_PUSH(SICA_IMASK1)
375 PM_SYS_PUSH(SIC_IAR0)
376 PM_SYS_PUSH(SIC_IAR1)
377 PM_SYS_PUSH(SIC_IAR2)
380 PM_SYS_PUSH(SIC_IAR3)
383 PM_SYS_PUSH(SIC_IAR4)
384 PM_SYS_PUSH(SIC_IAR5)
385 PM_SYS_PUSH(SIC_IAR6)
388 PM_SYS_PUSH(SIC_IAR7)
391 PM_SYS_PUSH(SIC_IAR8)
392 PM_SYS_PUSH(SIC_IAR9)
393 PM_SYS_PUSH(SIC_IAR10)
394 PM_SYS_PUSH(SIC_IAR11)
398 PM_SYS_PUSH(SICA_IAR0)
399 PM_SYS_PUSH(SICA_IAR1)
400 PM_SYS_PUSH(SICA_IAR2)
401 PM_SYS_PUSH(SICA_IAR3)
402 PM_SYS_PUSH(SICA_IAR4)
403 PM_SYS_PUSH(SICA_IAR5)
404 PM_SYS_PUSH(SICA_IAR6)
405 PM_SYS_PUSH(SICA_IAR7)
412 PM_SYS_PUSH(SIC_IWR0)
415 PM_SYS_PUSH(SIC_IWR1)
418 PM_SYS_PUSH(SIC_IWR2)
421 PM_SYS_PUSH(SICA_IWR0)
424 PM_SYS_PUSH(SICA_IWR1)
428 PM_SYS_PUSH(PINT0_ASSIGN)
429 PM_SYS_PUSH(PINT1_ASSIGN)
430 PM_SYS_PUSH(PINT2_ASSIGN)
431 PM_SYS_PUSH(PINT3_ASSIGN)
434 PM_SYS_PUSH(EBIU_AMBCTL0)
435 PM_SYS_PUSH(EBIU_AMBCTL1)
436 PM_SYS_PUSH16(EBIU_AMGCTL)
439 PM_SYS_PUSH(EBIU_MBSCTL)
440 PM_SYS_PUSH(EBIU_MODE)
441 PM_SYS_PUSH(EBIU_FCTL)
447 P0.H = hi(SRAM_BASE_ADDRESS);
448 P0.L = lo(SRAM_BASE_ADDRESS);
450 PM_PUSH(DMEM_CONTROL)
461 PM_PUSH(DCPLB_ADDR10)
462 PM_PUSH(DCPLB_ADDR11)
463 PM_PUSH(DCPLB_ADDR12)
464 PM_PUSH(DCPLB_ADDR13)
465 PM_PUSH(DCPLB_ADDR14)
466 PM_PUSH(DCPLB_ADDR15)
477 PM_PUSH(DCPLB_DATA10)
478 PM_PUSH(DCPLB_DATA11)
479 PM_PUSH(DCPLB_DATA12)
480 PM_PUSH(DCPLB_DATA13)
481 PM_PUSH(DCPLB_DATA14)
482 PM_PUSH(DCPLB_DATA15)
483 PM_PUSH(IMEM_CONTROL)
494 PM_PUSH(ICPLB_ADDR10)
495 PM_PUSH(ICPLB_ADDR11)
496 PM_PUSH(ICPLB_ADDR12)
497 PM_PUSH(ICPLB_ADDR13)
498 PM_PUSH(ICPLB_ADDR14)
499 PM_PUSH(ICPLB_ADDR15)
510 PM_PUSH(ICPLB_DATA10)
511 PM_PUSH(ICPLB_DATA11)
512 PM_PUSH(ICPLB_DATA12)
513 PM_PUSH(ICPLB_DATA13)
514 PM_PUSH(ICPLB_DATA14)
515 PM_PUSH(ICPLB_DATA15)
541 /* Save Core Registers */
543 [--sp] = ( R7:0, P5:0 );
590 /* Save Magic, return address and Stack Pointer */
593 R0.H = 0xDEAD; /* Hibernate Magic */
595 [P0++] = R0; /* Store Hibernate Magic */
596 R0.H = pm_resume_here;
597 R0.L = pm_resume_here;
598 [P0++] = R0; /* Save Return Address */
599 [P0++] = SP; /* Save Stack Pointer */
600 P0.H = _hibernate_mode;
601 P0.L = _hibernate_mode;
603 call (P0); /* Goodbye */
607 /* Restore Core Registers */
654 ( R7 : 0, P5 : 0) = [ SP ++ ];
657 /* Restore Core MMRs */
750 /* Restore System MMRs */
757 PM_SYS_POP(EBIU_FCTL)
758 PM_SYS_POP(EBIU_MODE)
759 PM_SYS_POP(EBIU_MBSCTL)
761 PM_SYS_POP16(EBIU_AMGCTL)
762 PM_SYS_POP(EBIU_AMBCTL1)
763 PM_SYS_POP(EBIU_AMBCTL0)
766 PM_SYS_POP(PINT3_ASSIGN)
767 PM_SYS_POP(PINT2_ASSIGN)
768 PM_SYS_POP(PINT1_ASSIGN)
769 PM_SYS_POP(PINT0_ASSIGN)
773 PM_SYS_POP(SICA_IWR1)
776 PM_SYS_POP(SICA_IWR0)
792 PM_SYS_POP(SICA_IAR7)
793 PM_SYS_POP(SICA_IAR6)
794 PM_SYS_POP(SICA_IAR5)
795 PM_SYS_POP(SICA_IAR4)
796 PM_SYS_POP(SICA_IAR3)
797 PM_SYS_POP(SICA_IAR2)
798 PM_SYS_POP(SICA_IAR1)
799 PM_SYS_POP(SICA_IAR0)
803 PM_SYS_POP(SIC_IAR11)
804 PM_SYS_POP(SIC_IAR10)
825 PM_SYS_POP(SICA_IMASK1)
828 PM_SYS_POP(SICA_IMASK0)
831 PM_SYS_POP(SIC_IMASK)
834 PM_SYS_POP(SIC_IMASK2)
837 PM_SYS_POP(SIC_IMASK1)
840 PM_SYS_POP(SIC_IMASK0)
843 [--sp] = RETI; /* Clear Global Interrupt Disable */
847 ( R7:0, P5:0 ) = [SP++];