aboutsummaryrefslogtreecommitdiff
path: root/src/mainboard/cubietech/cubieboard/bootblock.c
blob: 6e8b751c73e3a64a474037f10a454833711c4cd5 (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
/*
 * Minimal bootblock for Cubieboard
 * It sets up CPU clock, and enables the bootblock console.
 *
 * Copyright (C) 2013  Alexandru Gagniuc <mr.nuke.me@gmail.com>
 * Subject to the GNU GPL v2, or (at your option) any later version.
 */

#include <arch/io.h>
#include <uart.h>
#include <console/console.h>
#include <cpu/allwinner/a10/gpio.h>
#include <cpu/allwinner/a10/clock.h>

#define CPU_AHB_APB0_DEFAULT 		\
	 CPU_CLK_SRC_OSC24M	 	\
	 | APB0_DIV_1			\
	 | AHB_DIV_1			\
	 | AXI_DIV_1

#define GPB22_UART0_TX_FUNC		2
#define GPB23_UART0_RX_FUNC		2

static void cubieboard_set_sys_clock(void)
{
	u32 reg32;
	struct a10_ccm *ccm = (void *)A1X_CCM_BASE;

	/* Switch CPU clock to main oscillator */
	write32(CPU_AHB_APB0_DEFAULT, &ccm->cpu_ahb_apb0_cfg);

	/* Configure the PLL1. The value is the same one used by u-boot */
	write32(0xa1005000, &ccm->pll1_cfg);

	/* FIXME: Delay to wait for PLL to lock */
	u32 wait = 1000;
	while (--wait);

	/* Switch CPU to PLL clock */
	reg32 = read32(&ccm->cpu_ahb_apb0_cfg);
	reg32 &= ~CPU_CLK_SRC_MASK;
	reg32 |= CPU_CLK_SRC_PLL1;
	write32(reg32, &ccm->cpu_ahb_apb0_cfg);
}

static void cubieboard_setup_clocks(void)
{
	struct a10_ccm *ccm = (void *)A1X_CCM_BASE;

	cubieboard_set_sys_clock();
	/* Configure the clock source for APB1. This drives our UART */
	write32(APB1_CLK_SRC_OSC24M | APB1_RAT_N(0) | APB1_RAT_M(0),
		&ccm->apb1_clk_div_cfg);

}

static void cubieboard_setup_gpios(void)
{
	/* Mux UART pins */
	gpio_set_func(GPB, 22, GPB22_UART0_TX_FUNC);
	gpio_set_func(GPB, 23, GPB23_UART0_RX_FUNC);
}

static void cubieboard_enable_uart(void)
{
	u32 reg32;
	struct a10_ccm *ccm = (void *)A1X_CCM_BASE;
	/* Enable clock to UART0 */
	reg32 = read32(&ccm->apb1_gate);
	reg32 |= APB1_GATE_UART(0);
	write32(reg32, &ccm->apb1_gate);
}

void bootblock_mainboard_init(void);
void bootblock_mainboard_init(void)
{
	cubieboard_setup_clocks();
	cubieboard_setup_gpios();
	cubieboard_enable_uart();
}