blob: 3384e5377a7e0f0f379d58d18a3147fd2b8c62ae (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
// 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;
}
|