mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-08-16 04:07:00 +02:00
Add initial support for Marvell PXA1908. The SoC has 4 Cortex-A53 cores, a GC7000UL GPU and a variety of peripheral controllers. Signed-off-by: Duje Mihanović <duje.mihanovic@skole.hr> Reviewed-by: Stefan Roese <sr@denx.de>
85 lines
1.7 KiB
C
85 lines
1.7 KiB
C
// 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;
|
|
}
|