xref: /openbmc/u-boot/board/samsung/smdkc100/lowlevel_init.S (revision d93d0f0cfef46293db97cbdc5e72c9e5bceadd02)
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