18bc4ee9eSMinkyu Kang/* 28bc4ee9eSMinkyu Kang * Copyright (C) 2009 Samsung Electronics 38bc4ee9eSMinkyu Kang * Kyungmin Park <kyungmin.park@samsung.com> 48bc4ee9eSMinkyu Kang * Minkyu Kang <mk7.kang@samsung.com> 58bc4ee9eSMinkyu Kang * 68bc4ee9eSMinkyu Kang * See file CREDITS for list of people who contributed to this 78bc4ee9eSMinkyu Kang * project. 88bc4ee9eSMinkyu Kang * 98bc4ee9eSMinkyu Kang * This program is free software; you can redistribute it and/or 108bc4ee9eSMinkyu Kang * modify it under the terms of the GNU General Public License as 118bc4ee9eSMinkyu Kang * published by the Free Software Foundation; either version 2 of 128bc4ee9eSMinkyu Kang * the License, or (at your option) any later version. 138bc4ee9eSMinkyu Kang * 148bc4ee9eSMinkyu Kang * This program is distributed in the hope that it will be useful, 158bc4ee9eSMinkyu Kang * but WITHOUT ANY WARRANTY; without even the implied warranty of 168bc4ee9eSMinkyu Kang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 178bc4ee9eSMinkyu Kang * GNU General Public License for more details. 188bc4ee9eSMinkyu Kang * 198bc4ee9eSMinkyu Kang * You should have received a copy of the GNU General Public License 208bc4ee9eSMinkyu Kang * along with this program; if not, write to the Free Software 218bc4ee9eSMinkyu Kang * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 228bc4ee9eSMinkyu Kang * MA 02111-1307 USA 238bc4ee9eSMinkyu Kang */ 248bc4ee9eSMinkyu Kang 258bc4ee9eSMinkyu Kang#include <config.h> 268bc4ee9eSMinkyu Kang#include <version.h> 278bc4ee9eSMinkyu Kang#include <asm/arch/cpu.h> 288bc4ee9eSMinkyu Kang#include <asm/arch/power.h> 298bc4ee9eSMinkyu Kang 308bc4ee9eSMinkyu Kang/* 318bc4ee9eSMinkyu Kang * Register usages: 328bc4ee9eSMinkyu Kang * 338bc4ee9eSMinkyu Kang * r5 has zero always 348bc4ee9eSMinkyu Kang */ 358bc4ee9eSMinkyu Kang 368bc4ee9eSMinkyu Kang_TEXT_BASE: 378bc4ee9eSMinkyu Kang .word TEXT_BASE 388bc4ee9eSMinkyu Kang 398bc4ee9eSMinkyu Kang .globl lowlevel_init 408bc4ee9eSMinkyu Kanglowlevel_init: 418bc4ee9eSMinkyu Kang mov r9, lr 428bc4ee9eSMinkyu Kang 438bc4ee9eSMinkyu Kang /* r5 has always zero */ 448bc4ee9eSMinkyu Kang mov r5, #0 458bc4ee9eSMinkyu Kang 468bc4ee9eSMinkyu Kang ldr r8, =S5PC100_GPIO_BASE 478bc4ee9eSMinkyu Kang 488bc4ee9eSMinkyu Kang /* Disable Watchdog */ 498bc4ee9eSMinkyu Kang ldr r0, =S5PC100_WATCHDOG_BASE @0xEA200000 508bc4ee9eSMinkyu Kang orr r0, r0, #0x0 518bc4ee9eSMinkyu Kang str r5, [r0] 528bc4ee9eSMinkyu Kang 538bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 548bc4ee9eSMinkyu Kang /* setting SRAM */ 558bc4ee9eSMinkyu Kang ldr r0, =S5PC100_SROMC_BASE 568bc4ee9eSMinkyu Kang ldr r1, =0x9 578bc4ee9eSMinkyu Kang str r1, [r0] 588bc4ee9eSMinkyu Kang#endif 598bc4ee9eSMinkyu Kang 608bc4ee9eSMinkyu Kang /* S5PC100 has 3 groups of interrupt sources */ 618bc4ee9eSMinkyu Kang ldr r0, =S5PC100_VIC0_BASE @0xE4000000 628bc4ee9eSMinkyu Kang ldr r1, =S5PC100_VIC1_BASE @0xE4000000 638bc4ee9eSMinkyu Kang ldr r2, =S5PC100_VIC2_BASE @0xE4000000 648bc4ee9eSMinkyu Kang 658bc4ee9eSMinkyu Kang /* Disable all interrupts (VIC0, VIC1 and VIC2) */ 668bc4ee9eSMinkyu Kang mvn r3, #0x0 678bc4ee9eSMinkyu Kang str r3, [r0, #0x14] @INTENCLEAR 688bc4ee9eSMinkyu Kang str r3, [r1, #0x14] @INTENCLEAR 698bc4ee9eSMinkyu Kang str r3, [r2, #0x14] @INTENCLEAR 708bc4ee9eSMinkyu Kang 718bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 728bc4ee9eSMinkyu Kang /* Set all interrupts as IRQ */ 738bc4ee9eSMinkyu Kang str r5, [r0, #0xc] @INTSELECT 748bc4ee9eSMinkyu Kang str r5, [r1, #0xc] @INTSELECT 758bc4ee9eSMinkyu Kang str r5, [r2, #0xc] @INTSELECT 768bc4ee9eSMinkyu Kang 778bc4ee9eSMinkyu Kang /* Pending Interrupt Clear */ 788bc4ee9eSMinkyu Kang str r5, [r0, #0xf00] @INTADDRESS 798bc4ee9eSMinkyu Kang str r5, [r1, #0xf00] @INTADDRESS 808bc4ee9eSMinkyu Kang str r5, [r2, #0xf00] @INTADDRESS 818bc4ee9eSMinkyu Kang#endif 828bc4ee9eSMinkyu Kang 838bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 848bc4ee9eSMinkyu Kang /* for UART */ 858bc4ee9eSMinkyu Kang bl uart_asm_init 868bc4ee9eSMinkyu Kang 878bc4ee9eSMinkyu Kang /* for TZPC */ 888bc4ee9eSMinkyu Kang bl tzpc_asm_init 898bc4ee9eSMinkyu Kang#endif 908bc4ee9eSMinkyu Kang 918bc4ee9eSMinkyu Kang#ifdef CONFIG_ONENAND_IPL 928bc4ee9eSMinkyu Kang /* init system clock */ 938bc4ee9eSMinkyu Kang bl system_clock_init 948bc4ee9eSMinkyu Kang 958bc4ee9eSMinkyu Kang bl mem_ctrl_asm_init 968bc4ee9eSMinkyu Kang 978bc4ee9eSMinkyu Kang /* Wakeup support. Don't know if it's going to be used, untested. */ 988bc4ee9eSMinkyu Kang ldr r0, =S5PC100_RST_STAT 998bc4ee9eSMinkyu Kang ldr r1, [r0] 1008bc4ee9eSMinkyu Kang bic r1, r1, #0xfffffff7 1018bc4ee9eSMinkyu Kang cmp r1, #0x8 1028bc4ee9eSMinkyu Kang beq wakeup_reset 1038bc4ee9eSMinkyu Kang#endif 1048bc4ee9eSMinkyu Kang 1058bc4ee9eSMinkyu Kang1: 1068bc4ee9eSMinkyu Kang mov lr, r9 1078bc4ee9eSMinkyu Kang mov pc, lr 1088bc4ee9eSMinkyu Kang 1098bc4ee9eSMinkyu Kang#ifdef CONFIG_ONENAND_IPL 1108bc4ee9eSMinkyu Kangwakeup_reset: 1118bc4ee9eSMinkyu Kang 1128bc4ee9eSMinkyu Kang /* Clear wakeup status register */ 1138bc4ee9eSMinkyu Kang ldr r0, =S5PC100_WAKEUP_STAT 1148bc4ee9eSMinkyu Kang ldr r1, [r0] 1158bc4ee9eSMinkyu Kang str r1, [r0] 1168bc4ee9eSMinkyu Kang 1178bc4ee9eSMinkyu Kang /* Load return address and jump to kernel */ 1188bc4ee9eSMinkyu Kang ldr r0, =S5PC100_INFORM0 1198bc4ee9eSMinkyu Kang 1208bc4ee9eSMinkyu Kang /* r1 = physical address of s5pc100_cpu_resume function */ 1218bc4ee9eSMinkyu Kang ldr r1, [r0] 1228bc4ee9eSMinkyu Kang 1238bc4ee9eSMinkyu Kang /* Jump to kernel (sleep.S) */ 1248bc4ee9eSMinkyu Kang mov pc, r1 1258bc4ee9eSMinkyu Kang nop 1268bc4ee9eSMinkyu Kang nop 1278bc4ee9eSMinkyu Kang#endif 1288bc4ee9eSMinkyu Kang 1298bc4ee9eSMinkyu Kang/* 1308bc4ee9eSMinkyu Kang * system_clock_init: Initialize core clock and bus clock. 1318bc4ee9eSMinkyu Kang * void system_clock_init(void) 1328bc4ee9eSMinkyu Kang */ 1338bc4ee9eSMinkyu Kangsystem_clock_init: 134*d93d0f0cSMinkyu Kang ldr r8, =S5PC100_CLOCK_BASE @ 0xE0100000 1358bc4ee9eSMinkyu Kang 1368bc4ee9eSMinkyu Kang /* Set Clock divider */ 1378bc4ee9eSMinkyu Kang ldr r1, =0x00011110 1388bc4ee9eSMinkyu Kang str r1, [r8, #0x304] 1398bc4ee9eSMinkyu Kang ldr r1, =0x1 1408bc4ee9eSMinkyu Kang str r1, [r8, #0x308] 1418bc4ee9eSMinkyu Kang ldr r1, =0x00011301 1428bc4ee9eSMinkyu Kang str r1, [r8, #0x300] 1438bc4ee9eSMinkyu Kang 1448bc4ee9eSMinkyu Kang /* Set Lock Time */ 1458bc4ee9eSMinkyu Kang ldr r1, =0xe10 @ Locktime : 0xe10 = 3600 1468bc4ee9eSMinkyu Kang str r1, [r8, #0x000] @ APLL_LOCK 1478bc4ee9eSMinkyu Kang str r1, [r8, #0x004] @ MPLL_LOCK 1488bc4ee9eSMinkyu Kang str r1, [r8, #0x008] @ EPLL_LOCK 1498bc4ee9eSMinkyu Kang str r1, [r8, #0x00C] @ HPLL_LOCK 1508bc4ee9eSMinkyu Kang 1518bc4ee9eSMinkyu Kang /* APLL_CON */ 1528bc4ee9eSMinkyu Kang ldr r1, =0x81bc0400 @ SDIV 0, PDIV 4, MDIV 444 (1332MHz) 1538bc4ee9eSMinkyu Kang str r1, [r8, #0x100] 1548bc4ee9eSMinkyu Kang /* MPLL_CON */ 1558bc4ee9eSMinkyu Kang ldr r1, =0x80590201 @ SDIV 1, PDIV 2, MDIV 89 (267MHz) 1568bc4ee9eSMinkyu Kang str r1, [r8, #0x104] 1578bc4ee9eSMinkyu Kang /* EPLL_CON */ 1588bc4ee9eSMinkyu Kang ldr r1, =0x80870303 @ SDIV 3, PDIV 3, MDIV 135 (67.5MHz) 1598bc4ee9eSMinkyu Kang str r1, [r8, #0x108] 1608bc4ee9eSMinkyu Kang /* HPLL_CON */ 1618bc4ee9eSMinkyu Kang ldr r1, =0x80600603 1628bc4ee9eSMinkyu Kang str r1, [r8, #0x10C] 1638bc4ee9eSMinkyu Kang 1648bc4ee9eSMinkyu Kang /* Set Source Clock */ 1658bc4ee9eSMinkyu Kang ldr r1, =0x1111 @ A, M, E, HPLL Muxing 1668bc4ee9eSMinkyu Kang str r1, [r8, #0x200] @ CLK_SRC0 1678bc4ee9eSMinkyu Kang 1688bc4ee9eSMinkyu Kang ldr r1, =0x1000001 @ Uart Clock & CLK48M Muxing 1698bc4ee9eSMinkyu Kang str r1, [r8, #0x204] @ CLK_SRC1 1708bc4ee9eSMinkyu Kang 1718bc4ee9eSMinkyu Kang ldr r1, =0x9000 @ ARMCLK/4 1728bc4ee9eSMinkyu Kang str r1, [r8, #0x400] @ CLK_OUT 1738bc4ee9eSMinkyu Kang 1748bc4ee9eSMinkyu Kang /* wait at least 200us to stablize all clock */ 1758bc4ee9eSMinkyu Kang mov r2, #0x10000 1768bc4ee9eSMinkyu Kang1: subs r2, r2, #1 1778bc4ee9eSMinkyu Kang bne 1b 1788bc4ee9eSMinkyu Kang 1798bc4ee9eSMinkyu Kang mov pc, lr 1808bc4ee9eSMinkyu Kang 1818bc4ee9eSMinkyu Kang#ifndef CONFIG_ONENAND_IPL 1828bc4ee9eSMinkyu Kang/* 1838bc4ee9eSMinkyu Kang * uart_asm_init: Initialize UART's pins 1848bc4ee9eSMinkyu Kang */ 1858bc4ee9eSMinkyu Kanguart_asm_init: 1868bc4ee9eSMinkyu Kang mov r0, r8 1878bc4ee9eSMinkyu Kang ldr r1, =0x22222222 1888bc4ee9eSMinkyu Kang str r1, [r0, #0x0] @ GPA0_CON 1898bc4ee9eSMinkyu Kang ldr r1, =0x00022222 1908bc4ee9eSMinkyu Kang str r1, [r0, #0x20] @ GPA1_CON 1918bc4ee9eSMinkyu Kang 1928bc4ee9eSMinkyu Kang mov pc, lr 1938bc4ee9eSMinkyu Kang 1948bc4ee9eSMinkyu Kang/* 1958bc4ee9eSMinkyu Kang * tzpc_asm_init: Initialize TZPC 1968bc4ee9eSMinkyu Kang */ 1978bc4ee9eSMinkyu Kangtzpc_asm_init: 1988bc4ee9eSMinkyu Kang ldr r0, =0xE3800000 1998bc4ee9eSMinkyu Kang mov r1, #0x0 2008bc4ee9eSMinkyu Kang str r1, [r0] 2018bc4ee9eSMinkyu Kang mov r1, #0xff 2028bc4ee9eSMinkyu Kang str r1, [r0, #0x804] 2038bc4ee9eSMinkyu Kang str r1, [r0, #0x810] 2048bc4ee9eSMinkyu Kang 2058bc4ee9eSMinkyu Kang ldr r0, =0xE2800000 2068bc4ee9eSMinkyu Kang str r1, [r0, #0x804] 2078bc4ee9eSMinkyu Kang str r1, [r0, #0x810] 2088bc4ee9eSMinkyu Kang str r1, [r0, #0x81C] 2098bc4ee9eSMinkyu Kang 2108bc4ee9eSMinkyu Kang ldr r0, =0xE2900000 2118bc4ee9eSMinkyu Kang str r1, [r0, #0x804] 2128bc4ee9eSMinkyu Kang str r1, [r0, #0x810] 2138bc4ee9eSMinkyu Kang 2148bc4ee9eSMinkyu Kang mov pc, lr 2158bc4ee9eSMinkyu Kang#endif 216