2 * Copyright (C) 2013 Atmel Corporation
3 * Bo Shen <voice.shen@atmel.com>
5 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/arch/at91_common.h>
11 #include <asm/arch/at91_pit.h>
12 #include <asm/arch/at91_pmc.h>
13 #include <asm/arch/at91_rstc.h>
14 #include <asm/arch/at91_wdt.h>
15 #include <asm/arch/clk.h>
18 DECLARE_GLOBAL_DATA_PTR
;
20 static void switch_to_main_crystal_osc(void)
22 struct at91_pmc
*pmc
= (struct at91_pmc
*)ATMEL_BASE_PMC
;
25 tmp
= readl(&pmc
->mor
);
26 tmp
&= ~AT91_PMC_MOR_OSCOUNT(0xff);
27 tmp
&= ~AT91_PMC_MOR_KEY(0xff);
28 tmp
|= AT91_PMC_MOR_MOSCEN
;
29 tmp
|= AT91_PMC_MOR_OSCOUNT(8);
30 tmp
|= AT91_PMC_MOR_KEY(0x37);
31 writel(tmp
, &pmc
->mor
);
32 while (!(readl(&pmc
->sr
) & AT91_PMC_IXR_MOSCS
))
35 tmp
= readl(&pmc
->mor
);
36 tmp
&= ~AT91_PMC_MOR_OSCBYPASS
;
37 tmp
&= ~AT91_PMC_MOR_KEY(0xff);
38 tmp
|= AT91_PMC_MOR_KEY(0x37);
39 writel(tmp
, &pmc
->mor
);
41 tmp
= readl(&pmc
->mor
);
42 tmp
|= AT91_PMC_MOR_MOSCSEL
;
43 tmp
&= ~AT91_PMC_MOR_KEY(0xff);
44 tmp
|= AT91_PMC_MOR_KEY(0x37);
45 writel(tmp
, &pmc
->mor
);
47 while (!(readl(&pmc
->sr
) & AT91_PMC_IXR_MOSCSELS
))
50 /* Wait until MAINRDY field is set to make sure main clock is stable */
51 while (!(readl(&pmc
->mcfr
) & AT91_PMC_MAINRDY
))
54 #ifndef CONFIG_SAMA5D4
55 tmp
= readl(&pmc
->mor
);
56 tmp
&= ~AT91_PMC_MOR_MOSCRCEN
;
57 tmp
&= ~AT91_PMC_MOR_KEY(0xff);
58 tmp
|= AT91_PMC_MOR_KEY(0x37);
59 writel(tmp
, &pmc
->mor
);
63 __weak
void matrix_init(void)
65 /* This only be used for sama5d4 soc now */
68 __weak
void redirect_int_from_saic_to_aic(void)
70 /* This only be used for sama5d4 soc now */
75 switch_to_main_crystal_osc();
77 /* disable watchdog */
80 /* PMC configuration */
83 at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK
);
87 redirect_int_from_saic_to_aic();
93 preloader_console_init();