| Todd Poynor | 26705ca | 2005-07-01 11:27:05 +0100 | [diff] [blame] | 1 | /* | 
 | 2 |  * PXA27x standby mode | 
 | 3 |  * | 
 | 4 |  * Author: David Burrage | 
 | 5 |  * | 
 | 6 |  * 2005 (c) MontaVista Software, Inc. This file is licensed under | 
 | 7 |  * the terms of the GNU General Public License version 2. This program | 
 | 8 |  * is licensed "as is" without any warranty of any kind, whether express | 
 | 9 |  * or implied. | 
 | 10 |  */ | 
 | 11 |  | 
| Todd Poynor | 26705ca | 2005-07-01 11:27:05 +0100 | [diff] [blame] | 12 | #include <linux/linkage.h> | 
 | 13 | #include <asm/assembler.h> | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 14 | #include <mach/hardware.h> | 
| Todd Poynor | 26705ca | 2005-07-01 11:27:05 +0100 | [diff] [blame] | 15 |  | 
| Russell King | a09e64f | 2008-08-05 16:14:15 +0100 | [diff] [blame] | 16 | #include <mach/pxa2xx-regs.h> | 
| Todd Poynor | 26705ca | 2005-07-01 11:27:05 +0100 | [diff] [blame] | 17 |  | 
 | 18 | 		.text | 
 | 19 |  | 
| Russell King | 533462f | 2008-01-04 22:43:36 +0000 | [diff] [blame] | 20 | #ifdef CONFIG_PXA27x | 
| Todd Poynor | 26705ca | 2005-07-01 11:27:05 +0100 | [diff] [blame] | 21 | ENTRY(pxa_cpu_standby) | 
 | 22 | 	ldr	r0, =PSSR | 
 | 23 | 	mov	r1, #(PSSR_PH | PSSR_STS) | 
| Todd Poynor | 80a1857 | 2005-10-28 16:25:01 +0100 | [diff] [blame] | 24 | 	mov	r2, #PWRMODE_STANDBY | 
| Todd Poynor | 26705ca | 2005-07-01 11:27:05 +0100 | [diff] [blame] | 25 | 	mov	r3, #UNCACHED_PHYS_0	@ Read mem context in. | 
 | 26 | 	ldr	ip, [r3] | 
 | 27 | 	b	1f | 
 | 28 |  | 
 | 29 | 	.align	5 | 
 | 30 | 1:	mcr	p14, 0, r2, c7, c0, 0	@ put the system into Standby | 
 | 31 | 	str	r1, [r0]		@ make sure PSSR_PH/STS are clear | 
 | 32 | 	mov	pc, lr | 
