468 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			468 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 892f6d2fb9c42d4ac451236639599f533c37b507 Mon Sep 17 00:00:00 2001
 | 
						|
From: Claudiu Beznea <claudiu.beznea@microchip.com>
 | 
						|
Date: Thu, 15 Apr 2021 13:49:53 +0300
 | 
						|
Subject: [PATCH 203/247] ARM: at91: pm: avoid push and pop on stack while
 | 
						|
 memory is in self-refersh
 | 
						|
 | 
						|
For the previous AT91 RAM controller and self-refresh procedure this
 | 
						|
had no side effects. However, for SAMA7G5 the self-refresh procedure
 | 
						|
doesn't allow this anymore as the RAM controller ports are closed
 | 
						|
before switching it to self-refresh. This commits prepares the code
 | 
						|
for the following ones adding self-refresh and PM support for SAMA7G5.
 | 
						|
 | 
						|
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
 | 
						|
Signed-off-by: Nicolas Ferre <nicolas.ferre@microchip.com>
 | 
						|
Link: https://lore.kernel.org/r/20210415105010.569620-8-claudiu.beznea@microchip.com
 | 
						|
---
 | 
						|
 arch/arm/mach-at91/pm_suspend.S | 397 +++++++++++++++++---------------
 | 
						|
 1 file changed, 205 insertions(+), 192 deletions(-)
 | 
						|
 | 
						|
--- a/arch/arm/mach-at91/pm_suspend.S
 | 
						|
+++ b/arch/arm/mach-at91/pm_suspend.S
 | 
						|
@@ -75,98 +75,147 @@ tmp3	.req	r6
 | 
						|
 
 | 
						|
 	.arm
 | 
						|
 
 | 
						|
-/*
 | 
						|
- * void at91_suspend_sram_fn(struct at91_pm_data*)
 | 
						|
- * @input param:
 | 
						|
- * 	@r0: base address of struct at91_pm_data
 | 
						|
+/**
 | 
						|
+ * Enable self-refresh
 | 
						|
+ *
 | 
						|
+ * register usage:
 | 
						|
+ * 	@r1: memory type
 | 
						|
+ *	@r2: base address of the sram controller
 | 
						|
+ *	@r3: temporary
 | 
						|
  */
 | 
						|
-/* at91_pm_suspend_in_sram must be 8-byte aligned per the requirements of fncpy() */
 | 
						|
-	.align 3
 | 
						|
-ENTRY(at91_pm_suspend_in_sram)
 | 
						|
-	/* Save registers on stack */
 | 
						|
-	stmfd	sp!, {r4 - r12, lr}
 | 
						|
+.macro at91_sramc_self_refresh_ena
 | 
						|
+	ldr	r1, .memtype
 | 
						|
+	ldr	r2, .sramc_base
 | 
						|
 
 | 
						|
-	/* Drain write buffer */
 | 
						|
-	mov	tmp1, #0
 | 
						|
-	mcr	p15, 0, tmp1, c7, c10, 4
 | 
						|
+	cmp	r1, #AT91_MEMCTRL_MC
 | 
						|
+	bne	sr_ena_ddrc_sf
 | 
						|
 
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_PMC]
 | 
						|
-	str	tmp1, .pmc_base
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_RAMC0]
 | 
						|
-	str	tmp1, .sramc_base
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_RAMC1]
 | 
						|
-	str	tmp1, .sramc1_base
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_MEMCTRL]
 | 
						|
-	str	tmp1, .memtype
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_MODE]
 | 
						|
-	str	tmp1, .pm_mode
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_PMC_MCKR_OFFSET]
 | 
						|
-	str	tmp1, .mckr_offset
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_PMC_VERSION]
 | 
						|
-	str	tmp1, .pmc_version
 | 
						|
-	/* Both ldrne below are here to preload their address in the TLB */
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_SHDWC]
 | 
						|
-	str	tmp1, .shdwc
 | 
						|
-	cmp	tmp1, #0
 | 
						|
