162011840SMasahiro Yamada /* 262011840SMasahiro Yamada * Copyright (C) 2013 Atmel Corporation 362011840SMasahiro Yamada * Bo Shen <voice.shen@atmel.com> 462011840SMasahiro Yamada * 562011840SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 662011840SMasahiro Yamada */ 762011840SMasahiro Yamada 862011840SMasahiro Yamada #include <common.h> 962011840SMasahiro Yamada #include <asm/io.h> 1062011840SMasahiro Yamada #include <asm/arch/at91_common.h> 1162011840SMasahiro Yamada #include <asm/arch/at91_pit.h> 1262011840SMasahiro Yamada #include <asm/arch/at91_pmc.h> 1362011840SMasahiro Yamada #include <asm/arch/at91_rstc.h> 1462011840SMasahiro Yamada #include <asm/arch/at91_wdt.h> 1562011840SMasahiro Yamada #include <asm/arch/clk.h> 1662011840SMasahiro Yamada #include <spl.h> 1762011840SMasahiro Yamada 1862011840SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 1962011840SMasahiro Yamada 2062011840SMasahiro Yamada static void switch_to_main_crystal_osc(void) 2162011840SMasahiro Yamada { 2262011840SMasahiro Yamada struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC; 2362011840SMasahiro Yamada u32 tmp; 2462011840SMasahiro Yamada 2562011840SMasahiro Yamada tmp = readl(&pmc->mor); 2662011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_OSCOUNT(0xff); 2762011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_KEY(0xff); 2862011840SMasahiro Yamada tmp |= AT91_PMC_MOR_MOSCEN; 2962011840SMasahiro Yamada tmp |= AT91_PMC_MOR_OSCOUNT(8); 3062011840SMasahiro Yamada tmp |= AT91_PMC_MOR_KEY(0x37); 3162011840SMasahiro Yamada writel(tmp, &pmc->mor); 3262011840SMasahiro Yamada while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCS)) 3362011840SMasahiro Yamada ; 3462011840SMasahiro Yamada 3562011840SMasahiro Yamada tmp = readl(&pmc->mor); 3662011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_OSCBYPASS; 3762011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_KEY(0xff); 3862011840SMasahiro Yamada tmp |= AT91_PMC_MOR_KEY(0x37); 3962011840SMasahiro Yamada writel(tmp, &pmc->mor); 4062011840SMasahiro Yamada 4162011840SMasahiro Yamada tmp = readl(&pmc->mor); 4262011840SMasahiro Yamada tmp |= AT91_PMC_MOR_MOSCSEL; 4362011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_KEY(0xff); 4462011840SMasahiro Yamada tmp |= AT91_PMC_MOR_KEY(0x37); 4562011840SMasahiro Yamada writel(tmp, &pmc->mor); 4662011840SMasahiro Yamada 4762011840SMasahiro Yamada while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCSELS)) 4862011840SMasahiro Yamada ; 4962011840SMasahiro Yamada 5062011840SMasahiro Yamada /* Wait until MAINRDY field is set to make sure main clock is stable */ 5162011840SMasahiro Yamada while (!(readl(&pmc->mcfr) & AT91_PMC_MAINRDY)) 5262011840SMasahiro Yamada ; 5362011840SMasahiro Yamada 5462011840SMasahiro Yamada #ifndef CONFIG_SAMA5D4 5562011840SMasahiro Yamada tmp = readl(&pmc->mor); 5662011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_MOSCRCEN; 5762011840SMasahiro Yamada tmp &= ~AT91_PMC_MOR_KEY(0xff); 5862011840SMasahiro Yamada tmp |= AT91_PMC_MOR_KEY(0x37); 5962011840SMasahiro Yamada writel(tmp, &pmc->mor); 6062011840SMasahiro Yamada #endif 6162011840SMasahiro Yamada } 6262011840SMasahiro Yamada 6362011840SMasahiro Yamada __weak void matrix_init(void) 6462011840SMasahiro Yamada { 6562011840SMasahiro Yamada /* This only be used for sama5d4 soc now */ 6662011840SMasahiro Yamada } 6762011840SMasahiro Yamada 6862011840SMasahiro Yamada __weak void redirect_int_from_saic_to_aic(void) 6962011840SMasahiro Yamada { 7062011840SMasahiro Yamada /* This only be used for sama5d4 soc now */ 7162011840SMasahiro Yamada } 7262011840SMasahiro Yamada 73e755d543STom Rini /* empty stub to satisfy current lowlevel_init, can be removed any time */ 7462011840SMasahiro Yamada void s_init(void) 7562011840SMasahiro Yamada { 76e755d543STom Rini } 77e755d543STom Rini 78e755d543STom Rini void board_init_f(ulong dummy) 79e755d543STom Rini { 8062011840SMasahiro Yamada switch_to_main_crystal_osc(); 8162011840SMasahiro Yamada 82*f7cf291aSSamuel Mescoff #ifdef CONFIG_SAMA5D2 83*f7cf291aSSamuel Mescoff configure_2nd_sram_as_l2_cache(); 84*f7cf291aSSamuel Mescoff #endif 85*f7cf291aSSamuel Mescoff 8662011840SMasahiro Yamada /* disable watchdog */ 8762011840SMasahiro Yamada at91_disable_wdt(); 8862011840SMasahiro Yamada 8962011840SMasahiro Yamada /* PMC configuration */ 9062011840SMasahiro Yamada at91_pmc_init(); 9162011840SMasahiro Yamada 9262011840SMasahiro Yamada at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK); 9362011840SMasahiro Yamada 9462011840SMasahiro Yamada matrix_init(); 9562011840SMasahiro Yamada 9662011840SMasahiro Yamada redirect_int_from_saic_to_aic(); 9762011840SMasahiro Yamada 9862011840SMasahiro Yamada timer_init(); 9962011840SMasahiro Yamada 10062011840SMasahiro Yamada board_early_init_f(); 10162011840SMasahiro Yamada 10262011840SMasahiro Yamada preloader_console_init(); 10362011840SMasahiro Yamada 10462011840SMasahiro Yamada mem_init(); 10562011840SMasahiro Yamada } 106