Newer
Older
barebox / board / pm9263 / lowlevel_init.S
/*
 * Board specific setup info
 *
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <asm/arch/hardware.h>

#define SDRAM 0x20000000		/* address of the SDRAM */

/* values */

/* clocks */
#define MOR_VAL 0x00002001		/* CKGR_MOR - enable main osc. */
#define PLLAR_VAL (0x2000BF00 | ((MASTER_PLL_MUL - 1)<< 16) | (MASTER_PLL_DIV))
/* #define PLLAR_VAL 0x200CBF01 */	/* 239.616000 MHz for PCK */
#define PLLBR_VAL 0x10483E0E		/* 48.054857 MHz for USB) */

#define MCKR1_VAL 0x00000100		/* PCK/2 = MCK Master Clock from PLLA*/
#define MCKR2_VAL 0x00000102		/* PCK/2 = MCK Master Clock from PLLA*/

#define WDTC_WDMR_VAL 0x3fff8fff	/* disable watchdog */
#define PIOD_PDR_VAL1 0xFFFF0000	/* define PDC[31:16] as DATA[31:16] */
#define PIOD_PPUDR_VAL 0xFFFF0000	/* no pull-up for D[31:16] */
#define MATRIX_EBI0CSA_VAL 0x0001010A	/* EBI0_CSA, CS1 SDRAM, CS3 NAND Flash, 3.3V memories */
/*#define MATRIX_EBI1CSA_VAL 0x00000000	/* EBI1_CSA, 1.8V memory*/
#define MATRIX_EBI1CSA_VAL 0x00010100	/* EBI1_CSA, 3.3v, no pull-ups*/

/* SDRAM */
#define SDRC_MR_VAL1 0			/* SDRAMC_MR Mode register */
#define SDRC_TR_VAL1 0x13C		/* SDRAMC_TR - Refresh Timer register*/
/*#define SDRC_CR_VAL 0x85237279*/	/* SDRAMC_CR - Configuration register*/
/*#define SDRC_CR_VAL 0x85227259  CL2 */
#define SDRC_CR_VAL   0x85227279 /*CL3*/
#define SDRC_MDR_VAL 0			/*  Memory Device Register -> SDRAM */
#define SDRC_MR_VAL2 0x00000002		/*  SDRAMC_MR */
#define SDRAM_VAL1 0			/*  SDRAM_BASE */
#define SDRC_MR_VAL3 4			/*  SDRC_MR */
#define SDRAM_VAL2 0			/*  SDRAM_BASE */
#define SDRAM_VAL3 0			/*  SDRAM_BASE */
#define SDRAM_VAL4 0			/*  SDRAM_BASE */
#define SDRAM_VAL5 0			/*  SDRAM_BASE */
#define SDRAM_VAL6 0			/*  SDRAM_BASE */
#define SDRAM_VAL7 0			/*  SDRAM_BASE */
#define SDRAM_VAL8 0			/*  SDRAM_BASE */
#define SDRAM_VAL9 0			/*  SDRAM_BASE */
#define SDRC_MR_VAL4 3			/*  SDRC_MR */
#define SDRAM_VAL10 0			/* SDRAM_BASE */
#define SDRC_MR_VAL5 0			/*  SDRC_MR */
#define SDRAM_VAL11 0			/*  SDRAM_BASE */
#define SDRC_TR_VAL2 1200		/* SDRAM_TR */
#define SDRAM_VAL12 0			/*  SDRAM_BASE */

/* setup CS0 (NOR Flash) - 16-bit, 15 WS */
#define SMC0_SETUP0_VAL 0x0A0A0A0A	/*  SMC_SETUP */
#define SMC0_PULSE0_VAL 0x0B0B0B0B	/*  SMC_PULSE */
#define SMC0_CYCLE0_VAL 0x00160016	/*  SMC_CYCLE */
#define SMC0_CTRL0_VAL 0x00161003	/*  SMC_MODE */

#define RSTC_RMR_VAL 0xA5000301		/* user reset enable */

#define MASTER_PLL_MUL                162
#define MASTER_PLL_DIV                15

_TEXT_BASE:
	.word	TEXT_BASE

.globl board_init_lowlevel
board_init_lowlevel:

	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 = 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.
;------------------------------------------------------------------------------
;- Enable the Main Oscillator
;----------------------------------------------------------------------------*/
	/* Test if main oscillator is enabled */
	ldr 	r0,=AT91C_PMC_SR
	ldr 	r1, [r0]
	ldr 	r2,=AT91C_PMC_MOSCS
	ands 	r1, r1, r2

	ldr     r1, =AT91C_CKGR_MOR

	/* Main oscillator Enable register PMC_MOR: */
	/* Enable main oscillator, OSCOUNT = 0xFF */
	ldr 	r0, =0x0000FF01
	str     r0, [r1]

	/* Reading the PMC Status register to detect when the */
	/* Main Oscillator is enabled */
	mov     r4, #AT91C_PMC_MOSCS
	ldr     r0,=AT91C_PMC_SR
MOSCS_Loop:
	ldr	r3, [r0]
	and     r3, r4, r3
	cmp     r3, #AT91C_PMC_MOSCS
	bne     MOSCS_Loop


