blob: 3384e5377a7e0f0f379d58d18a3147fd2b8c62ae [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (c) 2024
* Duje Mihanović <duje.mihanovic@skole.hr>
*/
#include <errno.h>
#include <init.h>
#include <fdt_support.h>
#include <asm/io.h>
#include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR;
/* Timer constants */
#define APBC_COUNTER_CLK_SEL 0xd4015064
#define COUNTER_BASE 0xd4101000
#define COUNTER_EN BIT(0)
#define COUNTER_HALT_ON_DEBUG BIT(1)
int timer_init(void)
{
u32 tmp = readl(APBC_COUNTER_CLK_SEL);
if ((tmp >> 16) != 0x319)
return -1;
/* Set timer frequency to 26MHz */
writel(tmp | 1, APBC_COUNTER_CLK_SEL);
writel(COUNTER_EN | COUNTER_HALT_ON_DEBUG, COUNTER_BASE);
gd->arch.timer_rate_hz = 26000000;
return 0;
}
int board_init(void)
{
return 0;
}
int dram_init(void)
{
if (fdtdec_setup_mem_size_base() != 0)
puts("fdtdec_setup_mem_size_base() has failed\n");
return 0;
}
#ifndef CONFIG_SYSRESET
void reset_cpu(void)
{
}
#endif
/* Stolen from arch/arm/mach-snapdragon/board.c */
int board_fdt_blob_setup(void **fdtp)
{
struct fdt_header *fdt;
bool internal_valid, external_valid;
int ret = 0;
fdt = (struct fdt_header *)get_prev_bl_fdt_addr();
external_valid = fdt && !fdt_check_header(fdt);
internal_valid = !fdt_check_header(*fdtp);
/*
* There is no point returning an error here, U-Boot can't do anything useful in this situation.
* Bail out while we can still print a useful error message.
*/
if (!internal_valid && !external_valid)
panic("Internal FDT is invalid and no external FDT was provided! (fdt=%#llx)\n",
(phys_addr_t)fdt);
if (internal_valid) {
debug("Using built in FDT\n");
ret = -EEXIST;
} else {
debug("Using external FDT\n");
/* So we can use it before returning */
*fdtp = fdt;
}
return ret;
}