155 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
	
		
			2.5 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| 
								 | 
							
								#include <asm/reg.h>
							 | 
						||
| 
								 | 
							
								#include <asm/ppc_asm.h>
							 | 
						||
| 
								 | 
							
								#include <asm/processor.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_GLOBAL(mpc52xx_deep_sleep)
							 | 
						||
| 
								 | 
							
								mpc52xx_deep_sleep: /* args r3-r6: SRAM, SDRAM regs, CDM regs, INTR regs */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* enable interrupts */
							 | 
						||
| 
								 | 
							
									mfmsr	r7
							 | 
						||
| 
								 | 
							
									ori	r7, r7, 0x8000 /* EE */
							 | 
						||
| 
								 | 
							
									mtmsr	r7
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									li	r10, 0 /* flag that irq handler sets */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* enable tmr7 (or any other) interrupt */
							 | 
						||
| 
								 | 
							
									lwz	r8, 0x14(r6) /* intr->main_mask */
							 | 
						||
| 
								 | 
							
									ori	r8, r8, 0x1
							 | 
						||
| 
								 | 
							
									xori	r8, r8, 0x1
							 | 
						||
| 
								 | 
							
									stw	r8, 0x14(r6)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* emulate tmr7 interrupt */
							 | 
						||
| 
								 | 
							
									li	r8, 0x1
							 | 
						||
| 
								 | 
							
									stw	r8, 0x40(r6) /* intr->main_emulate */
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* wait for it to happen */
							 | 
						||
| 
								 | 
							
								1:
							 | 
						||
| 
								 | 
							
									cmpi	cr0, r10, 1
							 | 
						||
| 
								 | 
							
									bne	cr0, 1b
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* lock icache */
							 | 
						||
| 
								 | 
							
									mfspr	r10, SPRN_HID0
							 | 
						||
| 
								 | 
							
									ori	r10, r10, 0x2000
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
									mtspr	SPRN_HID0, r10
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									mflr	r9 /* save LR */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* jump to sram */
							 | 
						||
| 
								 | 
							
									mtlr	r3
							 | 
						||
| 
								 | 
							
									blrl
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									mtlr	r9 /* restore LR */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* unlock icache */
							 | 
						||
| 
								 | 
							
									mfspr	r10, SPRN_HID0
							 | 
						||
| 
								 | 
							
									ori	r10, r10, 0x2000
							 | 
						||
| 
								 | 
							
									xori	r10, r10, 0x2000
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
									mtspr	SPRN_HID0, r10
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* return to C code */
							 | 
						||
| 
								 | 
							
									blr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_GLOBAL(mpc52xx_ds_sram)
							 | 
						||
| 
								 | 
							
								mpc52xx_ds_sram:
							 | 
						||
| 
								 | 
							
									/* put SDRAM into self-refresh */
							 | 
						||
| 
								 | 
							
									lwz	r8, 0x4(r4)	/* sdram->ctrl */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									oris	r8, r8, 0x8000 /* mode_en */
							 | 
						||
| 
								 | 
							
									stw	r8, 0x4(r4)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ori	r8, r8, 0x0002 /* soft_pre */
							 | 
						||
| 
								 | 
							
									stw	r8, 0x4(r4)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
									xori	r8, r8, 0x0002
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									xoris	r8, r8, 0x8000 /* !mode_en */
							 | 
						||
| 
								 | 
							
									stw	r8, 0x4(r4)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									oris	r8, r8, 0x5000
							 | 
						||
| 
								 | 
							
									xoris	r8, r8, 0x4000 /* ref_en !cke */
							 | 
						||
| 
								 | 
							
									stw	r8, 0x4(r4)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* disable SDRAM clock */
							 | 
						||
| 
								 | 
							
									lwz	r8, 0x14(r5) /* cdm->clkenable */
							 | 
						||
| 
								 | 
							
									ori	r8, r8, 0x0008
							 | 
						||
| 
								 | 
							
									xori	r8, r8, 0x0008
							 | 
						||
| 
								 | 
							
									stw	r8, 0x14(r5)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* put mpc5200 to sleep */
							 | 
						||
| 
								 | 
							
									mfmsr	r10
							 | 
						||
| 
								 | 
							
									oris	r10, r10, 0x0004	/* POW = 1 */
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
									mtmsr	r10
							 | 
						||
| 
								 | 
							
									sync; isync;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* enable clock */
							 | 
						||
| 
								 | 
							
									lwz	r8, 0x14(r5)
							 | 
						||
| 
								 | 
							
									ori	r8, r8, 0x0008
							 | 
						||
| 
								 | 
							
									stw	r8, 0x14(r5)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* get ram out of self-refresh */
							 | 
						||
| 
								 | 
							
									lwz	r8, 0x4(r4)
							 | 
						||
| 
								 | 
							
									oris	r8, r8, 0x5000 /* cke ref_en */
							 | 
						||
| 
								 | 
							
									stw	r8, 0x4(r4)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									blr
							 | 
						||
| 
								 | 
							
								_GLOBAL(mpc52xx_ds_sram_size)
							 | 
						||
| 
								 | 
							
								mpc52xx_ds_sram_size:
							 | 
						||
| 
								 | 
							
									.long $-mpc52xx_ds_sram
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ### interrupt handler for wakeup from deep-sleep ### */
							 | 
						||
| 
								 | 
							
								_GLOBAL(mpc52xx_ds_cached)
							 | 
						||
| 
								 | 
							
								mpc52xx_ds_cached:
							 | 
						||
| 
								 | 
							
									mtspr	SPRN_SPRG0, r7
							 | 
						||
| 
								 | 
							
									mtspr	SPRN_SPRG1, r8
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* disable emulated interrupt */
							 | 
						||
| 
								 | 
							
									mfspr	r7, 311 /* MBAR */
							 | 
						||
| 
								 | 
							
									addi	r7, r7, 0x540	/* intr->main_emul */
							 | 
						||
| 
								 | 
							
									li	r8, 0
							 | 
						||
| 
								 | 
							
									stw	r8, 0(r7)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
									dcbf	0, r7
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* acknowledge wakeup, so CCS releases power pown */
							 | 
						||
| 
								 | 
							
									mfspr	r7, 311	/* MBAR */
							 | 
						||
| 
								 | 
							
									addi	r7, r7, 0x524	/* intr->enc_status */
							 | 
						||
| 
								 | 
							
									lwz	r8, 0(r7)
							 | 
						||
| 
								 | 
							
									ori	r8, r8, 0x0400
							 | 
						||
| 
								 | 
							
									stw	r8, 0(r7)
							 | 
						||
| 
								 | 
							
									sync
							 | 
						||
| 
								 | 
							
									dcbf	0, r7
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* flag - we handled the interrupt */
							 | 
						||
| 
								 | 
							
									li	r10, 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									mfspr	r8, SPRN_SPRG1
							 | 
						||
| 
								 | 
							
									mfspr	r7, SPRN_SPRG0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									rfi
							 | 
						||
| 
								 | 
							
								_GLOBAL(mpc52xx_ds_cached_size)
							 | 
						||
| 
								 | 
							
								mpc52xx_ds_cached_size:
							 | 
						||
| 
								 | 
							
									.long $-mpc52xx_ds_cached
							 |