1eae4988bSStefano Babic/* 2eae4988bSStefano Babic * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de> 3eae4988bSStefano Babic * 4eae4988bSStefano Babic * (C) Copyright 2008-2010 Freescale Semiconductor, Inc. 5eae4988bSStefano Babic * 6eae4988bSStefano Babic * This program is free software; you can redistribute it and/or 7eae4988bSStefano Babic * modify it under the terms of the GNU General Public License as 8eae4988bSStefano Babic * published by the Free Software Foundation; either version 2 of 9eae4988bSStefano Babic * the License, or (at your option) any later version. 10eae4988bSStefano Babic * 11eae4988bSStefano Babic * This program is distributed in the hope that it will be useful, 12eae4988bSStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of 13eae4988bSStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14eae4988bSStefano Babic * GNU General Public License for more details. 15eae4988bSStefano Babic * 16eae4988bSStefano Babic * You should have received a copy of the GNU General Public License 17eae4988bSStefano Babic * along with this program; if not, write to the Free Software 18eae4988bSStefano Babic * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 19eae4988bSStefano Babic * MA 02111-1307 USA 20eae4988bSStefano Babic */ 21eae4988bSStefano Babic 22eae4988bSStefano Babic#include <config.h> 23eae4988bSStefano Babic#include <asm/arch/imx-regs.h> 24a4814a69SStefano Babic#include <generated/asm-offsets.h> 25eae4988bSStefano Babic#include "mx35pdk.h" 26151d63cbSBenoît Thébaudeau#include <asm/arch/lowlevel_macro.S> 27eae4988bSStefano Babic 28eae4988bSStefano Babic/* 29eae4988bSStefano Babic * return soc version 30eae4988bSStefano Babic * 0x10: TO1 31eae4988bSStefano Babic * 0x20: TO2 32eae4988bSStefano Babic * 0x30: TO3 33eae4988bSStefano Babic */ 34eae4988bSStefano Babic.macro check_soc_version ret, tmp 35eae4988bSStefano Babic ldr \tmp, =IIM_BASE_ADDR 36eae4988bSStefano Babic ldr \ret, [\tmp, #IIM_SREV] 37eae4988bSStefano Babic cmp \ret, #0x00 38eae4988bSStefano Babic moveq \tmp, #ROMPATCH_REV 39eae4988bSStefano Babic ldreq \ret, [\tmp] 40eae4988bSStefano Babic moveq \ret, \ret, lsl #4 41eae4988bSStefano Babic addne \ret, \ret, #0x10 42eae4988bSStefano Babic.endm 43eae4988bSStefano Babic 44eae4988bSStefano Babic/* CPLD on CS5 setup */ 45eae4988bSStefano Babic.macro init_debug_board 46eae4988bSStefano Babic ldr r0, =DBG_BASE_ADDR 47eae4988bSStefano Babic ldr r1, =DBG_CSCR_U_CONFIG 48eae4988bSStefano Babic str r1, [r0, #0x00] 49eae4988bSStefano Babic ldr r1, =DBG_CSCR_L_CONFIG 50eae4988bSStefano Babic str r1, [r0, #0x04] 51eae4988bSStefano Babic ldr r1, =DBG_CSCR_A_CONFIG 52eae4988bSStefano Babic str r1, [r0, #0x08] 53eae4988bSStefano Babic.endm 54eae4988bSStefano Babic 55eae4988bSStefano Babic/* clock setup */ 56eae4988bSStefano Babic.macro init_clock 57eae4988bSStefano Babic ldr r0, =CCM_BASE_ADDR 58eae4988bSStefano Babic 59eae4988bSStefano Babic /* default CLKO to 1/32 of the ARM core*/ 60eae4988bSStefano Babic ldr r1, [r0, #CLKCTL_COSR] 61eae4988bSStefano Babic bic r1, r1, #0x00000FF00 62eae4988bSStefano Babic bic r1, r1, #0x0000000FF 63eae4988bSStefano Babic mov r2, #0x00006C00 64eae4988bSStefano Babic add r2, r2, #0x67 65eae4988bSStefano Babic orr r1, r1, r2 66eae4988bSStefano Babic str r1, [r0, #CLKCTL_COSR] 67eae4988bSStefano Babic 68eae4988bSStefano Babic ldr r2, =CCM_CCMR_CONFIG 69eae4988bSStefano Babic str r2, [r0, #CLKCTL_CCMR] 70eae4988bSStefano Babic 71eae4988bSStefano Babic check_soc_version r1, r2 72eae4988bSStefano Babic cmp r1, #CHIP_REV_2_0 73eae4988bSStefano Babic ldrhs r3, =CCM_MPLL_532_HZ 74eae4988bSStefano Babic bhs 1f 75eae4988bSStefano Babic ldr r2, [r0, #CLKCTL_PDR0] 76eae4988bSStefano Babic tst r2, #CLKMODE_CONSUMER 77eae4988bSStefano Babic ldrne r3, =CCM_MPLL_532_HZ /* consumer path*/ 78eae4988bSStefano Babic ldreq r3, =CCM_MPLL_399_HZ /* auto path*/ 79eae4988bSStefano Babic1: 80eae4988bSStefano Babic str r3, [r0, #CLKCTL_MPCTL] 81eae4988bSStefano Babic 82eae4988bSStefano Babic ldr r1, =CCM_PPLL_300_HZ 83eae4988bSStefano Babic str r1, [r0, #CLKCTL_PPCTL] 84eae4988bSStefano Babic 85eae4988bSStefano Babic ldr r1, =CCM_PDR0_CONFIG 86eae4988bSStefano Babic bic r1, r1, #0x800000 87eae4988bSStefano Babic str r1, [r0, #CLKCTL_PDR0] 88eae4988bSStefano Babic 89eae4988bSStefano Babic ldr r1, [r0, #CLKCTL_CGR0] 90eae4988bSStefano Babic orr r1, r1, #0x0C300000 91eae4988bSStefano Babic str r1, [r0, #CLKCTL_CGR0] 92eae4988bSStefano Babic 93eae4988bSStefano Babic ldr r1, [r0, #CLKCTL_CGR1] 94eae4988bSStefano Babic orr r1, r1, #0x00000C00 95eae4988bSStefano Babic orr r1, r1, #0x00000003 96eae4988bSStefano Babic str r1, [r0, #CLKCTL_CGR1] 97*961a7628SBenoît Thébaudeau 98*961a7628SBenoît Thébaudeau ldr r1, [r0, #CLKCTL_CGR2] 99*961a7628SBenoît Thébaudeau orr r1, r1, #0x00C00000 100*961a7628SBenoît Thébaudeau str r1, [r0, #CLKCTL_CGR2] 101eae4988bSStefano Babic.endm 102eae4988bSStefano Babic 103eae4988bSStefano Babic.macro setup_sdram 104eae4988bSStefano Babic ldr r0, =ESDCTL_BASE_ADDR 105eae4988bSStefano Babic mov r3, #0x2000 106eae4988bSStefano Babic str r3, [r0, #0x0] 107eae4988bSStefano Babic str r3, [r0, #0x8] 108eae4988bSStefano Babic 109eae4988bSStefano Babic /*ip(r12) has used to save lr register in upper calling*/ 110eae4988bSStefano Babic mov fp, lr 111eae4988bSStefano Babic 112eae4988bSStefano Babic mov r5, #0x00 113eae4988bSStefano Babic mov r2, #0x00 114eae4988bSStefano Babic mov r1, #CSD0_BASE_ADDR 115eae4988bSStefano Babic bl setup_sdram_bank 1166b5acfc1SStefano Babic 1176b5acfc1SStefano Babic mov r5, #0x00 1186b5acfc1SStefano Babic mov r2, #0x00 1196b5acfc1SStefano Babic mov r1, #CSD1_BASE_ADDR 1206b5acfc1SStefano Babic bl setup_sdram_bank 121eae4988bSStefano Babic 122eae4988bSStefano Babic mov lr, fp 123eae4988bSStefano Babic 124eae4988bSStefano Babic1: 125eae4988bSStefano Babic ldr r3, =ESDCTL_DELAY_LINE5 126eae4988bSStefano Babic str r3, [r0, #0x30] 127eae4988bSStefano Babic.endm 128eae4988bSStefano Babic 129eae4988bSStefano Babic.globl lowlevel_init 130eae4988bSStefano Babiclowlevel_init: 131eae4988bSStefano Babic mov r10, lr 132eae4988bSStefano Babic 133151d63cbSBenoît Thébaudeau core_init 134eae4988bSStefano Babic 135eae4988bSStefano Babic init_aips 136eae4988bSStefano Babic 137eae4988bSStefano Babic init_max 138eae4988bSStefano Babic 139eae4988bSStefano Babic init_m3if 140eae4988bSStefano Babic 141eae4988bSStefano Babic init_clock 142eae4988bSStefano Babic init_debug_board 143eae4988bSStefano Babic 144eae4988bSStefano Babic cmp pc, #PHYS_SDRAM_1 145eae4988bSStefano Babic blo init_sdram_start 146eae4988bSStefano Babic cmp pc, #(PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE) 147eae4988bSStefano Babic blo skip_sdram_setup 148eae4988bSStefano Babic 149eae4988bSStefano Babicinit_sdram_start: 150eae4988bSStefano Babic /*init_sdram*/ 151eae4988bSStefano Babic setup_sdram 152eae4988bSStefano Babic 153eae4988bSStefano Babicskip_sdram_setup: 154eae4988bSStefano Babic mov lr, r10 155eae4988bSStefano Babic mov pc, lr 156eae4988bSStefano Babic 157eae4988bSStefano Babic 158eae4988bSStefano Babic/* 159eae4988bSStefano Babic * r0: ESDCTL control base, r1: sdram slot base 160eae4988bSStefano Babic * r2: DDR type(0:DDR2, 1:MDDR) r3, r4:working base 161eae4988bSStefano Babic */ 162eae4988bSStefano Babicsetup_sdram_bank: 163eae4988bSStefano Babic mov r3, #0xE 164eae4988bSStefano Babic tst r2, #0x1 165eae4988bSStefano Babic orreq r3, r3, #0x300 /*DDR2*/ 166eae4988bSStefano Babic str r3, [r0, #0x10] 167eae4988bSStefano Babic bic r3, r3, #0x00A 168eae4988bSStefano Babic str r3, [r0, #0x10] 169eae4988bSStefano Babic beq 2f 170eae4988bSStefano Babic 171eae4988bSStefano Babic mov r3, #0x20000 172eae4988bSStefano Babic1: subs r3, r3, #1 173eae4988bSStefano Babic bne 1b 174eae4988bSStefano Babic 175eae4988bSStefano Babic2: tst r2, #0x1 176eae4988bSStefano Babic ldreq r3, =ESDCTL_DDR2_CONFIG 177eae4988bSStefano Babic ldrne r3, =ESDCTL_MDDR_CONFIG 178eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 179eae4988bSStefano Babic strlo r3, [r0, #0x4] 180eae4988bSStefano Babic strhs r3, [r0, #0xC] 181eae4988bSStefano Babic 182eae4988bSStefano Babic ldr r3, =ESDCTL_0x92220000 183eae4988bSStefano Babic strlo r3, [r0, #0x0] 184eae4988bSStefano Babic strhs r3, [r0, #0x8] 185eae4988bSStefano Babic mov r3, #0xDA 186eae4988bSStefano Babic ldr r4, =ESDCTL_PRECHARGE 187eae4988bSStefano Babic strb r3, [r1, r4] 188eae4988bSStefano Babic 189eae4988bSStefano Babic tst r2, #0x1 190eae4988bSStefano Babic bne skip_set_mode 191eae4988bSStefano Babic 192eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 193eae4988bSStefano Babic ldr r3, =ESDCTL_0xB2220000 194eae4988bSStefano Babic strlo r3, [r0, #0x0] 195eae4988bSStefano Babic strhs r3, [r0, #0x8] 196eae4988bSStefano Babic mov r3, #0xDA 197eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_EMR2 198eae4988bSStefano Babic strb r3, [r1, r4] 199eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_EMR3 200eae4988bSStefano Babic strb r3, [r1, r4] 201eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_EN_DLL 202eae4988bSStefano Babic strb r3, [r1, r4] 203eae4988bSStefano Babic ldr r4, =ESDCTL_DDR2_RESET_DLL 204eae4988bSStefano Babic strb r3, [r1, r4] 205eae4988bSStefano Babic 206eae4988bSStefano Babic ldr r3, =ESDCTL_0x92220000 207eae4988bSStefano Babic strlo r3, [r0, #0x0] 208eae4988bSStefano Babic strhs r3, [r0, #0x8] 209eae4988bSStefano Babic mov r3, #0xDA 210eae4988bSStefano Babic ldr r4, =ESDCTL_PRECHARGE 211eae4988bSStefano Babic strb r3, [r1, r4] 212eae4988bSStefano Babic 213eae4988bSStefano Babicskip_set_mode: 214eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 215eae4988bSStefano Babic ldr r3, =ESDCTL_0xA2220000 216eae4988bSStefano Babic strlo r3, [r0, #0x0] 217eae4988bSStefano Babic strhs r3, [r0, #0x8] 218eae4988bSStefano Babic mov r3, #0xDA 219eae4988bSStefano Babic strb r3, [r1] 220eae4988bSStefano Babic strb r3, [r1] 221eae4988bSStefano Babic 222eae4988bSStefano Babic ldr r3, =ESDCTL_0xB2220000 223eae4988bSStefano Babic strlo r3, [r0, #0x0] 224eae4988bSStefano Babic strhs r3, [r0, #0x8] 225eae4988bSStefano Babic tst r2, #0x1 226eae4988bSStefano Babic ldreq r4, =ESDCTL_DDR2_MR 227eae4988bSStefano Babic ldrne r4, =ESDCTL_MDDR_MR 228eae4988bSStefano Babic mov r3, #0xDA 229eae4988bSStefano Babic strb r3, [r1, r4] 230eae4988bSStefano Babic ldreq r4, =ESDCTL_DDR2_OCD_DEFAULT 231eae4988bSStefano Babic streqb r3, [r1, r4] 232eae4988bSStefano Babic ldreq r4, =ESDCTL_DDR2_EN_DLL 233eae4988bSStefano Babic ldrne r4, =ESDCTL_MDDR_EMR 234eae4988bSStefano Babic strb r3, [r1, r4] 235eae4988bSStefano Babic 236eae4988bSStefano Babic cmp r1, #CSD1_BASE_ADDR 237eae4988bSStefano Babic ldr r3, =ESDCTL_0x82228080 238eae4988bSStefano Babic strlo r3, [r0, #0x0] 239eae4988bSStefano Babic strhs r3, [r0, #0x8] 240eae4988bSStefano Babic 241eae4988bSStefano Babic tst r2, #0x1 242eae4988bSStefano Babic moveq r4, #0x20000 243eae4988bSStefano Babic movne r4, #0x200 244eae4988bSStefano Babic1: subs r4, r4, #1 245eae4988bSStefano Babic bne 1b 246eae4988bSStefano Babic 247eae4988bSStefano Babic str r3, [r1, #0x100] 248eae4988bSStefano Babic ldr r4, [r1, #0x100] 249eae4988bSStefano Babic cmp r3, r4 250eae4988bSStefano Babic movne r3, #1 251eae4988bSStefano Babic moveq r3, #0 252eae4988bSStefano Babic 253eae4988bSStefano Babic mov pc, lr 254