-	ldrne	tmp2, [tmp1, #0]
 | 
						|
-	ldr	tmp1, [r0, #PM_DATA_SFRBU]
 | 
						|
-	str	tmp1, .sfrbu
 | 
						|
-	cmp	tmp1, #0
 | 
						|
-	ldrne	tmp2, [tmp1, #0x10]
 | 
						|
+	/* Active SDRAM self-refresh mode */
 | 
						|
+	mov	r3, #1
 | 
						|
+	str	r3, [r2, #AT91_MC_SDRAMC_SRR]
 | 
						|
+	b	sr_ena_exit
 | 
						|
 
 | 
						|
-	/* Active the self-refresh mode */
 | 
						|
-	mov	r0, #SRAMC_SELF_FRESH_ACTIVE
 | 
						|
-	bl	at91_sramc_self_refresh
 | 
						|
+sr_ena_ddrc_sf:
 | 
						|
+	cmp	r1, #AT91_MEMCTRL_DDRSDR
 | 
						|
+	bne	sr_ena_sdramc_sf
 | 
						|
 
 | 
						|
-	ldr	r0, .pm_mode
 | 
						|
-	cmp	r0, #AT91_PM_STANDBY
 | 
						|
-	beq	standby
 | 
						|
-	cmp	r0, #AT91_PM_BACKUP
 | 
						|
-	beq	backup_mode
 | 
						|
+	/*
 | 
						|
+	 * DDR Memory controller
 | 
						|
+	 */
 | 
						|
 
 | 
						|
-	bl	at91_ulp_mode
 | 
						|
-	b	exit_suspend
 | 
						|
+	/* LPDDR1 --> force DDR2 mode during self-refresh */
 | 
						|
+	ldr	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	str	r3, .saved_sam9_mdr
 | 
						|
+	bic	r3, r3, #~AT91_DDRSDRC_MD
 | 
						|
+	cmp	r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
 | 
						|
+	ldreq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	biceq	r3, r3, #AT91_DDRSDRC_MD
 | 
						|
+	orreq	r3, r3, #AT91_DDRSDRC_MD_DDR2
 | 
						|
+	streq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
 
 | 
						|
-standby:
 | 
						|
-	/* Wait for interrupt */
 | 
						|
-	ldr	pmc, .pmc_base
 | 
						|
-	at91_cpu_idle
 | 
						|
-	b	exit_suspend
 | 
						|
+	/* Active DDRC self-refresh mode */
 | 
						|
+	ldr	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+	str	r3, .saved_sam9_lpr
 | 
						|
+	bic	r3, r3, #AT91_DDRSDRC_LPCB
 | 
						|
+	orr	r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
 | 
						|
+	str	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
 
 | 
						|
-backup_mode:
 | 
						|
-	bl	at91_backup_mode
 | 
						|
-	b	exit_suspend
 | 
						|
+	/* If using the 2nd ddr controller */
 | 
						|
+	ldr	r2, .sramc1_base
 | 
						|
+	cmp	r2, #0
 | 
						|
+	beq	sr_ena_no_2nd_ddrc
 | 
						|
 
 | 
						|
-exit_suspend:
 | 
						|
-	/* Exit the self-refresh mode */
 | 
						|
-	mov	r0, #SRAMC_SELF_FRESH_EXIT
 | 
						|
-	bl	at91_sramc_self_refresh
 | 
						|
+	ldr	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	str	r3, .saved_sam9_mdr1
 | 
						|
+	bic	r3, r3, #~AT91_DDRSDRC_MD
 | 
						|
+	cmp	r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
 | 
						|
+	ldreq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	biceq	r3, r3, #AT91_DDRSDRC_MD
 | 
						|
+	orreq	r3, r3, #AT91_DDRSDRC_MD_DDR2
 | 
						|
+	streq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
 
 | 
						|
-	/* Restore registers, and return */
 | 
						|
-	ldmfd	sp!, {r4 - r12, pc}
 | 
						|
-ENDPROC(at91_pm_suspend_in_sram)
 | 
						|
+	/* Active DDRC self-refresh mode */
 | 
						|
+	ldr	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+	str	r3, .saved_sam9_lpr1
 | 
						|
+	bic	r3, r3, #AT91_DDRSDRC_LPCB
 | 
						|
+	orr	r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
 | 
						|
+	str	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
 
 | 
						|
-ENTRY(at91_backup_mode)
 | 
						|
-	/* Switch the master clock source to slow clock. */
 | 
						|
-	ldr	pmc, .pmc_base
 | 
						|
-	ldr	tmp2, .mckr_offset
 | 
						|
-	ldr	tmp1, [pmc, tmp2]
 | 
						|
-	bic	tmp1, tmp1, #AT91_PMC_CSS
 | 
						|
-	str	tmp1, [pmc, tmp2]
 | 
						|
+sr_ena_no_2nd_ddrc:
 | 
						|
+	b	sr_ena_exit
 | 
						|
 
 | 
						|
-	wait_mckrdy
 | 
						|
+	/*
 | 
						|
+	 * SDRAMC Memory controller
 | 
						|
+	 */
 | 
						|
+sr_ena_sdramc_sf:
 | 
						|
+	/* Active SDRAMC self-refresh mode */
 | 
						|
+	ldr	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
+	str	r3, .saved_sam9_lpr
 | 
						|
+	bic	r3, r3, #AT91_SDRAMC_LPCB
 | 
						|
+	orr	r3, r3, #AT91_SDRAMC_LPCB_SELF_REFRESH
 | 
						|
+	str	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
 
 | 
						|
-	/*BUMEN*/
 | 
						|
-	ldr	r0, .sfrbu
 | 
						|
-	mov	tmp1, #0x1
 | 
						|
-	str	tmp1, [r0, #0x10]
 | 
						|
+	ldr	r3, .saved_sam9_lpr
 | 
						|
+	str	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
 
 | 
						|
-	/* Shutdown */
 | 
						|
-	ldr	r0, .shdwc
 | 
						|
-	mov	tmp1, #0xA5000000
 | 
						|
-	add	tmp1, tmp1, #0x1
 | 
						|
-	str	tmp1, [r0, #0]
 | 
						|
-ENDPROC(at91_backup_mode)
 | 
						|
+sr_ena_exit:
 | 
						|
+.endm
 | 
						|
+
 | 
						|
+/**
 | 
						|
+ * Disable self-refresh
 | 
						|
+ *
 | 
						|
+ * register usage:
 | 
						|
+ * 	@r1: memory type
 | 
						|
+ *	@r2: base address of the sram controller
 | 
						|
+ *	@r3: temporary
 | 
						|
+ */
 | 
						|
+.macro at91_sramc_self_refresh_dis
 | 
						|
+	ldr	r1, .memtype
 | 
						|
+	ldr	r2, .sramc_base
 | 
						|
+
 | 
						|
+	cmp	r1, #AT91_MEMCTRL_MC
 | 
						|
+	bne	sr_dis_ddrc_exit_sf
 | 
						|
+
 | 
						|
+	/*
 | 
						|
+	 * at91rm9200 Memory controller
 | 
						|
+	 */
 | 
						|
+
 | 
						|
+	 /*
 | 
						|
+	  * For exiting the self-refresh mode, do nothing,
 | 
						|
+	  * automatically exit the self-refresh mode.
 | 
						|
+	  */
 | 
						|
+	b	sr_dis_exit
 | 
						|
+
 | 
						|
+sr_dis_ddrc_exit_sf:
 | 
						|
+	cmp	r1, #AT91_MEMCTRL_DDRSDR
 | 
						|
+	bne	sdramc_exit_sf
 | 
						|
+
 | 
						|
+	/* DDR Memory controller */
 | 
						|
+
 | 
						|
+	/* Restore MDR in case of LPDDR1 */
 | 
						|
+	ldr	r3, .saved_sam9_mdr
 | 
						|
+	str	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	/* Restore LPR on AT91 with DDRAM */
 | 
						|
+	ldr	r3, .saved_sam9_lpr
 | 
						|
+	str	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+
 | 
						|
+	/* If using the 2nd ddr controller */
 | 
						|
+	ldr	r2, .sramc1_base
 | 
						|
+	cmp	r2, #0
 | 
						|
+	ldrne	r3, .saved_sam9_mdr1
 | 
						|
+	strne	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	ldrne	r3, .saved_sam9_lpr1
 | 
						|
+	strne	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+
 | 
						|
+	b	sr_dis_exit
 | 
						|
+
 | 
						|
+sdramc_exit_sf:
 | 
						|
+	/* SDRAMC Memory controller */
 | 
						|
+	ldr	r3, .saved_sam9_lpr
 | 
						|
+	str	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
+
 | 
						|
+sr_dis_exit:
 | 
						|
+.endm
 | 
						|
 
 | 
						|
 .macro at91_pm_ulp0_mode
 | 
						|
 	ldr	pmc, .pmc_base
 | 
						|
@@ -503,7 +552,7 @@ ENDPROC(at91_backup_mode)
 | 
						|
 2:
 | 
						|
 .endm
 | 
						|
 
 | 
						|
-ENTRY(at91_ulp_mode)
 | 
						|
+.macro at91_ulp_mode
 | 
						|
 	ldr	pmc, .pmc_base
 | 
						|
 	ldr	tmp2, .mckr_offset
 | 
						|
 	ldr	tmp3, .pm_mode
 | 
						|
@@ -552,133 +601,97 @@ ulp_exit:
 | 
						|
 
 | 
						|
 	wait_mckrdy
 | 
						|
 
 | 
						|
-	mov	pc, lr
 | 
						|
-ENDPROC(at91_ulp_mode)
 | 
						|
-
 | 
						|
-/*
 | 
						|
- * void at91_sramc_self_refresh(unsigned int is_active)
 | 
						|
- *
 | 
						|
- * @input param:
 | 
						|
- *	@r0: 1 - active self-refresh mode
 | 
						|
- *	     0 - exit self-refresh mode
 | 
						|
- * register usage:
 | 
						|
- * 	@r1: memory type
 | 
						|
- *	@r2: base address of the sram controller
 | 
						|
- */
 | 
						|
-
 | 
						|
-ENTRY(at91_sramc_self_refresh)
 | 
						|
-	ldr	r1, .memtype
 | 
						|
-	ldr	r2, .sramc_base
 | 
						|
-
 | 
						|
-	cmp	r1, #AT91_MEMCTRL_MC
 | 
						|
-	bne	ddrc_sf
 | 
						|
-
 | 
						|
-	/*
 | 
						|
-	 * at91rm9200 Memory controller
 | 
						|
-	 */
 | 
						|
-
 | 
						|
-	 /*
 | 
						|
-	  * For exiting the self-refresh mode, do nothing,
 | 
						|
-	  * automatically exit the self-refresh mode.
 | 
						|
-	  */
 | 
						|
-	tst	r0, #SRAMC_SELF_FRESH_ACTIVE
 | 
						|
-	beq	exit_sramc_sf
 | 
						|
-
 | 
						|
-	/* Active SDRAM self-refresh mode */
 | 
						|
-	mov	r3, #1
 | 
						|
-	str	r3, [r2, #AT91_MC_SDRAMC_SRR]
 | 
						|
-	b	exit_sramc_sf
 | 
						|
-
 | 
						|
-ddrc_sf:
 | 
						|
-	cmp	r1, #AT91_MEMCTRL_DDRSDR
 | 
						|
-	bne	sdramc_sf
 | 
						|
+.endm
 | 
						|
 
 | 
						|
-	/*
 | 
						|
-	 * DDR Memory controller
 | 
						|
-	 */
 | 
						|
-	tst	r0, #SRAMC_SELF_FRESH_ACTIVE
 | 
						|
-	beq	ddrc_exit_sf
 | 
						|
+.macro at91_backup_mode
 | 
						|
+	/* Switch the master clock source to slow clock. */
 | 
						|
+	ldr	pmc, .pmc_base
 | 
						|
+	ldr	tmp2, .mckr_offset
 | 
						|
+	ldr	tmp1, [pmc, tmp2]
 | 
						|
+	bic	tmp1, tmp1, #AT91_PMC_CSS
 | 
						|
+	str	tmp1, [pmc, tmp2]
 | 
						|
 
 | 
						|
-	/* LPDDR1 --> force DDR2 mode during self-refresh */
 | 
						|
-	ldr	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
-	str	r3, .saved_sam9_mdr
 | 
						|
-	bic	r3, r3, #~AT91_DDRSDRC_MD
 | 
						|
-	cmp	r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
 | 
						|
-	ldreq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
-	biceq	r3, r3, #AT91_DDRSDRC_MD
 | 
						|
-	orreq	r3, r3, #AT91_DDRSDRC_MD_DDR2
 | 
						|
-	streq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+	wait_mckrdy
 | 
						|
 
 | 
						|
-	/* Active DDRC self-refresh mode */
 | 
						|
-	ldr	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
-	str	r3, .saved_sam9_lpr
 | 
						|
-	bic	r3, r3, #AT91_DDRSDRC_LPCB
 | 
						|
-	orr	r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
 | 
						|
-	str	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+	/*BUMEN*/
 | 
						|
+	ldr	r0, .sfrbu
 | 
						|
+	mov	tmp1, #0x1
 | 
						|
+	str	tmp1, [r0, #0x10]
 | 
						|
 
 | 
						|
-	/* If using the 2nd ddr controller */
 | 
						|
-	ldr	r2, .sramc1_base
 | 
						|
-	cmp	r2, #0
 | 
						|
-	beq	no_2nd_ddrc
 | 
						|
+	/* Shutdown */
 | 
						|
+	ldr	r0, .shdwc
 | 
						|
+	mov	tmp1, #0xA5000000
 | 
						|
+	add	tmp1, tmp1, #0x1
 | 
						|
+	str	tmp1, [r0, #0]
 | 
						|
+.endm
 | 
						|
 
 | 
						|
-	ldr	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
-	str	r3, .saved_sam9_mdr1
 | 
						|
-	bic	r3, r3, #~AT91_DDRSDRC_MD
 | 
						|
-	cmp	r3, #AT91_DDRSDRC_MD_LOW_POWER_DDR
 | 
						|
-	ldreq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
-	biceq	r3, r3, #AT91_DDRSDRC_MD
 | 
						|
-	orreq	r3, r3, #AT91_DDRSDRC_MD_DDR2
 | 
						|
-	streq	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
+/*
 | 
						|
+ * void at91_suspend_sram_fn(struct at91_pm_data*)
 | 
						|
+ * @input param:
 | 
						|
+ * 	@r0: base address of struct at91_pm_data
 | 
						|
+ */
 | 
						|
+/* at91_pm_suspend_in_sram must be 8-byte aligned per the requirements of fncpy() */
 | 
						|
+	.align 3
 | 
						|
+ENTRY(at91_pm_suspend_in_sram)
 | 
						|
+	/* Save registers on stack */
 | 
						|
+	stmfd	sp!, {r4 - r12, lr}
 | 
						|
 
 | 
						|
-	/* Active DDRC self-refresh mode */
 | 
						|
-	ldr	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
-	str	r3, .saved_sam9_lpr1
 | 
						|
-	bic	r3, r3, #AT91_DDRSDRC_LPCB
 | 
						|
-	orr	r3, r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH
 | 
						|
-	str	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+	/* Drain write buffer */
 | 
						|
+	mov	tmp1, #0
 | 
						|
+	mcr	p15, 0, tmp1, c7, c10, 4
 | 
						|
 
 | 
						|
-no_2nd_ddrc:
 | 
						|
-	b	exit_sramc_sf
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_PMC]
 | 
						|
+	str	tmp1, .pmc_base
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_RAMC0]
 | 
						|
+	str	tmp1, .sramc_base
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_RAMC1]
 | 
						|
+	str	tmp1, .sramc1_base
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_MEMCTRL]
 | 
						|
+	str	tmp1, .memtype
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_MODE]
 | 
						|
+	str	tmp1, .pm_mode
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_PMC_MCKR_OFFSET]
 | 
						|
+	str	tmp1, .mckr_offset
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_PMC_VERSION]
 | 
						|
+	str	tmp1, .pmc_version
 | 
						|
+	/* Both ldrne below are here to preload their address in the TLB */
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_SHDWC]
 | 
						|
+	str	tmp1, .shdwc
 | 
						|
+	cmp	tmp1, #0
 | 
						|
+	ldrne	tmp2, [tmp1, #0]
 | 
						|
+	ldr	tmp1, [r0, #PM_DATA_SFRBU]
 | 
						|
+	str	tmp1, .sfrbu
 | 
						|
+	cmp	tmp1, #0
 | 
						|
+	ldrne	tmp2, [tmp1, #0x10]
 | 
						|
 
 | 
						|
-ddrc_exit_sf:
 | 
						|
-	/* Restore MDR in case of LPDDR1 */
 | 
						|
-	ldr	r3, .saved_sam9_mdr
 | 
						|
-	str	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
-	/* Restore LPR on AT91 with DDRAM */
 | 
						|
-	ldr	r3, .saved_sam9_lpr
 | 
						|
-	str	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+	/* Active the self-refresh mode */
 | 
						|
+	at91_sramc_self_refresh_ena
 | 
						|
 
 | 
						|
-	/* If using the 2nd ddr controller */
 | 
						|
-	ldr	r2, .sramc1_base
 | 
						|
-	cmp	r2, #0
 | 
						|
-	ldrne	r3, .saved_sam9_mdr1
 | 
						|
-	strne	r3, [r2, #AT91_DDRSDRC_MDR]
 | 
						|
-	ldrne	r3, .saved_sam9_lpr1
 | 
						|
-	strne	r3, [r2, #AT91_DDRSDRC_LPR]
 | 
						|
+	ldr	r0, .pm_mode
 | 
						|
+	cmp	r0, #AT91_PM_STANDBY
 | 
						|
+	beq	standby
 | 
						|
+	cmp	r0, #AT91_PM_BACKUP
 | 
						|
+	beq	backup_mode
 | 
						|
 
 | 
						|
-	b	exit_sramc_sf
 | 
						|
+	at91_ulp_mode
 | 
						|
+	b	exit_suspend
 | 
						|
 
 | 
						|
-	/*
 | 
						|
-	 * SDRAMC Memory controller
 | 
						|
-	 */
 | 
						|
-sdramc_sf:
 | 
						|
-	tst	r0, #SRAMC_SELF_FRESH_ACTIVE
 | 
						|
-	beq	sdramc_exit_sf
 | 
						|
+standby:
 | 
						|
+	/* Wait for interrupt */
 | 
						|
+	ldr	pmc, .pmc_base
 | 
						|
+	at91_cpu_idle
 | 
						|
+	b	exit_suspend
 | 
						|
 
 | 
						|
-	/* Active SDRAMC self-refresh mode */
 | 
						|
-	ldr	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
-	str	r3, .saved_sam9_lpr
 | 
						|
-	bic	r3, r3, #AT91_SDRAMC_LPCB
 | 
						|
-	orr	r3, r3, #AT91_SDRAMC_LPCB_SELF_REFRESH
 | 
						|
-	str	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
+backup_mode:
 | 
						|
+	at91_backup_mode
 | 
						|
 
 | 
						|
-sdramc_exit_sf:
 | 
						|
-	ldr	r3, .saved_sam9_lpr
 | 
						|
-	str	r3, [r2, #AT91_SDRAMC_LPR]
 | 
						|
+exit_suspend:
 | 
						|
+	/* Exit the self-refresh mode */
 | 
						|
+	at91_sramc_self_refresh_dis
 | 
						|
 
 | 
						|
-exit_sramc_sf:
 | 
						|
-	mov	pc, lr
 | 
						|
-ENDPROC(at91_sramc_self_refresh)
 | 
						|
+	/* Restore registers, and return */
 | 
						|
+	ldmfd	sp!, {r4 - r12, pc}
 | 
						|
+ENDPROC(at91_pm_suspend_in_sram)
 | 
						|
 
 | 
						|
 .pmc_base:
 | 
						|
 	.word 0
 |