Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0+ */
  2/*
  3 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
  4 *		http://www.samsung.com
  5 *
  6 * Exynos low-level resume code
  7 */
  8
  9#include <linux/linkage.h>
 10#include <asm/asm-offsets.h>
 11#include <asm/hardware/cache-l2x0.h>
 12#include "smc.h"
 13
 14#define CPU_MASK	0xff0ffff0
 15#define CPU_CORTEX_A9	0x410fc090
 16
 17	.text
 18	.align
 19
 20	/*
 21	 * sleep magic, to allow the bootloader to check for an valid
 22	 * image to resume to. Must be the first word before the
 23	 * exynos_cpu_resume entry.
 24	 */
 25
 26	.word	0x2bedf00d
 27
 28	/*
 29	 * exynos_cpu_resume
 30	 *
 31	 * resume code entry for bootloader to call
 32	 */
 33
 34ENTRY(exynos_cpu_resume)
 35#ifdef CONFIG_CACHE_L2X0
 36	mrc	p15, 0, r0, c0, c0, 0
 37	ldr	r1, =CPU_MASK
 38	and	r0, r0, r1
 39	ldr	r1, =CPU_CORTEX_A9
 40	cmp	r0, r1
 41	bleq	l2c310_early_resume
 42#endif
 43	b	cpu_resume
 44ENDPROC(exynos_cpu_resume)
 45
 46	.align
 47	.arch armv7-a
 48	.arch_extension sec
 49ENTRY(exynos_cpu_resume_ns)
 50	mrc	p15, 0, r0, c0, c0, 0
 51	ldr	r1, =CPU_MASK
 52	and	r0, r0, r1
 53	ldr	r1, =CPU_CORTEX_A9
 54	cmp	r0, r1
 55	bne	skip_cp15
 56
 57	adr	r0, _cp15_save_power
 58	ldr	r1, [r0]
 59	ldr	r1, [r0, r1]
 60	adr	r0, _cp15_save_diag
 61	ldr	r2, [r0]
 62	ldr	r2, [r0, r2]
 63	mov	r0, #SMC_CMD_C15RESUME
 64	dsb
 65	smc	#0
 66#ifdef CONFIG_CACHE_L2X0
 67	adr	r0, 1f
 68	ldr	r2, [r0]
 69	add	r0, r2, r0
 70
 71	/* Check that the address has been initialised. */
 72	ldr	r1, [r0, #L2X0_R_PHY_BASE]
 73	teq	r1, #0
 74	beq	skip_l2x0
 75
 76	/* Check if controller has been enabled. */
 77	ldr	r2, [r1, #L2X0_CTRL]
 78	tst	r2, #0x1
 79	bne	skip_l2x0
 80
 81	ldr	r1, [r0, #L2X0_R_TAG_LATENCY]
 82	ldr	r2, [r0, #L2X0_R_DATA_LATENCY]
 83	ldr	r3, [r0, #L2X0_R_PREFETCH_CTRL]
 84	mov	r0, #SMC_CMD_L2X0SETUP1
 85	smc	#0
 86
 87	/* Reload saved regs pointer because smc corrupts registers. */
 88	adr	r0, 1f
 89	ldr	r2, [r0]
 90	add	r0, r2, r0
 91
 92	ldr	r1, [r0, #L2X0_R_PWR_CTRL]
 93	ldr	r2, [r0, #L2X0_R_AUX_CTRL]
 94	mov	r0, #SMC_CMD_L2X0SETUP2
 95	smc	#0
 96
 97	mov	r0, #SMC_CMD_L2X0INVALL
 98	smc	#0
 99
100	mov	r1, #1
101	mov	r0, #SMC_CMD_L2X0CTRL
102	smc	#0
103skip_l2x0:
104#endif /* CONFIG_CACHE_L2X0 */
105skip_cp15:
106	b	cpu_resume
107ENDPROC(exynos_cpu_resume_ns)
108
109	.align
110_cp15_save_power:
111	.long	cp15_save_power - .
112_cp15_save_diag:
113	.long	cp15_save_diag - .
114#ifdef CONFIG_CACHE_L2X0
1151:	.long	l2x0_saved_regs - .
116#endif /* CONFIG_CACHE_L2X0 */
117
118	.data
119	.align	2
120	.globl cp15_save_diag
121cp15_save_diag:
122	.long	0	@ cp15 diagnostic
123	.globl cp15_save_power
124cp15_save_power:
125	.long	0	@ cp15 power control