#include <machine/asm.h>
#include <arm/armreg.h>
#include <arm/s3c2xx0/s3c2800reg.h>
#ifndef PLLCON_MDIV_VAL
#if XTAL_CLK == 10000000 || XTAL_CLK == 10
#define PLLCON_MDIV_VAL 0x5c
#define PLLCON_PDIV_VAL 3
#define PLLCON_SDIV_VAL 0
#elif XTAL_CLK == 8000000 || XTAL_CLK == 8
#define PLLCON_MDIV_VAL 0x5c
#define PLLCON_PDIV_VAL 2
#define PLLCON_SDIV_VAL 0
#elif XTAL_CLK == 6000000 || XTAL_CLK == 6
#define PLLCON_MDIV_VAL 0x5c
#define PLLCON_PDIV_VAL 1
#define PLLCON_SDIV_VAL 0
#else
#error define XTAL_CLK to 10, 8 or 6MHz
#endif
#endif
#ifndef SDRAM_START
#define SDRAM_START S3C2800_DBANK0_START
#endif
#ifndef SDRAM_SIZE
#define SDRAM_SIZE 0x01000000
#endif
#define TEMP_STACK_SIZE (4*1024)
.code 32
.section ".vectors"
reset_vector:
b __reset_entry
undef:
b .
swi:
b .
abrtp:
b .
abrtd:
b .
resv:
b .
irq:
b .
fiq:
b .
__reset_entry:
mrs r0, cpsr
bic r0, r0, #PSR_MODE
orr r0, r0, #(I32_bit|F32_bit|PSR_SVC32_MODE)
msr cpsr, r0
mrc p15, 0, r10, c1, c0, 0
ldr r0, =(CPU_CONTROL_MMU_ENABLE|CPU_CONTROL_DC_ENABLE|CPU_CONTROL_IC_ENABLE)
bic r10, r10, r0
mcr p15, 0, r10, c1, c0, 0
nop
nop
nop
mcr p15, 0, r2, c7, c5, 0
nop
nop
nop
orr r10, r10, #CPU_CONTROL_IC_ENABLE
mcr p15, 0, r10, c1, c0, 0
nop
nop
nop
ldr r0, Lwdt_wtcon_addr
mov r1, #WTCON_WDTSTOP
str r1, [r0]
ldr r0, Lintctl_intmsk_addr
mov r1, #0x0
str r1, [r0]
#if 0
ldr r9, =S3C2800_GPIO_BASE
mov r1, #0x3f
strh r1, [r9, #GPIO_PCONC]
mov r0, #0xdfff
strh r0, [r9,GPIO_PCONB]
#endif
mov r0, pc
cmp r0, #SDRAM_START
bhs running_on_ram
#ifdef RAM_INIT_HOOK
bl RAM_INIT_HOOK
#endif
ldr r8, =S3C2800_CLKMAN_BASE
ldr r1, [r8,#CLKMAN_CLKCON]
orr r1, r1, #CLKCON_HCLK
str r1, [r8,#CLKMAN_CLKCON]
ldr r1, Lclkman_locktime_data
str r1, [r8,#CLKMAN_LOCKTIME]
ldr r1, Lclkman_pllcon_data
str r1, [r8,#CLKMAN_PLLCON]
running_on_ram:
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #(1<<31)
orr r0, r0, #(1<<30)
mcr p15, 0, r0, c1, c0, 0
nop
nop
nop
adr sp, reset_vector
ldr r1, =(SDRAM_START+TEMP_STACK_SIZE)
cmp sp, r1
ldrlo sp, =(SDRAM_START+SDRAM_SIZE)
#ifdef IO_INIT_HOOK
bl IO_INIT_HOOK
#endif
#ifdef SELFCOPY_TO_FLASH
mov r0, pc
cmp r0, #SDRAM_START
blo 99f
adr r0, reset_vector
ldr r1, =__rom_size__
b selfcopy_to_flash
99:
#endif
b start
Lwdt_wtcon_addr:
.word (S3C2800_WDT_BASE + WDT_WTCON)
Lintctl_intmsk_addr:
.word (S3C2800_INTCTL_BASE + INTCTL_INTMSK)
.ltorg
Lclkman_locktime_data:
.word (0xfff)
Lclkman_pllcon_data:
.word (PLLCON_MDIV_VAL<<PLLCON_MDIV_SHIFT) | \
(PLLCON_PDIV_VAL<<PLLCON_PDIV_SHIFT) | \
(PLLCON_SDIV_VAL<<PLLCON_SDIV_SHIFT)