1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright (C) 2012 Nobuhiro Iwamatsu <nobuhiro.Iwamatsu.yj@renesas.com>
4 * Copyright (C) 2012 Renesas Solutions Corp.
5 */
6
7#include <config.h>
8#include <linux/linkage.h>
9
10ENTRY(lowlevel_init)
11	ldr		r0, =MERAM_BASE
12	mov		r1, #0x0
13	str		r1, [r0]
14
15	mrc		p15, 0, r0, c0, c0, 5
16	ands	r0, r0, #0xF
17	beq		lowlevel_init__
18	b		wait_interrupt
19
20	.pool
21	.align 4
22
23wait_interrupt:
24#ifdef ICCICR
25	ldr     r1, =ICCICR
26	mov     r2, #0x0
27	str     r2, [r1]
28	mov     r2, #0xF0
29	adds    r1, r1, #4 /* ICCPMR */
30	str     r2, [r1]
31	ldr     r1, =ICCICR
32	mov     r2, #0x1
33	str     r2, [r1]
34#endif
35
36wait_loop:
37	.long	0xE320F003 /* wfi */
38
39	ldr		r2, [r1, #0xC]
40	str		r2, [r1, #0x10]
41
42	ldr		r0, =MERAM_BASE
43	ldr		r2, [r0]
44	cmp		r2, #0
45	movne	pc, r2
46
47	b		wait_loop
48
49wait_loop_end:
50	.pool
51	.align 4
52
53lowlevel_init__:
54
55	mov r0, #0x200000
56
57loop0:
58	subs r0, r0, #1
59	bne  loop0
60
61	ldr sp, MERAM_STACK
62	b s_init
63
64	.pool
65	.align 4
66
67ENDPROC(lowlevel_init)
68	.ltorg
69
70MERAM_STACK:
71	.word LOW_LEVEL_MERAM_STACK
72