/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
 * Copyright (c) 2018 Microsemi Corporation
 */

#include <asm/asm.h>
#include <asm/regdef.h>

    .set noreorder
    .extern     vcoreiii_tlb_init
    .extern     vcoreiii_ddr_init
#ifdef CONFIG_SOC_LUTON
    .extern     pll_init
#endif

LEAF(lowlevel_init)
	/*
	 * As we have no stack yet, we can assume the restricted
	 * luxury of the sX-registers without saving them
	 */

	/* Modify ra/s0 such we return to physical NOR location */
	li	t0, 0x0fffffff
	li	t1, CONFIG_SYS_TEXT_BASE
	and	s0, ra, t0
	add	s0, s0, t1

	jal	vcoreiii_tlb_init
	 nop

#ifdef CONFIG_SOC_LUTON
	jal	pll_init
	 nop
#endif

	/* Initialize DDR controller to enable stack/gd/heap */
0:
	jal	vcoreiii_ddr_init
	 nop
	bnez	v0, 0b		/* Retry on error */
	 nop

	jr	s0
	 nop
	END(lowlevel_init)