| Russell King | 533462f | 2008-01-04 22:43:36 +0000 | [diff] [blame] | 33 |  | 
 | 34 | #endif | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 35 |  | 
 | 36 | #ifdef CONFIG_PXA3xx | 
 | 37 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 38 | #define PXA3_MDCNFG		0x0000 | 
 | 39 | #define PXA3_MDCNFG_DMCEN	(1 << 30) | 
 | 40 | #define PXA3_DDR_HCAL		0x0060 | 
 | 41 | #define PXA3_DDR_HCAL_HCRNG	0x1f | 
 | 42 | #define PXA3_DDR_HCAL_HCPROG	(1 << 28) | 
 | 43 | #define PXA3_DDR_HCAL_HCEN	(1 << 31) | 
 | 44 | #define PXA3_DMCIER		0x0070 | 
 | 45 | #define PXA3_DMCIER_EDLP	(1 << 29) | 
 | 46 | #define PXA3_DMCISR		0x0078 | 
 | 47 | #define PXA3_RCOMP		0x0100 | 
 | 48 | #define PXA3_RCOMP_SWEVAL	(1 << 31) | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 49 |  | 
 | 50 | ENTRY(pm_enter_standby_start) | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 51 | 	mov	r1, #0xf6000000			@ DMEMC_REG_BASE (PXA3_MDCNFG) | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 52 | 	add	r1, r1, #0x00100000 | 
 | 53 |  | 
 | 54 | 	/* | 
 | 55 | 	 * Preload the TLB entry for accessing the dynamic memory | 
 | 56 | 	 * controller registers.  Note that page table lookups will | 
 | 57 | 	 * fail until the dynamic memory controller has been | 
 | 58 | 	 * reinitialised - and that includes MMU page table walks. | 
 | 59 | 	 * This also means that only the dynamic memory controller | 
 | 60 | 	 * can be reliably accessed in the code following standby. | 
 | 61 | 	 */ | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 62 | 	ldr	r2, [r1]			@ Dummy read PXA3_MDCNFG | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 63 |  | 
 | 64 | 	mcr	p14, 0, r0, c7, c0, 0 | 
 | 65 | 	.rept	8 | 
 | 66 | 	nop | 
 | 67 | 	.endr | 
 | 68 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 69 | 	ldr	r0, [r1, #PXA3_DDR_HCAL]	@ Clear (and wait for) HCEN | 
 | 70 | 	bic	r0, r0, #PXA3_DDR_HCAL_HCEN | 
 | 71 | 	str	r0, [r1, #PXA3_DDR_HCAL] | 
 | 72 | 1:	ldr	r0, [r1, #PXA3_DDR_HCAL] | 
 | 73 | 	tst	r0, #PXA3_DDR_HCAL_HCEN | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 74 | 	bne	1b | 
 | 75 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 76 | 	ldr	r0, [r1, #PXA3_RCOMP]		@ Initiate RCOMP | 
 | 77 | 	orr	r0, r0, #PXA3_RCOMP_SWEVAL | 
 | 78 | 	str	r0, [r1, #PXA3_RCOMP] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 79 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 80 | 	mov	r0, #~0				@ Clear interrupts | 
 | 81 | 	str	r0, [r1, #PXA3_DMCISR] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 82 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 83 | 	ldr	r0, [r1, #PXA3_DMCIER]		@ set DMIER[EDLP] | 
 | 84 | 	orr	r0, r0, #PXA3_DMCIER_EDLP | 
 | 85 | 	str	r0, [r1, #PXA3_DMCIER] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 86 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 87 | 	ldr	r0, [r1, #PXA3_DDR_HCAL]	@ clear HCRNG, set HCPROG, HCEN | 
 | 88 | 	bic	r0, r0, #PXA3_DDR_HCAL_HCRNG | 
 | 89 | 	orr	r0, r0, #PXA3_DDR_HCAL_HCEN | PXA3_DDR_HCAL_HCPROG | 
 | 90 | 	str	r0, [r1, #PXA3_DDR_HCAL] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 91 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 92 | 1:	ldr	r0, [r1, #PXA3_DMCISR] | 
 | 93 | 	tst	r0, #PXA3_DMCIER_EDLP | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 94 | 	beq	1b | 
 | 95 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 96 | 	ldr	r0, [r1, #PXA3_MDCNFG]		@ set PXA3_MDCNFG[DMCEN] | 
 | 97 | 	orr	r0, r0, #PXA3_MDCNFG_DMCEN | 
 | 98 | 	str	r0, [r1, #PXA3_MDCNFG] | 
 | 99 | 1:	ldr	r0, [r1, #PXA3_MDCNFG] | 
 | 100 | 	tst	r0, #PXA3_MDCNFG_DMCEN | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 101 | 	beq	1b | 
 | 102 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 103 | 	ldr	r0, [r1, #PXA3_DDR_HCAL]	@ set PXA3_DDR_HCAL[HCRNG] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 104 | 	orr	r0, r0, #2 @ HCRNG | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 105 | 	str	r0, [r1, #PXA3_DDR_HCAL] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 106 |  | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 107 | 	ldr	r0, [r1, #PXA3_DMCIER]		@ Clear the interrupt | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 108 | 	bic	r0, r0, #0x20000000 | 
| Russell King | ffdf786 | 2008-05-18 14:57:59 +0100 | [diff] [blame] | 109 | 	str	r0, [r1, #PXA3_DMCIER] | 
| Russell King | 7b5dea1 | 2008-01-07 22:18:30 +0000 | [diff] [blame] | 110 |  | 
 | 111 | 	mov	pc, lr | 
 | 112 | ENTRY(pm_enter_standby_end) | 
 | 113 |  | 
 | 114 | #endif |