/*-----------------------------------------------------------------------------
;PMC Init Step 2.
;------------------------------------------------------------------------------
;- Setup PLLA
;----------------------------------------------------------------------------*/
	ldr     r1, =AT91C_CKGR_PLLAR
	/* (18.432 MHz / 1) * 13 = 239 MHz */
	ldr 	r0, =PLLAR_VAL
	str     r0, [r1]

	/* Reading the PMC Status register to detect */
	/* when the PLLA is locked */
	mov     r4, #AT91C_PMC_LOCKA
	ldr     r0,=AT91C_PMC_SR
MOSCS_Loop1:
	ldr     r3, [r0]
	and     r3, r4, r3
	cmp     r3, #AT91C_PMC_LOCKA
	bne     MOSCS_Loop1


/*-----------------------------------------------------------------------------
;PMC Init Step 3.
;------------------------------------------------------------------------------
;- Switch on the Main Oscillator 18.432 MHz
;----------------------------------------------------------------------------*/
Init_MCKR:

	/* -Master Clock Controller register PMC_MCKR */
	ldr     r0, =0x100
	ldr     r1, =AT91C_PMC_MCKR
	str     r0, [r1]

	/* Reading the PMC Status register to detect */
	/* when the Master clock is ready */
	mov     r4, #AT91C_PMC_MCKRDY
MCKRDY_Loop:
	ldr	r1, =AT91C_PMC_SR
	ldr     r3, [r1]
	and     r3, r4, r3
	cmp     r3, #AT91C_PMC_MCKRDY
	bne     MCKRDY_Loop

	ldr     r0, =0x102
	ldr	r1, =AT91C_PMC_MCKR
	str     r0, [r1]

	/* Reading the PMC Status register to detect */
	/* when the Master clock is ready */
	mov     r4, #AT91C_PMC_MCKRDY
MCKRDY_Loop1:
	ldr	r1, =AT91C_PMC_SR
	ldr     r3, [r1]
	and     r3, r4, r3
	cmp     r3, #AT91C_PMC_MCKRDY
	bne     MCKRDY_Loop1

/*-----------------------------------------------------------------------------
;PMC Init Step 4.
;------------------------------------------------------------------------------
;- Setup PLLB
;----------------------------------------------------------------------------*/
	ldr     r1, = AT91C_PMC_PLLBR

	/* 48.054857 MHz = 18432000 * 72 / 14 / 2 for USB) */
	ldr 	r0, =PLLBR_VAL
	str     r0, [r1]

	/* Reading the PMC Status register to detect */
	/* when the PLLB is locked */
	mov     r4, #AT91C_PMC_LOCKB
MOSCS_Loop2:
	ldr     r1, = AT91C_PMC_SR
	ldr     r3, [r1]
	and     r3, r4, r3
	cmp     r3, #AT91C_PMC_LOCKB
	bne     MOSCS_Loop2

	/* memory control configuration 2 */
	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

	/* everything is fine now */
	mov	pc, lr

	.ltorg

SMRDATA:
	.word AT91C_WDTC_WDMR
	.word WDTC_WDMR_VAL
	.word AT91C_PIOD_PDR
	.word PIOD_PDR_VAL1
	.word AT91C_PIOD_PPUDR
	.word PIOD_PPUDR_VAL
	.word AT91C_PIOD_ASR
	.word PIOD_PPUDR_VAL

	.word AT91C_CCFG_EBI0CSA
	.word MATRIX_EBI0CSA_VAL
	.word AT91C_CCFG_EBI1CSA
	.word MATRIX_EBI1CSA_VAL

	/* flash */
	.word AT91C_SMC0_CTRL0
	.word SMC0_CTRL0_VAL

	.word AT91C_SMC0_CYCLE0
	.word SMC0_CYCLE0_VAL

	.word AT91C_SMC0_PULSE0
	.word SMC0_PULSE0_VAL

	.word AT91C_SMC0_SETUP0
	.word SMC0_SETUP0_VAL

SMRDATA1:

	.word AT91C_SDRAMC0_MR
	.word SDRC_MR_VAL1
	.word AT91C_SDRAMC0_TR
	.word SDRC_TR_VAL1
	.word AT91C_SDRAMC0_CR
	.word SDRC_CR_VAL
	.word AT91C_SDRAMC0_MDR
	.word SDRC_MDR_VAL
	.word AT91C_SDRAMC0_MR
	.word SDRC_MR_VAL2
	.word SDRAM
	.word SDRAM_VAL1
	.word AT91C_SDRAMC0_MR
	.word SDRC_MR_VAL3
	.word SDRAM
	.word SDRAM_VAL2
	.word SDRAM
	.word SDRAM_VAL3
	.word SDRAM
	.word SDRAM_VAL4
	.word SDRAM
	.word SDRAM_VAL5
	.word SDRAM
	.word SDRAM_VAL6
	.word SDRAM
	.word SDRAM_VAL7
	.word SDRAM
	.word SDRAM_VAL8
	.word SDRAM
	.word SDRAM_VAL9
	.word AT91C_SDRAMC0_MR
	.word SDRC_MR_VAL4
	.word SDRAM
	.word SDRAM_VAL10
	.word AT91C_SDRAMC0_MR
	.word SDRC_MR_VAL5
	.word SDRAM
	.word SDRAM_VAL11
	.word AT91C_SDRAMC0_TR
	.word SDRC_TR_VAL2
	.word SDRAM
	.word SDRAM_VAL12
	/* User reset enable*/
	.word AT91C_RSTC_RMR
	.word RSTC_RMR_VAL
	/* MATRIX_MCFG - REMAP all masters */

SMRDATA2:
	.word 0