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