1*8bc4ee9eSMinkyu Kang/* 2*8bc4ee9eSMinkyu Kang * Copyright (C) 2009 Samsung Electronics 3*8bc4ee9eSMinkyu Kang * Kyungmin Park <kyungmin.park@samsung.com> 4*8bc4ee9eSMinkyu Kang * Minkyu Kang <mk7.kang@samsung.com> 5*8bc4ee9eSMinkyu Kang * 6*8bc4ee9eSMinkyu Kang * See file CREDITS for list of people who contributed to this 7*8bc4ee9eSMinkyu Kang * project. 8*8bc4ee9eSMinkyu Kang * 9*8bc4ee9eSMinkyu Kang * This program is free software; you can redistribute it and/or 10*8bc4ee9eSMinkyu Kang * modify it under the terms of the GNU General Public License as 11*8bc4ee9eSMinkyu Kang * published by the Free Software Foundation; either version 2 of 12*8bc4ee9eSMinkyu Kang * the License, or (at your option) any later version. 13*8bc4ee9eSMinkyu Kang * 14*8bc4ee9eSMinkyu Kang * This program is distributed in the hope that it will be useful, 15*8bc4ee9eSMinkyu Kang * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*8bc4ee9eSMinkyu Kang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*8bc4ee9eSMinkyu Kang * GNU General Public License for more details. 18*8bc4ee9eSMinkyu Kang * 19*8bc4ee9eSMinkyu Kang * You should have received a copy of the GNU General Public License 20*8bc4ee9eSMinkyu Kang * along with this program; if not, write to the Free Software 21*8bc4ee9eSMinkyu Kang * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 22*8bc4ee9eSMinkyu Kang * MA 02111-1307 USA 23*8bc4ee9eSMinkyu Kang */ 24*8bc4ee9eSMinkyu Kang 25*8bc4ee9eSMinkyu Kang#include <config.h> 26*8bc4ee9eSMinkyu Kang#include <version.h> 27*8bc4ee9eSMinkyu Kang#include <asm/arch/cpu.h> 28*8bc4ee9eSMinkyu Kang#include <asm/arch/power.h> 29*8bc4ee9eSMinkyu Kang 30*8bc4ee9eSMinkyu Kang/* 31*8bc4ee9eSMinkyu Kang * Register usages: 32*8bc4ee9eSMinkyu Kang * 33*8bc4ee9eSMinkyu Kang * r5 has zero always 34*8bc4ee9eSMinkyu Kang */ 35*8bc4ee9eSMinkyu Kang 36*8bc4ee9eSMinkyu Kang_TEXT_BASE: 37*8bc4ee9eSMinkyu Kang .word TEXT_BASE 38*8bc4ee9eSMinkyu Kang 39*8bc4ee9eSMinkyu Kang .globl lowlevel_init 40*8bc4ee9eSMinkyu Kanglowlevel_init: 41*8bc4ee9eSMinkyu Kang mov r9, lr 42*8bc4ee9eSMinkyu Kang 43*8bc4ee9eSMinkyu Kang /* r5 has always zero */ 44*8bc4ee9eSMinkyu Kang mov r5, #0 45*8bc4ee9eSMinkyu Kang 46*8bc4ee9eSMinkyu Kang ldr r8, =S5PC100_GPIO_BASE 47*8bc4ee9eSMinkyu Kang 48*8bc4ee9eSMinkyu Kang /* Disable Watchdog */ 49*8bc4ee9eSMinkyu Kang ldr r0, =S5PC100_WATCHDOG_BASE @0xEA200000 50*8bc4ee9eSMinkyu Kang orr r0, r0, #0x0 51*8bc4ee9eSMinkyu Kang str r5, [r0] 52*8bc4ee9eSMinkyu Kang 53*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 54*8bc4ee9eSMinkyu Kang /* setting SRAM */ 55*8bc4ee9eSMinkyu Kang ldr r0, =S5PC100_SROMC_BASE 56*8bc4ee9eSMinkyu Kang ldr r1, =0x9 57*8bc4ee9eSMinkyu Kang str r1, [r0] 58*8bc4ee9eSMinkyu Kang#endif 59*8bc4ee9eSMinkyu Kang 60*8bc4ee9eSMinkyu Kang /* S5PC100 has 3 groups of interrupt sources */ 61*8bc4ee9eSMinkyu Kang ldr r0, =S5PC100_VIC0_BASE @0xE4000000 62*8bc4ee9eSMinkyu Kang ldr r1, =S5PC100_VIC1_BASE @0xE4000000 63*8bc4ee9eSMinkyu Kang ldr r2, =S5PC100_VIC2_BASE @0xE4000000 64*8bc4ee9eSMinkyu Kang 65*8bc4ee9eSMinkyu Kang /* Disable all interrupts (VIC0, VIC1 and VIC2) */ 66*8bc4ee9eSMinkyu Kang mvn r3, #0x0 67*8bc4ee9eSMinkyu Kang str r3, [r0, #0x14] @INTENCLEAR 68*8bc4ee9eSMinkyu Kang str r3, [r1, #0x14] @INTENCLEAR 69*8bc4ee9eSMinkyu Kang str r3, [r2, #0x14] @INTENCLEAR 70*8bc4ee9eSMinkyu Kang 71*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 72*8bc4ee9eSMinkyu Kang /* Set all interrupts as IRQ */ 73*8bc4ee9eSMinkyu Kang str r5, [r0, #0xc] @INTSELECT 74*8bc4ee9eSMinkyu Kang str r5, [r1, #0xc] @INTSELECT 75*8bc4ee9eSMinkyu Kang str r5, [r2, #0xc] @INTSELECT 76*8bc4ee9eSMinkyu Kang 77*8bc4ee9eSMinkyu Kang /* Pending Interrupt Clear */ 78*8bc4ee9eSMinkyu Kang str r5, [r0, #0xf00] @INTADDRESS 79*8bc4ee9eSMinkyu Kang str r5, [r1, #0xf00] @INTADDRESS 80*8bc4ee9eSMinkyu Kang str r5, [r2, #0xf00] @INTADDRESS 81*8bc4ee9eSMinkyu Kang#endif 82*8bc4ee9eSMinkyu Kang 83*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 84*8bc4ee9eSMinkyu Kang /* for UART */ 85*8bc4ee9eSMinkyu Kang bl uart_asm_init 86*8bc4ee9eSMinkyu Kang 87*8bc4ee9eSMinkyu Kang /* for TZPC */ 88*8bc4ee9eSMinkyu Kang bl tzpc_asm_init 89*8bc4ee9eSMinkyu Kang#endif 90*8bc4ee9eSMinkyu Kang 91*8bc4ee9eSMinkyu Kang#ifdef CONFIG_ONENAND_IPL 92*8bc4ee9eSMinkyu Kang /* init system clock */ 93*8bc4ee9eSMinkyu Kang bl system_clock_init 94*8bc4ee9eSMinkyu Kang 95*8bc4ee9eSMinkyu Kang bl mem_ctrl_asm_init 96*8bc4ee9eSMinkyu Kang 97*8bc4ee9eSMinkyu Kang /* Wakeup support. Don't know if it's going to be used, untested. */ 98*8bc4ee9eSMinkyu Kang ldr r0, =S5PC100_RST_STAT 99*8bc4ee9eSMinkyu Kang ldr r1, [r0] 100*8bc4ee9eSMinkyu Kang bic r1, r1, #0xfffffff7 101*8bc4ee9eSMinkyu Kang cmp r1, #0x8 102*8bc4ee9eSMinkyu Kang beq wakeup_reset 103*8bc4ee9eSMinkyu Kang#endif 104*8bc4ee9eSMinkyu Kang 105*8bc4ee9eSMinkyu Kang1: 106*8bc4ee9eSMinkyu Kang mov lr, r9 107*8bc4ee9eSMinkyu Kang mov pc, lr 108*8bc4ee9eSMinkyu Kang 109*8bc4ee9eSMinkyu Kang#ifdef CONFIG_ONENAND_IPL 110*8bc4ee9eSMinkyu Kangwakeup_reset: 111*8bc4ee9eSMinkyu Kang 112*8bc4ee9eSMinkyu Kang /* Clear wakeup status register */ 113*8bc4ee9eSMinkyu Kang ldr r0, =S5PC100_WAKEUP_STAT 114*8bc4ee9eSMinkyu Kang ldr r1, [r0] 115*8bc4ee9eSMinkyu Kang str r1, [r0] 116*8bc4ee9eSMinkyu Kang 117*8bc4ee9eSMinkyu Kang /* Load return address and jump to kernel */ 118*8bc4ee9eSMinkyu Kang ldr r0, =S5PC100_INFORM0 119*8bc4ee9eSMinkyu Kang 120*8bc4ee9eSMinkyu Kang /* r1 = physical address of s5pc100_cpu_resume function */ 121*8bc4ee9eSMinkyu Kang ldr r1, [r0] 122*8bc4ee9eSMinkyu Kang 123*8bc4ee9eSMinkyu Kang /* Jump to kernel (sleep.S) */ 124*8bc4ee9eSMinkyu Kang mov pc, r1 125*8bc4ee9eSMinkyu Kang nop 126*8bc4ee9eSMinkyu Kang nop 127*8bc4ee9eSMinkyu Kang#endif 128*8bc4ee9eSMinkyu Kang 129*8bc4ee9eSMinkyu Kang/* 130*8bc4ee9eSMinkyu Kang * system_clock_init: Initialize core clock and bus clock. 131*8bc4ee9eSMinkyu Kang * void system_clock_init(void) 132*8bc4ee9eSMinkyu Kang */ 133*8bc4ee9eSMinkyu Kangsystem_clock_init: 134*8bc4ee9eSMinkyu Kang ldr r8, =S5PC1XX_CLOCK_BASE @ 0xE0100000 135*8bc4ee9eSMinkyu Kang 136*8bc4ee9eSMinkyu Kang /* Set Clock divider */ 137*8bc4ee9eSMinkyu Kang ldr r1, =0x00011110 138*8bc4ee9eSMinkyu Kang str r1, [r8, #0x304] 139*8bc4ee9eSMinkyu Kang ldr r1, =0x1 140*8bc4ee9eSMinkyu Kang str r1, [r8, #0x308] 141*8bc4ee9eSMinkyu Kang ldr r1, =0x00011301 142*8bc4ee9eSMinkyu Kang str r1, [r8, #0x300] 143*8bc4ee9eSMinkyu Kang 144*8bc4ee9eSMinkyu Kang /* Set Lock Time */ 145*8bc4ee9eSMinkyu Kang ldr r1, =0xe10 @ Locktime : 0xe10 = 3600 146*8bc4ee9eSMinkyu Kang str r1, [r8, #0x000] @ APLL_LOCK 147*8bc4ee9eSMinkyu Kang str r1, [r8, #0x004] @ MPLL_LOCK 148*8bc4ee9eSMinkyu Kang str r1, [r8, #0x008] @ EPLL_LOCK 149*8bc4ee9eSMinkyu Kang str r1, [r8, #0x00C] @ HPLL_LOCK 150*8bc4ee9eSMinkyu Kang 151*8bc4ee9eSMinkyu Kang /* APLL_CON */ 152*8bc4ee9eSMinkyu Kang ldr r1, =0x81bc0400 @ SDIV 0, PDIV 4, MDIV 444 (1332MHz) 153*8bc4ee9eSMinkyu Kang str r1, [r8, #0x100] 154*8bc4ee9eSMinkyu Kang /* MPLL_CON */ 155*8bc4ee9eSMinkyu Kang ldr r1, =0x80590201 @ SDIV 1, PDIV 2, MDIV 89 (267MHz) 156*8bc4ee9eSMinkyu Kang str r1, [r8, #0x104] 157*8bc4ee9eSMinkyu Kang /* EPLL_CON */ 158*8bc4ee9eSMinkyu Kang ldr r1, =0x80870303 @ SDIV 3, PDIV 3, MDIV 135 (67.5MHz) 159*8bc4ee9eSMinkyu Kang str r1, [r8, #0x108] 160*8bc4ee9eSMinkyu Kang /* HPLL_CON */ 161*8bc4ee9eSMinkyu Kang ldr r1, =0x80600603 162*8bc4ee9eSMinkyu Kang str r1, [r8, #0x10C] 163*8bc4ee9eSMinkyu Kang 164*8bc4ee9eSMinkyu Kang /* Set Source Clock */ 165*8bc4ee9eSMinkyu Kang ldr r1, =0x1111 @ A, M, E, HPLL Muxing 166*8bc4ee9eSMinkyu Kang str r1, [r8, #0x200] @ CLK_SRC0 167*8bc4ee9eSMinkyu Kang 168*8bc4ee9eSMinkyu Kang ldr r1, =0x1000001 @ Uart Clock & CLK48M Muxing 169*8bc4ee9eSMinkyu Kang str r1, [r8, #0x204] @ CLK_SRC1 170*8bc4ee9eSMinkyu Kang 171*8bc4ee9eSMinkyu Kang ldr r1, =0x9000 @ ARMCLK/4 172*8bc4ee9eSMinkyu Kang str r1, [r8, #0x400] @ CLK_OUT 173*8bc4ee9eSMinkyu Kang 174*8bc4ee9eSMinkyu Kang /* wait at least 200us to stablize all clock */ 175*8bc4ee9eSMinkyu Kang mov r2, #0x10000 176*8bc4ee9eSMinkyu Kang1: subs r2, r2, #1 177*8bc4ee9eSMinkyu Kang bne 1b 178*8bc4ee9eSMinkyu Kang 179*8bc4ee9eSMinkyu Kang mov pc, lr 180*8bc4ee9eSMinkyu Kang 181*8bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 182*8bc4ee9eSMinkyu Kang/* 183*8bc4ee9eSMinkyu Kang * uart_asm_init: Initialize UART's pins 184*8bc4ee9eSMinkyu Kang */ 185*8bc4ee9eSMinkyu Kanguart_asm_init: 186*8bc4ee9eSMinkyu Kang mov r0, r8 187*8bc4ee9eSMinkyu Kang ldr r1, =0x22222222 188*8bc4ee9eSMinkyu Kang str r1, [r0, #0x0] @ GPA0_CON 189*8bc4ee9eSMinkyu Kang ldr r1, =0x00022222 190*8bc4ee9eSMinkyu Kang str r1, [r0, #0x20] @ GPA1_CON 191*8bc4ee9eSMinkyu Kang 192*8bc4ee9eSMinkyu Kang mov pc, lr 193*8bc4ee9eSMinkyu Kang 194*8bc4ee9eSMinkyu Kang/* 195*8bc4ee9eSMinkyu Kang * tzpc_asm_init: Initialize TZPC 196*8bc4ee9eSMinkyu Kang */ 197*8bc4ee9eSMinkyu Kangtzpc_asm_init: 198*8bc4ee9eSMinkyu Kang ldr r0, =0xE3800000 199*8bc4ee9eSMinkyu Kang mov r1, #0x0 200*8bc4ee9eSMinkyu Kang str r1, [r0] 201*8bc4ee9eSMinkyu Kang mov r1, #0xff 202*8bc4ee9eSMinkyu Kang str r1, [r0, #0x804] 203*8bc4ee9eSMinkyu Kang str r1, [r0, #0x810] 204*8bc4ee9eSMinkyu Kang 205*8bc4ee9eSMinkyu Kang ldr r0, =0xE2800000 206*8bc4ee9eSMinkyu Kang str r1, [r0, #0x804] 207*8bc4ee9eSMinkyu Kang str r1, [r0, #0x810] 208*8bc4ee9eSMinkyu Kang str r1, [r0, #0x81C] 209*8bc4ee9eSMinkyu Kang 210*8bc4ee9eSMinkyu Kang ldr r0, =0xE2900000 211*8bc4ee9eSMinkyu Kang str r1, [r0, #0x804] 212*8bc4ee9eSMinkyu Kang str r1, [r0, #0x810] 213*8bc4ee9eSMinkyu Kang 214*8bc4ee9eSMinkyu Kang mov pc, lr 215*8bc4ee9eSMinkyu Kang#endif 216