xref: /openbmc/u-boot/arch/arm/mach-at91/spl_atmel.c (revision 620118403e1521b4c883848a84d2fb68e3fa1aa0)
1*62011840SMasahiro Yamada /*
2*62011840SMasahiro Yamada  * Copyright (C) 2013 Atmel Corporation
3*62011840SMasahiro Yamada  *		      Bo Shen <voice.shen@atmel.com>
4*62011840SMasahiro Yamada  *
5*62011840SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
6*62011840SMasahiro Yamada  */
7*62011840SMasahiro Yamada 
8*62011840SMasahiro Yamada #include <common.h>
9*62011840SMasahiro Yamada #include <asm/io.h>
10*62011840SMasahiro Yamada #include <asm/arch/at91_common.h>
11*62011840SMasahiro Yamada #include <asm/arch/at91_pit.h>
12*62011840SMasahiro Yamada #include <asm/arch/at91_pmc.h>
13*62011840SMasahiro Yamada #include <asm/arch/at91_rstc.h>
14*62011840SMasahiro Yamada #include <asm/arch/at91_wdt.h>
15*62011840SMasahiro Yamada #include <asm/arch/clk.h>
16*62011840SMasahiro Yamada #include <spl.h>
17*62011840SMasahiro Yamada 
18*62011840SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR;
19*62011840SMasahiro Yamada 
20*62011840SMasahiro Yamada static void switch_to_main_crystal_osc(void)
21*62011840SMasahiro Yamada {
22*62011840SMasahiro Yamada 	struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
23*62011840SMasahiro Yamada 	u32 tmp;
24*62011840SMasahiro Yamada 
25*62011840SMasahiro Yamada 	tmp = readl(&pmc->mor);
26*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_OSCOUNT(0xff);
27*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_KEY(0xff);
28*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_MOSCEN;
29*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_OSCOUNT(8);
30*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_KEY(0x37);
31*62011840SMasahiro Yamada 	writel(tmp, &pmc->mor);
32*62011840SMasahiro Yamada 	while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCS))
33*62011840SMasahiro Yamada 		;
34*62011840SMasahiro Yamada 
35*62011840SMasahiro Yamada 	tmp = readl(&pmc->mor);
36*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_OSCBYPASS;
37*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_KEY(0xff);
38*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_KEY(0x37);
39*62011840SMasahiro Yamada 	writel(tmp, &pmc->mor);
40*62011840SMasahiro Yamada 
41*62011840SMasahiro Yamada 	tmp = readl(&pmc->mor);
42*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_MOSCSEL;
43*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_KEY(0xff);
44*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_KEY(0x37);
45*62011840SMasahiro Yamada 	writel(tmp, &pmc->mor);
46*62011840SMasahiro Yamada 
47*62011840SMasahiro Yamada 	while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCSELS))
48*62011840SMasahiro Yamada 		;
49*62011840SMasahiro Yamada 
50*62011840SMasahiro Yamada 	/* Wait until MAINRDY field is set to make sure main clock is stable */
51*62011840SMasahiro Yamada 	while (!(readl(&pmc->mcfr) & AT91_PMC_MAINRDY))
52*62011840SMasahiro Yamada 		;
53*62011840SMasahiro Yamada 
54*62011840SMasahiro Yamada #ifndef CONFIG_SAMA5D4
55*62011840SMasahiro Yamada 	tmp = readl(&pmc->mor);
56*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_MOSCRCEN;
57*62011840SMasahiro Yamada 	tmp &= ~AT91_PMC_MOR_KEY(0xff);
58*62011840SMasahiro Yamada 	tmp |= AT91_PMC_MOR_KEY(0x37);
59*62011840SMasahiro Yamada 	writel(tmp, &pmc->mor);
60*62011840SMasahiro Yamada #endif
61*62011840SMasahiro Yamada }
62*62011840SMasahiro Yamada 
63*62011840SMasahiro Yamada __weak void matrix_init(void)
64*62011840SMasahiro Yamada {
65*62011840SMasahiro Yamada 	/* This only be used for sama5d4 soc now */
66*62011840SMasahiro Yamada }
67*62011840SMasahiro Yamada 
68*62011840SMasahiro Yamada __weak void redirect_int_from_saic_to_aic(void)
69*62011840SMasahiro Yamada {
70*62011840SMasahiro Yamada 	/* This only be used for sama5d4 soc now */
71*62011840SMasahiro Yamada }
72*62011840SMasahiro Yamada 
73*62011840SMasahiro Yamada void s_init(void)
74*62011840SMasahiro Yamada {
75*62011840SMasahiro Yamada 	switch_to_main_crystal_osc();
76*62011840SMasahiro Yamada 
77*62011840SMasahiro Yamada 	/* disable watchdog */
78*62011840SMasahiro Yamada 	at91_disable_wdt();
79*62011840SMasahiro Yamada 
80*62011840SMasahiro Yamada 	/* PMC configuration */
81*62011840SMasahiro Yamada 	at91_pmc_init();
82*62011840SMasahiro Yamada 
83*62011840SMasahiro Yamada 	at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK);
84*62011840SMasahiro Yamada 
85*62011840SMasahiro Yamada 	matrix_init();
86*62011840SMasahiro Yamada 
87*62011840SMasahiro Yamada 	redirect_int_from_saic_to_aic();
88*62011840SMasahiro Yamada 
89*62011840SMasahiro Yamada 	timer_init();
90*62011840SMasahiro Yamada 
91*62011840SMasahiro Yamada 	board_early_init_f();
92*62011840SMasahiro Yamada 
93*62011840SMasahiro Yamada 	preloader_console_init();
94*62011840SMasahiro Yamada 
95*62011840SMasahiro Yamada 	mem_init();
96*62011840SMasahiro Yamada }
97