| /* |
| * Lowlevel setup for universal board based on EXYNOS4210 |
| * |
| * Copyright (C) 2010 Samsung Electronics |
| * Kyungmin Park <kyungmin.park@samsung.com> |
| * |
| * See file CREDITS for list of people who contributed to this |
| * project. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; either version 2 of |
| * the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| * MA 02111-1307 USA |
| */ |
| |
| #include <config.h> |
| #include <version.h> |
| #include <asm/arch/cpu.h> |
| #include <asm/arch/clock.h> |
| |
| /* |
| * Register usages: |
| * |
| * r5 has zero always |
| * r7 has GPIO part1 base 0x11400000 |
| * r6 has GPIO part2 base 0x11000000 |
| */ |
| |
| .globl lowlevel_init |
| lowlevel_init: |
| mov r11, lr |
| |
| /* r5 has always zero */ |
| mov r5, #0 |
| |
| ldr r7, =EXYNOS4_GPIO_PART1_BASE |
| ldr r6, =EXYNOS4_GPIO_PART2_BASE |
| |
| /* System Timer */ |
| ldr r0, =EXYNOS4_SYSTIMER_BASE |
| ldr r1, =0x5000 |
| str r1, [r0, #0x0] |
| ldr r1, =0xffffffff |
| str r1, [r0, #0x8] |
| ldr r1, =0x49 |
| str r1, [r0, #0x4] |
| |
| /* PMIC manual reset */ |
| /* nPOWER: XEINT_23: GPX2[7] */ |
| add r0, r6, #0xC40 @ EXYNOS4_GPIO_X2_OFFSET |
| ldr r1, [r0, #0x0] |
| bic r1, r1, #(0xf << 28) @ 28 = 7 * 4-bit |
| orr r1, r1, #(0x1 << 28) @ Output |
| str r1, [r0, #0x0] |
| |
| ldr r1, [r0, #0x4] |
| orr r1, r1, #(1 << 7) @ 7 = 7 * 1-bit |
| str r1, [r0, #0x4] |
| |
| /* init system clock */ |
| bl system_clock_init |
| |
| /* Disable Watchdog */ |
| ldr r0, =EXYNOS4_WATCHDOG_BASE @0x10060000 |
| str r5, [r0] |
| |
| /* UART */ |
| bl uart_asm_init |
| |
| /* PMU init */ |
| bl system_power_init |
| |
| bl tzpc_init |
| |
| mov lr, r11 |
| mov pc, lr |
| nop |
| nop |
| nop |
| |
| /* |
| * uart_asm_init: Initialize UART's pins |
| */ |
| uart_asm_init: |
| /* |
| * setup UART0-UART4 GPIOs (part1) |
| * GPA1CON[3] = I2C_3_SCL (3) |
| * GPA1CON[2] = I2C_3_SDA (3) |
| */ |
| mov r0, r7 |
| ldr r1, =0x22222222 |
| str r1, [r0, #0x00] @ EXYNOS4_GPIO_A0_OFFSET |
| ldr r1, =0x00223322 |
| str r1, [r0, #0x20] @ EXYNOS4_GPIO_A1_OFFSET |
| |
| /* UART_SEL GPY4[7] (part2) at EXYNOS4 */ |
| add r0, r6, #0x1A0 @ EXYNOS4_GPIO_Y4_OFFSET |
| ldr r1, [r0, #0x0] |
| bic r1, r1, #(0xf << 28) @ 28 = 7 * 4-bit |
| orr r1, r1, #(0x1 << 28) |
| str r1, [r0, #0x0] |
| |
| ldr r1, [r0, #0x8] |
| bic r1, r1, #(0x3 << 14) @ 14 = 7 * 2-bit |
| orr r1, r1, #(0x3 << 14) @ Pull-up enabled |
| str r1, [r0, #0x8] |
| |
| ldr r1, [r0, #0x4] |
| orr r1, r1, #(1 << 7) @ 7 = 7 * 1-bit |
| str r1, [r0, #0x4] |
| |
| mov pc, lr |
| nop |
| nop |
| nop |
| |
| system_clock_init: |
| ldr r0, =EXYNOS4_CLOCK_BASE |
| |
| /* APLL(1), MPLL(1), CORE(0), HPM(0) */ |
| ldr r1, =0x0101 |
| ldr r2, =0x14200 @ CLK_SRC_CPU |
| str r1, [r0, r2] |
| |
| /* wait ?us */ |
| mov r1, #0x10000 |
| 1: subs r1, r1, #1 |
| bne 1b |
| |
| /* |
| * CLK_SRC_TOP0 |
| * MUX_ONENAND_SEL[28] 0: DOUT133, 1: DOUT166 |
| * MUX_VPLL_SEL[8] 0: FINPLL, 1: FOUTVPLL |
| * MUX_EPLL_SEL[4] 0: FINPLL, 1: FOUTEPLL |
| */ |
| ldr r1, =0x10000110 |
| ldr r2, =0x0C210 @ CLK_SRC_TOP |
| str r1, [r0, r2] |
| |
| /* SATA: SCLKMPLL(0), MMC[0:4]: SCLKMPLL(6) */ |
| ldr r1, =0x0066666 |
| ldr r2, =0x0C240 @ CLK_SRC_FSYS |
| str r1, [r0, r2] |
| /* UART[0:5], PWM: SCLKMPLL(6) */ |
| ldr r1, =0x6666666 |
| ldr r2, =0x0C250 @ CLK_SRC_PERIL0_OFFSET |
| str r1, [r0, r2] |
| |
| /* CPU0: CORE, COREM0, COREM1, PERI, ATB, PCLK_DBG, APLL */ |
| ldr r1, =0x0133730 |
| ldr r2, =0x14500 @ CLK_DIV_CPU0 |
| str r1, [r0, r2] |
| /* CPU1: COPY, HPM */ |
| ldr r1, =0x03 |
| ldr r2, =0x14504 @ CLK_DIV_CPU1 |
| str r1, [r0, r2] |
| /* DMC0: ACP, ACP_PCLK, DPHY, DMC, DMCD, DMCP, COPY2 CORE_TIMER */ |
| ldr r1, =0x13111113 |
| ldr r2, =0x10500 @ CLK_DIV_DMC0 |
| str r1, [r0, r2] |
| /* DMC1: PWI, DVSEM, DPM */ |
| ldr r1, =0x01010100 |
| ldr r2, =0x10504 @ CLK_DIV_DMC1 |
| str r1, [r0, r2] |
| /* LEFTBUS: GDL, GPL */ |
| ldr r1, =0x13 |
| ldr r2, =0x04500 @ CLK_DIV_LEFTBUS |
| str r1, [r0, r2] |
| /* RIGHHTBUS: GDR, GPR */ |
| ldr r1, =0x13 |
| ldr r2, =0x08500 @ CLK_DIV_RIGHTBUS |
| str r1, [r0, r2] |
| /* |
| * CLK_DIV_TOP |
| * ONENAND_RATIOD[18:16]: 0 SCLK_ONENAND = MOUTONENAND / (n + 1) |
| * ACLK_200, ACLK_100, ACLK_160, ACLK_133, |
| */ |
| ldr r1, =0x00005473 |
| ldr r2, =0x0C510 @ CLK_DIV_TOP |
| str r1, [r0, r2] |
| /* MMC[0:1] */ |
| ldr r1, =0x000f000f /* 800(MPLL) / (15 + 1) */ |
| ldr r2, =0x0C544 @ CLK_DIV_FSYS1 |
| str r1, [r0, r2] |
| /* MMC[2:3] */ |
| ldr r1, =0x000f000f /* 800(MPLL) / (15 + 1) */ |
| ldr r2, =0x0C548 @ CLK_DIV_FSYS2 |
| str r1, [r0, r2] |
| /* MMC4 */ |
| ldr r1, =0x000f /* 800(MPLL) / (15 + 1) */ |
| ldr r2, =0x0C54C @ CLK_DIV_FSYS3 |
| str r1, [r0, r2] |
| /* UART[0:5] */ |
| ldr r1, =0x774777 |
| ldr r2, =0x0C550 @ CLK_DIV_PERIL0 |
| str r1, [r0, r2] |
| /* SLIMBUS: ???, PWM */ |
| ldr r1, =0x8 |
| ldr r2, =0x0C55C @ CLK_DIV_PERIL3 |
| str r1, [r0, r2] |
| |
| /* PLL Setting */ |
| ldr r1, =0x1C20 |
| ldr r2, =0x14000 @ APLL_LOCK |
| str r1, [r0, r2] |
| ldr r2, =0x14008 @ MPLL_LOCK |
| str r1, [r0, r2] |
| ldr r2, =0x0C010 @ EPLL_LOCK |
| str r1, [r0, r2] |
| ldr r2, =0x0C020 @ VPLL_LOCK |
| str r1, [r0, r2] |
| |
| /* APLL */ |
| ldr r1, =0x8000001c |
| ldr r2, =0x14104 @ APLL_CON1 |
| str r1, [r0, r2] |
| ldr r1, =0x80c80601 @ 800MHz |
| ldr r2, =0x14100 @ APLL_CON0 |
| str r1, [r0, r2] |
| /* MPLL */ |
| ldr r1, =0x8000001C |
| ldr r2, =0x1410C @ MPLL_CON1 |
| str r1, [r0, r2] |
| ldr r1, =0x80c80601 @ 800MHz |
| ldr r2, =0x14108 @ MPLL_CON0 |
| str r1, [r0, r2] |
| /* EPLL */ |
| ldr r1, =0x0 |
| ldr r2, =0x0C114 @ EPLL_CON1 |
| str r1, [r0, r2] |
| ldr r1, =0x80300302 @ 96MHz |
| ldr r2, =0x0C110 @ EPLL_CON0 |
| str r1, [r0, r2] |
| /* VPLL */ |
| ldr r1, =0x11000400 |
| ldr r2, =0x0C124 @ VPLL_CON1 |
| str r1, [r0, r2] |
| ldr r1, =0x80350302 @ 108MHz |
| ldr r2, =0x0C120 @ VPLL_CON0 |
| str r1, [r0, r2] |
| |
| /* |
| * SMMUJPEG[11], JPEG[6], CSIS1[5] : 0111 1001 |
| * Turn off all |
| */ |
| ldr r1, =0xFFF80000 |
| ldr r2, =0x0C920 @ CLK_GATE_IP_CAM |
| str r1, [r0, r2] |
| |
| /* Turn off all */ |
| ldr r1, =0xFFFFFFC0 |
| ldr r2, =0x0C924 @ CLK_GATE_IP_VP |
| str r1, [r0, r2] |
| |
| /* Turn off all */ |
| ldr r1, =0xFFFFFFE0 |
| ldr r2, =0x0C928 @ CLK_GATE_IP_MFC |
| str r1, [r0, r2] |
| |
| /* Turn off all */ |
| ldr r1, =0xFFFFFFFC |
| ldr r2, =0x0C92C @ CLK_GATE_IP_G3D |
| str r1, [r0, r2] |
| |
| /* Turn off all */ |
| ldr r1, =0xFFFFFC00 |
| ldr r2, =0x0C930 @ CLK_GATE_IP_IMAGE |
| str r1, [r0, r2] |
| |
| /* DSIM0[3], MDNIE0[2], MIE0[1] : 0001 */ |
| ldr r1, =0xFFFFFFF1 |
| ldr r2, =0x0C934 @ CLK_GATE_IP_LCD0 |
| str r1, [r0, r2] |
| |
| /* Turn off all */ |
| ldr r1, =0xFFFFFFC0 |
| ldr r2, =0x0C938 @ CLK_GATE_IP_LCD1 |
| str r1, [r0, r2] |
| |
| /* |
| * SMMUPCIE[18], NFCON[16] : 1111 1010 |
| * PCIE[14], SATA[10], SDMMC43[9:8] : 1011 1000 |
| * SDMMC1[6], TSI[4], SATAPHY[3], PCIEPHY[2] : 1010 0011 |
| */ |
| ldr r1, =0xFFFAB8A3 |
| ldr r2, =0x0C940 @ CLK_GATE_IP_FSYS |
| str r1, [r0, r2] |
| |
| /* Turn off all */ |
| ldr r1, =0xFFFFFFFC |
| ldr r2, =0x0C94C @ CLK_GATE_IP_GPS |
| str r1, [r0, r2] |
| |
| /* |
| * AC97[27], SPDIF[26], SLIMBUS[25] : 1111 0001 |
| * I2C2[8] : 1111 1110 |
| */ |
| ldr r1, =0xF1FFFEFF |
| ldr r2, =0x0C950 @ CLK_GATE_IP_PERIL |
| str r1, [r0, r2] |
| |
| /* |
| * KEYIF[16] : 1111 1110 |
| */ |
| ldr r1, =0xFFFEFFFF |
| ldr r2, =0x0C960 @ CLK_GATE_IP_PERIR |
| str r1, [r0, r2] |
| |
| /* LCD1[5], G3D[3], MFC[2], TV[1] : 1101 0001 */ |
| ldr r1, =0xFFFFFFD1 |
| ldr r2, =0x0C970 @ CLK_GATE_BLOCK |
| str r1, [r0, r2] |
| mov pc, lr |
| nop |
| nop |
| nop |
| |
| system_power_init: |
| ldr r0, =EXYNOS4_POWER_BASE @ 0x10020000 |
| |
| ldr r2, =0x330C @ PS_HOLD_CONTROL |
| ldr r1, [r0, r2] |
| orr r1, r1, #(0x3 << 8) @ Data High, Output En |
| str r1, [r0, r2] |
| |
| /* Power Down */ |
| add r2, r0, #0x3000 |
| str r5, [r2, #0xC20] @ TV_CONFIGURATION |
| str r5, [r2, #0xC40] @ MFC_CONFIGURATION |
| str r5, [r2, #0xC60] @ G3D_CONFIGURATION |
| str r5, [r2, #0xCA0] @ LCD1_CONFIGURATION |
| str r5, [r2, #0xCE0] @ GPS_CONFIGURATION |
| |
| mov pc, lr |
| nop |
| nop |
| nop |
| |
| tzpc_init: |
| ldr r0, =0x10110000 |
| mov r1, #0x0 |
| str r1, [r0] |
| mov r1, #0xff |
| str r1, [r0, #0x0804] |
| str r1, [r0, #0x0810] |
| str r1, [r0, #0x081C] |
| str r1, [r0, #0x0828] |
| |
| ldr r0, =0x10120000 |
| mov r1, #0x0 |
| str r1, [r0] |
| mov r1, #0xff |
| str r1, [r0, #0x0804] |
| str r1, [r0, #0x0810] |
| str r1, [r0, #0x081C] |
| str r1, [r0, #0x0828] |
| |
| ldr r0, =0x10130000 |
| mov r1, #0x0 |
| str r1, [r0] |
| mov r1, #0xff |
| str r1, [r0, #0x0804] |
| str r1, [r0, #0x0810] |
| str r1, [r0, #0x081C] |
| str r1, [r0, #0x0828] |
| |
| ldr r0, =0x10140000 |
| mov r1, #0x0 |
| str r1, [r0] |
| mov r1, #0xff |
| str r1, [r0, #0x0804] |
| str r1, [r0, #0x0810] |
| str r1, [r0, #0x081C] |
| str r1, [r0, #0x0828] |
| |
| ldr r0, =0x10150000 |
| mov r1, #0x0 |
| str r1, [r0] |
| mov r1, #0xff |
| str r1, [r0, #0x0804] |
| str r1, [r0, #0x0810] |
| str r1, [r0, #0x081C] |
| str r1, [r0, #0x0828] |
| |
| mov pc, lr |