241 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| /*
 | |
|  * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
 | |
|  *
 | |
|  * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| #include <config.h>
 | |
| #include <asm/arch/imx-regs.h>
 | |
| #include <generated/asm-offsets.h>
 | |
| #include "mx35pdk.h"
 | |
| #include <asm/arch/lowlevel_macro.S>
 | |
| 
 | |
| /*
 | |
|  * return soc version
 | |
|  * 	0x10:  TO1
 | |
|  *	0x20:  TO2
 | |
|  *	0x30:  TO3
 | |
|  */
 | |
| .macro check_soc_version ret, tmp
 | |
| 	ldr \tmp, =IIM_BASE_ADDR
 | |
| 	ldr \ret, [\tmp, #IIM_SREV]
 | |
| 	cmp \ret, #0x00
 | |
| 	moveq \tmp, #ROMPATCH_REV
 | |
| 	ldreq \ret, [\tmp]
 | |
| 	moveq \ret, \ret, lsl #4
 | |
| 	addne \ret, \ret, #0x10
 | |
| .endm
 | |
| 
 | |
| /* CPLD on CS5 setup */
 | |
| .macro init_debug_board
 | |
| 	ldr r0, =DBG_BASE_ADDR
 | |
| 	ldr r1, =DBG_CSCR_U_CONFIG
 | |
| 	str r1, [r0, #0x00]
 | |
| 	ldr r1, =DBG_CSCR_L_CONFIG
 | |
| 	str r1, [r0, #0x04]
 | |
| 	ldr r1, =DBG_CSCR_A_CONFIG
 | |
| 	str r1, [r0, #0x08]
 | |
| .endm
 | |
| 
 | |
| /* clock setup */
 | |
| .macro init_clock
 | |
| 	ldr r0, =CCM_BASE_ADDR
 | |
| 
 | |
| 	/* default CLKO to 1/32 of the ARM core*/
 | |
| 	ldr r1, [r0, #CLKCTL_COSR]
 | |
| 	bic r1, r1, #0x00000FF00
 | |
| 	bic r1, r1, #0x0000000FF
 | |
| 	mov r2, #0x00006C00
 | |
| 	add r2, r2, #0x67
 | |
| 	orr r1, r1, r2
 | |
| 	str r1, [r0, #CLKCTL_COSR]
 | |
| 
 | |
| 	ldr r2, =CCM_CCMR_CONFIG
 | |
| 	str r2, [r0, #CLKCTL_CCMR]
 | |
| 
 | |
| 	check_soc_version r1, r2
 | |
| 	cmp r1, #CHIP_REV_2_0
 | |
| 	ldrhs r3, =CCM_MPLL_532_HZ
 | |
| 	bhs 1f
 | |
| 	ldr r2, [r0, #CLKCTL_PDR0]
 | |
| 	tst r2, #CLKMODE_CONSUMER
 | |
| 	ldrne r3, =CCM_MPLL_532_HZ  /* consumer path*/
 | |
| 	ldreq r3, =CCM_MPLL_399_HZ  /* auto path*/
 | |
| 1:
 | |
| 	str r3, [r0, #CLKCTL_MPCTL]
 | |
| 
 | |
| 	ldr r1, =CCM_PPLL_300_HZ
 | |
| 	str r1, [r0, #CLKCTL_PPCTL]
 | |
| 
 | |
| 	ldr r1, =CCM_PDR0_CONFIG
 | |
| 	bic r1, r1, #0x800000
 | |
| 	str r1, [r0, #CLKCTL_PDR0]
 | |
| 
 | |
| 	ldr r1, [r0, #CLKCTL_CGR0]
 | |
| 	orr r1, r1, #0x0C300000
 | |
| 	str r1, [r0, #CLKCTL_CGR0]
 | |
| 
 | |
| 	ldr r1, [r0, #CLKCTL_CGR1]
 | |
| 	orr r1, r1, #0x00000C00
 | |
| 	orr r1, r1, #0x00000003
 | |
| 	str r1, [r0, #CLKCTL_CGR1]
 | |
| 
 | |
| 	ldr r1, [r0, #CLKCTL_CGR2]
 | |
| 	orr r1, r1, #0x00C00000
 | |
| 	str r1, [r0, #CLKCTL_CGR2]
 | |
| .endm
 | |
| 
 | |
| .macro setup_sdram
 | |
| 	ldr r0, =ESDCTL_BASE_ADDR
 | |
| 	mov r3, #0x2000
 | |
| 	str r3, [r0, #0x0]
 | |
| 	str r3, [r0, #0x8]
 | |
| 
 | |
| 	/*ip(r12) has used to save lr register in upper calling*/
 | |
| 	mov fp, lr
 | |
| 
 | |
| 	mov r5, #0x00
 | |
| 	mov r2, #0x00
 | |
| 	mov r1, #CSD0_BASE_ADDR
 | |
| 	bl setup_sdram_bank
 | |
| 
 | |
| 	mov r5, #0x00
 | |
| 	mov r2, #0x00
 | |
| 	mov r1, #CSD1_BASE_ADDR
 | |
| 	bl setup_sdram_bank
 | |
| 
 | |
| 	mov lr, fp
 | |
| 
 | |
| 1:
 | |
| 	ldr r3, =ESDCTL_DELAY_LINE5
 | |
| 	str r3, [r0, #0x30]
 | |
| .endm
 | |
| 
 | |
| .globl lowlevel_init
 | |
| lowlevel_init:
 | |
| 	mov r10, lr
 | |
| 
 | |
| 	core_init
 | |
| 
 | |
| 	init_aips
 | |
| 
 | |
| 	init_max
 | |
| 
 | |
| 	init_m3if
 | |
| 
 | |
| 	init_clock
 | |
| 	init_debug_board
 | |
| 
 | |
| 	cmp pc, #PHYS_SDRAM_1
 | |
| 	blo init_sdram_start
 | |
| 	cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE)
 | |
| 	blo skip_sdram_setup
 | |
| 
 | |
| init_sdram_start:
 | |
| 	/*init_sdram*/
 | |
| 	setup_sdram
 | |
| 
 | |
| skip_sdram_setup:
 | |
| 	mov lr, r10
 | |
| 	mov pc, lr
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * r0: ESDCTL control base, r1: sdram slot base
 | |
|  * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base
 | |
|  */
 | |
| setup_sdram_bank:
 | |
| 	mov r3, #0xE
 | |
| 	tst r2, #0x1
 | |
| 	orreq r3, r3, #0x300 /*DDR2*/
 | |
| 	str r3, [r0, #0x10]
 | |
| 	bic r3, r3, #0x00A
 | |
| 	str r3, [r0, #0x10]
 | |
| 	beq 2f
 | |
| 
 | |
| 	mov r3, #0x20000
 | |
| 1:      subs r3, r3, #1
 | |
| 	bne 1b
 | |
| 
 | |
| 2:      tst r2, #0x1
 | |
| 	ldreq r3, =ESDCTL_DDR2_CONFIG
 | |
| 	ldrne r3, =ESDCTL_MDDR_CONFIG
 | |
| 	cmp r1, #CSD1_BASE_ADDR
 | |
| 	strlo r3, [r0, #0x4]
 | |
| 	strhs r3, [r0, #0xC]
 | |
| 
 | |
| 	ldr r3, =ESDCTL_0x92220000
 | |
| 	strlo r3, [r0, #0x0]
 | |
| 	strhs r3, [r0, #0x8]
 | |
| 	mov r3, #0xDA
 | |
| 	ldr r4, =ESDCTL_PRECHARGE
 | |
| 	strb r3, [r1, r4]
 | |
| 
 | |
| 	tst r2, #0x1
 | |
| 	bne skip_set_mode
 | |
| 
 | |
| 	cmp r1, #CSD1_BASE_ADDR
 | |
| 	ldr r3, =ESDCTL_0xB2220000
 | |
| 	strlo r3, [r0, #0x0]
 | |
| 	strhs r3, [r0, #0x8]
 | |
| 	mov r3, #0xDA
 | |
| 	ldr r4, =ESDCTL_DDR2_EMR2
 | |
| 	strb r3, [r1, r4]
 | |
| 	ldr r4, =ESDCTL_DDR2_EMR3
 | |
| 	strb r3, [r1, r4]
 | |
| 	ldr r4, =ESDCTL_DDR2_EN_DLL
 | |
| 	strb r3, [r1, r4]
 | |
| 	ldr r4, =ESDCTL_DDR2_RESET_DLL
 | |
| 	strb r3, [r1, r4]
 | |
| 
 | |
| 	ldr r3, =ESDCTL_0x92220000
 | |
| 	strlo r3, [r0, #0x0]
 | |
| 	strhs r3, [r0, #0x8]
 | |
| 	mov r3, #0xDA
 | |
| 	ldr r4, =ESDCTL_PRECHARGE
 | |
| 	strb r3, [r1, r4]
 | |
| 
 | |
| skip_set_mode:
 | |
| 	cmp r1, #CSD1_BASE_ADDR
 | |
| 	ldr r3, =ESDCTL_0xA2220000
 | |
| 	strlo r3, [r0, #0x0]
 | |
| 	strhs r3, [r0, #0x8]
 | |
| 	mov r3, #0xDA
 | |
| 	strb r3, [r1]
 | |
| 	strb r3, [r1]
 | |
| 
 | |
| 	ldr r3, =ESDCTL_0xB2220000
 | |
| 	strlo r3, [r0, #0x0]
 | |
| 	strhs r3, [r0, #0x8]
 | |
| 	tst r2, #0x1
 | |
| 	ldreq r4, =ESDCTL_DDR2_MR
 | |
| 	ldrne r4, =ESDCTL_MDDR_MR
 | |
| 	mov r3, #0xDA
 | |
| 	strb r3, [r1, r4]
 | |
| 	ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT
 | |
| 	streqb r3, [r1, r4]
 | |
| 	ldreq r4, =ESDCTL_DDR2_EN_DLL
 | |
| 	ldrne r4, =ESDCTL_MDDR_EMR
 | |
| 	strb r3, [r1, r4]
 | |
| 
 | |
| 	cmp r1, #CSD1_BASE_ADDR
 | |
| 	ldr r3, =ESDCTL_0x82228080
 | |
| 	strlo r3, [r0, #0x0]
 | |
| 	strhs r3, [r0, #0x8]
 | |
| 
 | |
| 	tst r2, #0x1
 | |
| 	moveq r4, #0x20000
 | |
| 	movne r4, #0x200
 | |
| 1:      subs r4, r4, #1
 | |
| 	bne 1b
 | |
| 
 | |
| 	str r3, [r1, #0x100]
 | |
| 	ldr r4, [r1, #0x100]
 | |
| 	cmp r3, r4
 | |
| 	movne r3, #1
 | |
| 	moveq r3, #0
 | |
| 
 | |
| 	mov pc, lr
 |