xref: /openbmc/linux/arch/arm/mach-omap2/sleep34xx.S (revision ce491cf8)
18bd22949SKevin Hilman/*
28bd22949SKevin Hilman * linux/arch/arm/mach-omap2/sleep.S
38bd22949SKevin Hilman *
48bd22949SKevin Hilman * (C) Copyright 2007
58bd22949SKevin Hilman * Texas Instruments
68bd22949SKevin Hilman * Karthik Dasu <karthik-dp@ti.com>
78bd22949SKevin Hilman *
88bd22949SKevin Hilman * (C) Copyright 2004
98bd22949SKevin Hilman * Texas Instruments, <www.ti.com>
108bd22949SKevin Hilman * Richard Woodruff <r-woodruff2@ti.com>
118bd22949SKevin Hilman *
128bd22949SKevin Hilman * This program is free software; you can redistribute it and/or
138bd22949SKevin Hilman * modify it under the terms of the GNU General Public License as
148bd22949SKevin Hilman * published by the Free Software Foundation; either version 2 of
158bd22949SKevin Hilman * the License, or (at your option) any later version.
168bd22949SKevin Hilman *
178bd22949SKevin Hilman * This program is distributed in the hope that it will be useful,
188bd22949SKevin Hilman * but WITHOUT ANY WARRANTY; without even the implied warranty of
198bd22949SKevin Hilman * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the
208bd22949SKevin Hilman * GNU General Public License for more details.
218bd22949SKevin Hilman *
228bd22949SKevin Hilman * You should have received a copy of the GNU General Public License
238bd22949SKevin Hilman * along with this program; if not, write to the Free Software
248bd22949SKevin Hilman * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
258bd22949SKevin Hilman * MA 02111-1307 USA
268bd22949SKevin Hilman */
278bd22949SKevin Hilman#include <linux/linkage.h>
288bd22949SKevin Hilman#include <asm/assembler.h>
298bd22949SKevin Hilman#include <mach/io.h>
30ce491cf8STony Lindgren#include <plat/control.h>
318bd22949SKevin Hilman
328bd22949SKevin Hilman#include "prm.h"
338bd22949SKevin Hilman#include "sdrc.h"
348bd22949SKevin Hilman
358bd22949SKevin Hilman#define PM_PREPWSTST_CORE_V	OMAP34XX_PRM_REGADDR(CORE_MOD, \
368bd22949SKevin Hilman				OMAP3430_PM_PREPWSTST)
378bd22949SKevin Hilman#define PM_PREPWSTST_MPU_V	OMAP34XX_PRM_REGADDR(MPU_MOD, \
388bd22949SKevin Hilman				OMAP3430_PM_PREPWSTST)
398bd22949SKevin Hilman#define PM_PWSTCTRL_MPU_P	OMAP34XX_PRM_REGADDR(MPU_MOD, PM_PWSTCTRL)
408bd22949SKevin Hilman#define SCRATCHPAD_MEM_OFFS	0x310 /* Move this as correct place is
418bd22949SKevin Hilman				       * available */
428bd22949SKevin Hilman#define SCRATCHPAD_BASE_P	OMAP343X_CTRL_REGADDR(\
438bd22949SKevin Hilman				OMAP343X_CONTROL_MEM_WKUP +\
448bd22949SKevin Hilman				SCRATCHPAD_MEM_OFFS)
458bd22949SKevin Hilman#define SDRC_POWER_V		OMAP34XX_SDRC_REGADDR(SDRC_POWER)
468bd22949SKevin Hilman
478bd22949SKevin Hilman	.text
488bd22949SKevin Hilman/* Function call to get the restore pointer for resume from OFF */
498bd22949SKevin HilmanENTRY(get_restore_pointer)
508bd22949SKevin Hilman        stmfd   sp!, {lr}     @ save registers on stack
518bd22949SKevin Hilman	adr	r0, restore
528bd22949SKevin Hilman        ldmfd   sp!, {pc}     @ restore regs and return
538bd22949SKevin HilmanENTRY(get_restore_pointer_sz)
548bd22949SKevin Hilman        .word   . - get_restore_pointer_sz
558bd22949SKevin Hilman/*
568bd22949SKevin Hilman * Forces OMAP into idle state
578bd22949SKevin Hilman *
588bd22949SKevin Hilman * omap34xx_suspend() - This bit of code just executes the WFI
598bd22949SKevin Hilman * for normal idles.
608bd22949SKevin Hilman *
618bd22949SKevin Hilman * Note: This code get's copied to internal SRAM at boot. When the OMAP
628bd22949SKevin Hilman *	 wakes up it continues execution at the point it went to sleep.
638bd22949SKevin Hilman */
648bd22949SKevin HilmanENTRY(omap34xx_cpu_suspend)
658bd22949SKevin Hilman	stmfd	sp!, {r0-r12, lr}		@ save registers on stack
668bd22949SKevin Hilmanloop:
678bd22949SKevin Hilman	/*b	loop*/	@Enable to debug by stepping through code
688bd22949SKevin Hilman	/* r0 contains restore pointer in sdram */
698bd22949SKevin Hilman	/* r1 contains information about saving context */
708bd22949SKevin Hilman	ldr     r4, sdrc_power          @ read the SDRC_POWER register
718bd22949SKevin Hilman	ldr     r5, [r4]                @ read the contents of SDRC_POWER
728bd22949SKevin Hilman	orr     r5, r5, #0x40           @ enable self refresh on idle req
738bd22949SKevin Hilman	str     r5, [r4]                @ write back to SDRC_POWER register
748bd22949SKevin Hilman
758bd22949SKevin Hilman	cmp	r1, #0x0
768bd22949SKevin Hilman	/* If context save is required, do that and execute wfi */
778bd22949SKevin Hilman	bne	save_context_wfi
788bd22949SKevin Hilman	/* Data memory barrier and Data sync barrier */
798bd22949SKevin Hilman	mov	r1, #0
808bd22949SKevin Hilman	mcr	p15, 0, r1, c7, c10, 4
818bd22949SKevin Hilman	mcr	p15, 0, r1, c7, c10, 5
828bd22949SKevin Hilman
838bd22949SKevin Hilman	wfi				@ wait for interrupt
848bd22949SKevin Hilman
858bd22949SKevin Hilman	nop
868bd22949SKevin Hilman	nop
878bd22949SKevin Hilman	nop
888bd22949SKevin Hilman	nop
898bd22949SKevin Hilman	nop
908bd22949SKevin Hilman	nop
918bd22949SKevin Hilman	nop
928bd22949SKevin Hilman	nop
938bd22949SKevin Hilman	nop
948bd22949SKevin Hilman	nop
958bd22949SKevin Hilman	bl i_dll_wait
968bd22949SKevin Hilman
978bd22949SKevin Hilman	ldmfd	sp!, {r0-r12, pc}		@ restore regs and return
988bd22949SKevin Hilmanrestore:
998bd22949SKevin Hilman	/* b restore*/ 	@ Enable to debug restore code
1008bd22949SKevin Hilman        /* Check what was the reason for mpu reset and store the reason in r9*/
1018bd22949SKevin Hilman        /* 1 - Only L1 and logic lost */
1028bd22949SKevin Hilman        /* 2 - Only L2 lost - In this case, we wont be here */
1038bd22949SKevin Hilman        /* 3 - Both L1 and L2 lost */
1048bd22949SKevin Hilman	ldr     r1, pm_pwstctrl_mpu
1058bd22949SKevin Hilman	ldr	r2, [r1]
1068bd22949SKevin Hilman	and     r2, r2, #0x3
1078bd22949SKevin Hilman	cmp     r2, #0x0	@ Check if target power state was OFF or RET
1088bd22949SKevin Hilman        moveq   r9, #0x3        @ MPU OFF => L1 and L2 lost
1098bd22949SKevin Hilman	movne	r9, #0x1	@ Only L1 and L2 lost => avoid L2 invalidation
1108bd22949SKevin Hilman	bne	logic_l1_restore
1118bd22949SKevin Hilman	/* Execute smi to invalidate L2 cache */
1128bd22949SKevin Hilman	mov r12, #0x1                         @ set up to invalide L2
1138bd22949SKevin Hilmansmi:    .word 0xE1600070                @ Call SMI monitor (smieq)
1148bd22949SKevin Hilmanlogic_l1_restore:
1158bd22949SKevin Hilman	mov	r1, #0
1168bd22949SKevin Hilman	/* Invalidate all instruction caches to PoU
1178bd22949SKevin Hilman	 * and flush branch target cache */
1188bd22949SKevin Hilman	mcr	p15, 0, r1, c7, c5, 0
1198bd22949SKevin Hilman
1208bd22949SKevin Hilman	ldr	r4, scratchpad_base
1218bd22949SKevin Hilman	ldr	r3, [r4,#0xBC]
1228bd22949SKevin Hilman	ldmia	r3!, {r4-r6}
1238bd22949SKevin Hilman	mov	sp, r4
1248bd22949SKevin Hilman	msr	spsr_cxsf, r5
1258bd22949SKevin Hilman	mov	lr, r6
1268bd22949SKevin Hilman
1278bd22949SKevin Hilman	ldmia	r3!, {r4-r9}
1288bd22949SKevin Hilman	/* Coprocessor access Control Register */
1298bd22949SKevin Hilman	mcr p15, 0, r4, c1, c0, 2
1308bd22949SKevin Hilman
1318bd22949SKevin Hilman	/* TTBR0 */
1328bd22949SKevin Hilman	MCR p15, 0, r5, c2, c0, 0
1338bd22949SKevin Hilman	/* TTBR1 */
1348bd22949SKevin Hilman	MCR p15, 0, r6, c2, c0, 1
1358bd22949SKevin Hilman	/* Translation table base control register */
1368bd22949SKevin Hilman	MCR p15, 0, r7, c2, c0, 2
1378bd22949SKevin Hilman	/*domain access Control Register */
1388bd22949SKevin Hilman	MCR p15, 0, r8, c3, c0, 0
1398bd22949SKevin Hilman	/* data fault status Register */
1408bd22949SKevin Hilman	MCR p15, 0, r9, c5, c0, 0
1418bd22949SKevin Hilman
1428bd22949SKevin Hilman	ldmia  r3!,{r4-r8}
1438bd22949SKevin Hilman	/* instruction fault status Register */
1448bd22949SKevin Hilman	MCR p15, 0, r4, c5, c0, 1
1458bd22949SKevin Hilman	/*Data Auxiliary Fault Status Register */
1468bd22949SKevin Hilman	MCR p15, 0, r5, c5, c1, 0
1478bd22949SKevin Hilman	/*Instruction Auxiliary Fault Status Register*/
1488bd22949SKevin Hilman	MCR p15, 0, r6, c5, c1, 1
1498bd22949SKevin Hilman	/*Data Fault Address Register */
1508bd22949SKevin Hilman	MCR p15, 0, r7, c6, c0, 0
1518bd22949SKevin Hilman	/*Instruction Fault Address Register*/
1528bd22949SKevin Hilman	MCR p15, 0, r8, c6, c0, 2
1538bd22949SKevin Hilman	ldmia  r3!,{r4-r7}
1548bd22949SKevin Hilman
1558bd22949SKevin Hilman	/* user r/w thread and process ID */
1568bd22949SKevin Hilman	MCR p15, 0, r4, c13, c0, 2
1578bd22949SKevin Hilman	/* user ro thread and process ID */
1588bd22949SKevin Hilman	MCR p15, 0, r5, c13, c0, 3
1598bd22949SKevin Hilman	/*Privileged only thread and process ID */
1608bd22949SKevin Hilman	MCR p15, 0, r6, c13, c0, 4
1618bd22949SKevin Hilman	/* cache size selection */
1628bd22949SKevin Hilman	MCR p15, 2, r7, c0, c0, 0
1638bd22949SKevin Hilman	ldmia  r3!,{r4-r8}
1648bd22949SKevin Hilman	/* Data TLB lockdown registers */
1658bd22949SKevin Hilman	MCR p15, 0, r4, c10, c0, 0
1668bd22949SKevin Hilman	/* Instruction TLB lockdown registers */
1678bd22949SKevin Hilman	MCR p15, 0, r5, c10, c0, 1
1688bd22949SKevin Hilman	/* Secure or Nonsecure Vector Base Address */
1698bd22949SKevin Hilman	MCR p15, 0, r6, c12, c0, 0
1708bd22949SKevin Hilman	/* FCSE PID */
1718bd22949SKevin Hilman	MCR p15, 0, r7, c13, c0, 0
1728bd22949SKevin Hilman	/* Context PID */
1738bd22949SKevin Hilman	MCR p15, 0, r8, c13, c0, 1
1748bd22949SKevin Hilman
1758bd22949SKevin Hilman	ldmia  r3!,{r4-r5}
1768bd22949SKevin Hilman	/* primary memory remap register */
1778bd22949SKevin Hilman	MCR p15, 0, r4, c10, c2, 0
1788bd22949SKevin Hilman	/*normal memory remap register */
1798bd22949SKevin Hilman	MCR p15, 0, r5, c10, c2, 1
1808bd22949SKevin Hilman
1818bd22949SKevin Hilman	/* Restore cpsr */
1828bd22949SKevin Hilman	ldmia	r3!,{r4}	/*load CPSR from SDRAM*/
1838bd22949SKevin Hilman	msr	cpsr, r4	/*store cpsr */
1848bd22949SKevin Hilman
1858bd22949SKevin Hilman	/* Enabling MMU here */
1868bd22949SKevin Hilman	mrc	p15, 0, r7, c2, c0, 2 /* Read TTBRControl */
1878bd22949SKevin Hilman	/* Extract N (0:2) bits and decide whether to use TTBR0 or TTBR1*/
1888bd22949SKevin Hilman	and	r7, #0x7
1898bd22949SKevin Hilman	cmp	r7, #0x0
1908bd22949SKevin Hilman	beq	usettbr0
1918bd22949SKevin Hilmanttbr_error:
1928bd22949SKevin Hilman	/* More work needs to be done to support N[0:2] value other than 0
1938bd22949SKevin Hilman	* So looping here so that the error can be detected
1948bd22949SKevin Hilman	*/
1958bd22949SKevin Hilman	b	ttbr_error
1968bd22949SKevin Hilmanusettbr0:
1978bd22949SKevin Hilman	mrc	p15, 0, r2, c2, c0, 0
1988bd22949SKevin Hilman	ldr	r5, ttbrbit_mask
1998bd22949SKevin Hilman	and	r2, r5
2008bd22949SKevin Hilman	mov	r4, pc
2018bd22949SKevin Hilman	ldr	r5, table_index_mask
2028bd22949SKevin Hilman	and	r4, r5 /* r4 = 31 to 20 bits of pc */
2038bd22949SKevin Hilman	/* Extract the value to be written to table entry */
2048bd22949SKevin Hilman	ldr	r1, table_entry
2058bd22949SKevin Hilman	add	r1, r1, r4 /* r1 has value to be written to table entry*/
2068bd22949SKevin Hilman	/* Getting the address of table entry to modify */
2078bd22949SKevin Hilman	lsr	r4, #18
2088bd22949SKevin Hilman	add	r2, r4 /* r2 has the location which needs to be modified */
2098bd22949SKevin Hilman	/* Storing previous entry of location being modified */
2108bd22949SKevin Hilman	ldr	r5, scratchpad_base
2118bd22949SKevin Hilman	ldr	r4, [r2]
2128bd22949SKevin Hilman	str	r4, [r5, #0xC0]
2138bd22949SKevin Hilman	/* Modify the table entry */
2148bd22949SKevin Hilman	str	r1, [r2]
2158bd22949SKevin Hilman	/* Storing address of entry being modified
2168bd22949SKevin Hilman	 * - will be restored after enabling MMU */
2178bd22949SKevin Hilman	ldr	r5, scratchpad_base
2188bd22949SKevin Hilman	str	r2, [r5, #0xC4]
2198bd22949SKevin Hilman
2208bd22949SKevin Hilman	mov	r0, #0
2218bd22949SKevin Hilman	mcr	p15, 0, r0, c7, c5, 4	@ Flush prefetch buffer
2228bd22949SKevin Hilman	mcr	p15, 0, r0, c7, c5, 6	@ Invalidate branch predictor array
2238bd22949SKevin Hilman	mcr	p15, 0, r0, c8, c5, 0	@ Invalidate instruction TLB
2248bd22949SKevin Hilman	mcr	p15, 0, r0, c8, c6, 0	@ Invalidate data TLB
2258bd22949SKevin Hilman	/* Restore control register  but dont enable caches here*/
2268bd22949SKevin Hilman	/* Caches will be enabled after restoring MMU table entry */
2278bd22949SKevin Hilman	ldmia	r3!, {r4}
2288bd22949SKevin Hilman	/* Store previous value of control register in scratchpad */
2298bd22949SKevin Hilman	str	r4, [r5, #0xC8]
2308bd22949SKevin Hilman	ldr	r2, cache_pred_disable_mask
2318bd22949SKevin Hilman	and	r4, r2
2328bd22949SKevin Hilman	mcr	p15, 0, r4, c1, c0, 0
2338bd22949SKevin Hilman
2348bd22949SKevin Hilman	ldmfd	sp!, {r0-r12, pc}		@ restore regs and return
2358bd22949SKevin Hilmansave_context_wfi:
2368bd22949SKevin Hilman	/*b	save_context_wfi*/	@ enable to debug save code
2378bd22949SKevin Hilman	mov	r8, r0 /* Store SDRAM address in r8 */
2388bd22949SKevin Hilman        /* Check what that target sleep state is:stored in r1*/
2398bd22949SKevin Hilman        /* 1 - Only L1 and logic lost */
2408bd22949SKevin Hilman        /* 2 - Only L2 lost */
2418bd22949SKevin Hilman        /* 3 - Both L1 and L2 lost */
2428bd22949SKevin Hilman	cmp	r1, #0x2 /* Only L2 lost */
2438bd22949SKevin Hilman	beq	clean_l2
2448bd22949SKevin Hilman	cmp	r1, #0x1 /* L2 retained */
2458bd22949SKevin Hilman	/* r9 stores whether to clean L2 or not*/
2468bd22949SKevin Hilman	moveq	r9, #0x0 /* Dont Clean L2 */
2478bd22949SKevin Hilman	movne	r9, #0x1 /* Clean L2 */
2488bd22949SKevin Hilmanl1_logic_lost:
2498bd22949SKevin Hilman	/* Store sp and spsr to SDRAM */
2508bd22949SKevin Hilman	mov	r4, sp
2518bd22949SKevin Hilman	mrs	r5, spsr
2528bd22949SKevin Hilman	mov	r6, lr
2538bd22949SKevin Hilman	stmia	r8!, {r4-r6}
2548bd22949SKevin Hilman	/* Save all ARM registers */
2558bd22949SKevin Hilman	/* Coprocessor access control register */
2568bd22949SKevin Hilman	mrc	p15, 0, r6, c1, c0, 2
2578bd22949SKevin Hilman	stmia	r8!, {r6}
2588bd22949SKevin Hilman	/* TTBR0, TTBR1 and Translation table base control */
2598bd22949SKevin Hilman	mrc	p15, 0, r4, c2, c0, 0
2608bd22949SKevin Hilman	mrc	p15, 0, r5, c2, c0, 1
2618bd22949SKevin Hilman	mrc	p15, 0, r6, c2, c0, 2
2628bd22949SKevin Hilman	stmia	r8!, {r4-r6}
2638bd22949SKevin Hilman	/* Domain access control register, data fault status register,
2648bd22949SKevin Hilman	and instruction fault status register */
2658bd22949SKevin Hilman	mrc	p15, 0, r4, c3, c0, 0
2668bd22949SKevin Hilman	mrc	p15, 0, r5, c5, c0, 0
2678bd22949SKevin Hilman	mrc	p15, 0, r6, c5, c0, 1
2688bd22949SKevin Hilman	stmia	r8!, {r4-r6}
2698bd22949SKevin Hilman	/* Data aux fault status register, instruction aux fault status,
2708bd22949SKevin Hilman	datat fault address register and instruction fault address register*/
2718bd22949SKevin Hilman	mrc	p15, 0, r4, c5, c1, 0
2728bd22949SKevin Hilman	mrc	p15, 0, r5, c5, c1, 1
2738bd22949SKevin Hilman	mrc	p15, 0, r6, c6, c0, 0
2748bd22949SKevin Hilman	mrc	p15, 0, r7, c6, c0, 2
2758bd22949SKevin Hilman	stmia	r8!, {r4-r7}
2768bd22949SKevin Hilman	/* user r/w thread and process ID, user r/o thread and process ID,
2778bd22949SKevin Hilman	priv only thread and process ID, cache size selection */
2788bd22949SKevin Hilman	mrc	p15, 0, r4, c13, c0, 2
2798bd22949SKevin Hilman	mrc	p15, 0, r5, c13, c0, 3
2808bd22949SKevin Hilman	mrc	p15, 0, r6, c13, c0, 4
2818bd22949SKevin Hilman	mrc	p15, 2, r7, c0, c0, 0
2828bd22949SKevin Hilman	stmia	r8!, {r4-r7}
2838bd22949SKevin Hilman	/* Data TLB lockdown, instruction TLB lockdown registers */
2848bd22949SKevin Hilman	mrc	p15, 0, r5, c10, c0, 0
2858bd22949SKevin Hilman	mrc	p15, 0, r6, c10, c0, 1
2868bd22949SKevin Hilman	stmia	r8!, {r5-r6}
2878bd22949SKevin Hilman	/* Secure or non secure vector base address, FCSE PID, Context PID*/
2888bd22949SKevin Hilman	mrc	p15, 0, r4, c12, c0, 0
2898bd22949SKevin Hilman	mrc	p15, 0, r5, c13, c0, 0
2908bd22949SKevin Hilman	mrc	p15, 0, r6, c13, c0, 1
2918bd22949SKevin Hilman	stmia	r8!, {r4-r6}
2928bd22949SKevin Hilman	/* Primary remap, normal remap registers */
2938bd22949SKevin Hilman	mrc	p15, 0, r4, c10, c2, 0
2948bd22949SKevin Hilman	mrc	p15, 0, r5, c10, c2, 1
2958bd22949SKevin Hilman	stmia	r8!,{r4-r5}
2968bd22949SKevin Hilman
2978bd22949SKevin Hilman	/* Store current cpsr*/
2988bd22949SKevin Hilman	mrs	r2, cpsr
2998bd22949SKevin Hilman	stmia	r8!, {r2}
3008bd22949SKevin Hilman
3018bd22949SKevin Hilman	mrc	p15, 0, r4, c1, c0, 0
3028bd22949SKevin Hilman	/* save control register */
3038bd22949SKevin Hilman	stmia	r8!, {r4}
3048bd22949SKevin Hilmanclean_caches:
3058bd22949SKevin Hilman	/* Clean Data or unified cache to POU*/
3068bd22949SKevin Hilman	/* How to invalidate only L1 cache???? - #FIX_ME# */
3078bd22949SKevin Hilman	/* mcr	p15, 0, r11, c7, c11, 1 */
3088bd22949SKevin Hilman	cmp	r9, #1 /* Check whether L2 inval is required or not*/
3098bd22949SKevin Hilman	bne	skip_l2_inval
3108bd22949SKevin Hilmanclean_l2:
3118bd22949SKevin Hilman	/* read clidr */
3128bd22949SKevin Hilman	mrc     p15, 1, r0, c0, c0, 1
3138bd22949SKevin Hilman	/* extract loc from clidr */
3148bd22949SKevin Hilman	ands    r3, r0, #0x7000000
3158bd22949SKevin Hilman	/* left align loc bit field */
3168bd22949SKevin Hilman	mov     r3, r3, lsr #23
3178bd22949SKevin Hilman	/* if loc is 0, then no need to clean */
3188bd22949SKevin Hilman	beq     finished
3198bd22949SKevin Hilman	/* start clean at cache level 0 */
3208bd22949SKevin Hilman	mov     r10, #0
3218bd22949SKevin Hilmanloop1:
3228bd22949SKevin Hilman	/* work out 3x current cache level */
3238bd22949SKevin Hilman	add     r2, r10, r10, lsr #1
3248bd22949SKevin Hilman	/* extract cache type bits from clidr*/
3258bd22949SKevin Hilman	mov     r1, r0, lsr r2
3268bd22949SKevin Hilman	/* mask of the bits for current cache only */
3278bd22949SKevin Hilman	and     r1, r1, #7
3288bd22949SKevin Hilman	/* see what cache we have at this level */
3298bd22949SKevin Hilman	cmp     r1, #2
3308bd22949SKevin Hilman	/* skip if no cache, or just i-cache */
3318bd22949SKevin Hilman	blt     skip
3328bd22949SKevin Hilman	/* select current cache level in cssr */
3338bd22949SKevin Hilman	mcr     p15, 2, r10, c0, c0, 0
3348bd22949SKevin Hilman	/* isb to sych the new cssr&csidr */
3358bd22949SKevin Hilman	isb
3368bd22949SKevin Hilman	/* read the new csidr */
3378bd22949SKevin Hilman	mrc     p15, 1, r1, c0, c0, 0
3388bd22949SKevin Hilman	/* extract the length of the cache lines */
3398bd22949SKevin Hilman	and     r2, r1, #7
3408bd22949SKevin Hilman	/* add 4 (line length offset) */
3418bd22949SKevin Hilman	add     r2, r2, #4
3428bd22949SKevin Hilman	ldr     r4, assoc_mask
3438bd22949SKevin Hilman	/* find maximum number on the way size */
3448bd22949SKevin Hilman	ands    r4, r4, r1, lsr #3
3458bd22949SKevin Hilman	/* find bit position of way size increment */
3468bd22949SKevin Hilman	clz     r5, r4
3478bd22949SKevin Hilman	ldr     r7, numset_mask
3488bd22949SKevin Hilman	/* extract max number of the index size*/
3498bd22949SKevin Hilman	ands    r7, r7, r1, lsr #13
3508bd22949SKevin Hilmanloop2:
3518bd22949SKevin Hilman	mov     r9, r4
3528bd22949SKevin Hilman	/* create working copy of max way size*/
3538bd22949SKevin Hilmanloop3:
3548bd22949SKevin Hilman	/* factor way and cache number into r11 */
3558bd22949SKevin Hilman	orr     r11, r10, r9, lsl r5
3568bd22949SKevin Hilman	/* factor index number into r11 */
3578bd22949SKevin Hilman	orr     r11, r11, r7, lsl r2
3588bd22949SKevin Hilman	/*clean & invalidate by set/way */
3598bd22949SKevin Hilman	mcr     p15, 0, r11, c7, c10, 2
3608bd22949SKevin Hilman	/* decrement the way*/
3618bd22949SKevin Hilman	subs    r9, r9, #1
3628bd22949SKevin Hilman	bge     loop3
3638bd22949SKevin Hilman	/*decrement the index */
3648bd22949SKevin Hilman	subs    r7, r7, #1
3658bd22949SKevin Hilman	bge     loop2
3668bd22949SKevin Hilmanskip:
3678bd22949SKevin Hilman	add     r10, r10, #2
3688bd22949SKevin Hilman	/* increment cache number */
3698bd22949SKevin Hilman	cmp     r3, r10
3708bd22949SKevin Hilman	bgt     loop1
3718bd22949SKevin Hilmanfinished:
3728bd22949SKevin Hilman	/*swith back to cache level 0 */
3738bd22949SKevin Hilman	mov     r10, #0
3748bd22949SKevin Hilman	/* select current cache level in cssr */
3758bd22949SKevin Hilman	mcr     p15, 2, r10, c0, c0, 0
3768bd22949SKevin Hilman	isb
3778bd22949SKevin Hilmanskip_l2_inval:
3788bd22949SKevin Hilman	/* Data memory barrier and Data sync barrier */
3798bd22949SKevin Hilman	mov     r1, #0
3808bd22949SKevin Hilman	mcr     p15, 0, r1, c7, c10, 4
3818bd22949SKevin Hilman	mcr     p15, 0, r1, c7, c10, 5
3828bd22949SKevin Hilman
3838bd22949SKevin Hilman	wfi                             @ wait for interrupt
3848bd22949SKevin Hilman	nop
3858bd22949SKevin Hilman	nop
3868bd22949SKevin Hilman	nop
3878bd22949SKevin Hilman	nop
3888bd22949SKevin Hilman	nop
3898bd22949SKevin Hilman	nop
3908bd22949SKevin Hilman	nop
3918bd22949SKevin Hilman	nop
3928bd22949SKevin Hilman	nop
3938bd22949SKevin Hilman	nop
3948bd22949SKevin Hilman	bl i_dll_wait
3958bd22949SKevin Hilman	/* restore regs and return */
3968bd22949SKevin Hilman	ldmfd   sp!, {r0-r12, pc}
3978bd22949SKevin Hilman
3988bd22949SKevin Hilmani_dll_wait:
3998bd22949SKevin Hilman	ldr     r4, clk_stabilize_delay
4008bd22949SKevin Hilman
4018bd22949SKevin Hilmani_dll_delay:
4028bd22949SKevin Hilman	subs    r4, r4, #0x1
4038bd22949SKevin Hilman	bne     i_dll_delay
4048bd22949SKevin Hilman	ldr     r4, sdrc_power
4058bd22949SKevin Hilman	ldr     r5, [r4]
4068bd22949SKevin Hilman	bic     r5, r5, #0x40
4078bd22949SKevin Hilman	str     r5, [r4]
4088bd22949SKevin Hilman	bx	lr
4098bd22949SKevin Hilmanpm_prepwstst_core:
4108bd22949SKevin Hilman	.word	PM_PREPWSTST_CORE_V
4118bd22949SKevin Hilmanpm_prepwstst_mpu:
4128bd22949SKevin Hilman	.word	PM_PREPWSTST_MPU_V
4138bd22949SKevin Hilmanpm_pwstctrl_mpu:
4148bd22949SKevin Hilman	.word	PM_PWSTCTRL_MPU_P
4158bd22949SKevin Hilmanscratchpad_base:
4168bd22949SKevin Hilman	.word	SCRATCHPAD_BASE_P
4178bd22949SKevin Hilmansdrc_power:
4188bd22949SKevin Hilman	.word SDRC_POWER_V
4198bd22949SKevin Hilmancontext_mem:
4208bd22949SKevin Hilman	.word	0x803E3E14
4218bd22949SKevin Hilmanclk_stabilize_delay:
4228bd22949SKevin Hilman	.word 0x000001FF
4238bd22949SKevin Hilmanassoc_mask:
4248bd22949SKevin Hilman	.word	0x3ff
4258bd22949SKevin Hilmannumset_mask:
4268bd22949SKevin Hilman	.word	0x7fff
4278bd22949SKevin Hilmanttbrbit_mask:
4288bd22949SKevin Hilman	.word	0xFFFFC000
4298bd22949SKevin Hilmantable_index_mask:
4308bd22949SKevin Hilman	.word	0xFFF00000
4318bd22949SKevin Hilmantable_entry:
4328bd22949SKevin Hilman	.word	0x00000C02
4338bd22949SKevin Hilmancache_pred_disable_mask:
4348bd22949SKevin Hilman	.word	0xFFFFE7FB
4358bd22949SKevin HilmanENTRY(omap34xx_cpu_suspend_sz)
4368bd22949SKevin Hilman	.word	. - omap34xx_cpu_suspend
437