summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mmp/board.c
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;
}