|  | /* | 
|  | * Memory Setup stuff - taken from blob memsetup.S | 
|  | * | 
|  | * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and | 
|  | *		       Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl) | 
|  | * | 
|  | * Copyright (C) 2008 Ronetix Ilko Iliev (www.ronetix.at) | 
|  | * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 
|  | * | 
|  | * SPDX-License-Identifier:	GPL-2.0+ | 
|  | */ | 
|  |  | 
|  | #include <config.h> | 
|  | #include <asm/arch/hardware.h> | 
|  | #include <asm/arch/at91_pmc.h> | 
|  | #include <asm/arch/at91_wdt.h> | 
|  | #include <asm/arch/at91_pio.h> | 
|  | #include <asm/arch/at91_matrix.h> | 
|  | #include <asm/arch/at91sam9_sdramc.h> | 
|  | #include <asm/arch/at91sam9_smc.h> | 
|  | #include <asm/arch/at91_rstc.h> | 
|  | #ifdef CONFIG_ATMEL_LEGACY | 
|  | #include <asm/arch/at91sam9_matrix.h> | 
|  | #endif | 
|  | #ifndef CONFIG_SYS_MATRIX_EBICSA_VAL | 
|  | #define CONFIG_SYS_MATRIX_EBICSA_VAL CONFIG_SYS_MATRIX_EBI0CSA_VAL | 
|  | #endif | 
|  |  | 
|  | _TEXT_BASE: | 
|  | .word	CONFIG_SYS_TEXT_BASE | 
|  |  | 
|  | .globl lowlevel_init | 
|  | .type lowlevel_init,function | 
|  | lowlevel_init: | 
|  |  | 
|  | mov	r5, pc		/* r5 = POS1 + 4 current */ | 
|  | POS1: | 
|  | ldr	r0, =POS1	/* r0 = POS1 compile */ | 
|  | ldr	r2, _TEXT_BASE | 
|  | sub	r0, r0, r2	/* r0 = POS1-_TEXT_BASE (POS1 relative) */ | 
|  | sub	r5, r5, r0	/* r0 = CONFIG_SYS_TEXT_BASE-1 */ | 
|  | sub	r5, r5, #4	/* r1 = text base - current */ | 
|  |  | 
|  | /* memory control configuration 1 */ | 
|  | ldr	r0, =SMRDATA | 
|  | ldr	r2, =SMRDATA1 | 
|  | ldr	r1, _TEXT_BASE | 
|  | sub	r0, r0, r1 | 
|  | sub	r2, r2, r1 | 
|  | add	r0, r0, r5 | 
|  | add	r2, r2, r5 | 
|  | 0: | 
|  | /* the address */ | 
|  | ldr	r1, [r0], #4 | 
|  | /* the value */ | 
|  | ldr	r3, [r0], #4 | 
|  | str	r3, [r1] | 
|  | cmp	r2, r0 | 
|  | bne	0b | 
|  |  | 
|  | /* ---------------------------------------------------------------------------- | 
|  | * PMC Init Step 1. | 
|  | * ---------------------------------------------------------------------------- | 
|  | * - Check if the PLL is already initialized | 
|  | * ---------------------------------------------------------------------------- | 
|  | */ | 
|  | ldr	r1, =(AT91_ASM_PMC_MCKR) | 
|  | ldr	r0, [r1] | 
|  | and	r0, r0, #3 | 
|  | cmp	r0, #0 | 
|  | bne	PLL_setup_end | 
|  |  | 
|  | /* --------------------------------------------------------------------------- | 
|  | * - Enable the Main Oscillator | 
|  | * --------------------------------------------------------------------------- | 
|  | */ | 
|  | ldr	r1, =(AT91_ASM_PMC_MOR) | 
|  | ldr	r2, =(AT91_ASM_PMC_SR) | 
|  | /* Main oscillator Enable register PMC_MOR: */ | 
|  | ldr	r0, =CONFIG_SYS_MOR_VAL | 
|  | str	r0, [r1] | 
|  |  | 
|  | /* Reading the PMC Status to detect when the Main Oscillator is enabled */ | 
|  | mov	r4, #AT91_PMC_IXR_MOSCS | 
|  | MOSCS_Loop: | 
|  | ldr	r3, [r2] | 
|  | and	r3, r4, r3 | 
|  | cmp	r3, #AT91_PMC_IXR_MOSCS | 
|  | bne	MOSCS_Loop | 
|  |  | 
|  | /* ---------------------------------------------------------------------------- | 
|  | * PMC Init Step 2. | 
|  | * ---------------------------------------------------------------------------- | 
|  | * Setup PLLA | 
|  | * ---------------------------------------------------------------------------- | 
|  | */ | 
|  | ldr	r1, =(AT91_ASM_PMC_PLLAR) | 
|  | ldr	r0, =CONFIG_SYS_PLLAR_VAL | 
|  | str	r0, [r1] | 
|  |  | 
|  | /* Reading the PMC Status register to detect when the PLLA is locked */ | 
|  | mov	r4, #AT91_PMC_IXR_LOCKA | 
|  | MOSCS_Loop1: | 
|  | ldr	r3, [r2] | 
|  | and	r3, r4, r3 | 
|  | cmp	r3, #AT91_PMC_IXR_LOCKA | 
|  | bne	MOSCS_Loop1 | 
|  |  | 
|  | /* ---------------------------------------------------------------------------- | 
|  | * PMC Init Step 3. | 
|  | * ---------------------------------------------------------------------------- | 
|  | * - Switch on the Main Oscillator | 
|  | * ---------------------------------------------------------------------------- | 
|  | */ | 
|  | ldr	r1, =(AT91_ASM_PMC_MCKR) | 
|  |  | 
|  | /* -Master Clock Controller register PMC_MCKR */ | 
|  | ldr	r0, =CONFIG_SYS_MCKR1_VAL | 
|  | str	r0, [r1] | 
|  |  | 
|  | /* Reading the PMC Status to detect when the Master clock is ready */ | 
|  | mov	r4, #AT91_PMC_IXR_MCKRDY | 
|  | MCKRDY_Loop: | 
|  | ldr	r3, [r2] | 
|  | and	r3, r4, r3 | 
|  | cmp	r3, #AT91_PMC_IXR_MCKRDY | 
|  | bne	MCKRDY_Loop | 
|  |  | 
|  | ldr	r0, =CONFIG_SYS_MCKR2_VAL | 
|  | str	r0, [r1] | 
|  |  | 
|  | /* Reading the PMC Status to detect when the Master clock is ready */ | 
|  | mov	r4, #AT91_PMC_IXR_MCKRDY | 
|  | MCKRDY_Loop1: | 
|  | ldr	r3, [r2] | 
|  | and	r3, r4, r3 | 
|  | cmp	r3, #AT91_PMC_IXR_MCKRDY | 
|  | bne	MCKRDY_Loop1 | 
|  | PLL_setup_end: | 
|  |  | 
|  | /* ---------------------------------------------------------------------------- | 
|  | * - memory control configuration 2 | 
|  | * ---------------------------------------------------------------------------- | 
|  | */ | 
|  | ldr	r0, =(AT91_ASM_SDRAMC_TR) | 
|  | ldr	r1, [r0] | 
|  | cmp	r1, #0 | 
|  | bne	SDRAM_setup_end | 
|  |  | 
|  | ldr	r0, =SMRDATA1 | 
|  | ldr	r2, =SMRDATA2 | 
|  | ldr	r1, _TEXT_BASE | 
|  | sub	r0, r0, r1 | 
|  | sub	r2, r2, r1 | 
|  | add	r0, r0, r5 | 
|  | add	r2, r2, r5 | 
|  | 2: | 
|  | /* the address */ | 
|  | ldr	r1, [r0], #4 | 
|  | /* the value */ | 
|  | ldr	r3, [r0], #4 | 
|  | str	r3, [r1] | 
|  | cmp	r2, r0 | 
|  | bne	2b | 
|  |  | 
|  | SDRAM_setup_end: | 
|  | /* everything is fine now */ | 
|  | mov	pc, lr | 
|  |  | 
|  | .ltorg | 
|  |  | 
|  | SMRDATA: | 
|  | .word AT91_ASM_WDT_MR | 
|  | .word CONFIG_SYS_WDTC_WDMR_VAL | 
|  | /* configure PIOx as EBI0 D[16-31] */ | 
|  | #if defined(CONFIG_AT91SAM9263) | 
|  | .word AT91_ASM_PIOD_PDR | 
|  | .word CONFIG_SYS_PIOD_PDR_VAL1 | 
|  | .word AT91_ASM_PIOD_PUDR | 
|  | .word CONFIG_SYS_PIOD_PPUDR_VAL | 
|  | .word AT91_ASM_PIOD_ASR | 
|  | .word CONFIG_SYS_PIOD_PPUDR_VAL | 
|  | #elif defined(CONFIG_AT91SAM9260) || defined(CONFIG_AT91SAM9261) \ | 
|  | || defined(CONFIG_AT91SAM9G20) | 
|  | .word AT91_ASM_PIOC_PDR | 
|  | .word CONFIG_SYS_PIOC_PDR_VAL1 | 
|  | .word AT91_ASM_PIOC_PUDR | 
|  | .word CONFIG_SYS_PIOC_PPUDR_VAL | 
|  | #endif | 
|  | .word AT91_ASM_MATRIX_CSA0 | 
|  | .word CONFIG_SYS_MATRIX_EBICSA_VAL | 
|  |  | 
|  | /* flash */ | 
|  | .word AT91_ASM_SMC_MODE0 | 
|  | .word CONFIG_SYS_SMC0_MODE0_VAL | 
|  |  | 
|  | .word AT91_ASM_SMC_CYCLE0 | 
|  | .word CONFIG_SYS_SMC0_CYCLE0_VAL | 
|  |  | 
|  | .word AT91_ASM_SMC_PULSE0 | 
|  | .word CONFIG_SYS_SMC0_PULSE0_VAL | 
|  |  | 
|  | .word AT91_ASM_SMC_SETUP0 | 
|  | .word CONFIG_SYS_SMC0_SETUP0_VAL | 
|  |  | 
|  | SMRDATA1: | 
|  | .word AT91_ASM_SDRAMC_MR | 
|  | .word CONFIG_SYS_SDRC_MR_VAL1 | 
|  | .word AT91_ASM_SDRAMC_TR | 
|  | .word CONFIG_SYS_SDRC_TR_VAL1 | 
|  | .word AT91_ASM_SDRAMC_CR | 
|  | .word CONFIG_SYS_SDRC_CR_VAL | 
|  | .word AT91_ASM_SDRAMC_MDR | 
|  | .word CONFIG_SYS_SDRC_MDR_VAL | 
|  | .word AT91_ASM_SDRAMC_MR | 
|  | .word CONFIG_SYS_SDRC_MR_VAL2 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL1 | 
|  | .word AT91_ASM_SDRAMC_MR | 
|  | .word CONFIG_SYS_SDRC_MR_VAL3 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL2 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL3 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL4 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL5 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL6 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL7 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL8 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL9 | 
|  | .word AT91_ASM_SDRAMC_MR | 
|  | .word CONFIG_SYS_SDRC_MR_VAL4 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL10 | 
|  | .word AT91_ASM_SDRAMC_MR | 
|  | .word CONFIG_SYS_SDRC_MR_VAL5 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL11 | 
|  | .word AT91_ASM_SDRAMC_TR | 
|  | .word CONFIG_SYS_SDRC_TR_VAL2 | 
|  | .word CONFIG_SYS_SDRAM_BASE | 
|  | .word CONFIG_SYS_SDRAM_VAL12 | 
|  | /* User reset enable*/ | 
|  | .word AT91_ASM_RSTC_MR | 
|  | .word CONFIG_SYS_RSTC_RMR_VAL | 
|  | #ifdef CONFIG_SYS_MATRIX_MCFG_REMAP | 
|  | /* MATRIX_MCFG - REMAP all masters */ | 
|  | .word AT91_ASM_MATRIX_MCFG | 
|  | .word 0x1FF | 
|  | #endif | 
|  | SMRDATA2: | 
|  | .word 0 |