/* * For clock initialization, see chapter 3 of the "MCIMX27 Multimedia * Applications Processor Reference Manual, Rev. 0.2". * * (C) Copyright 2008 Eric Jarrige * (C) Copyright 2009 Ilya Yanok * * 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 #include #include #include #include SOC_ESDCTL_BASE_W: .word IMX_ESD_BASE SOC_SI_ID_REG_W: .word IMX_SYSTEM_CTL_BASE SDRAM_ESDCFG_T1_W: .word SDRAM_ESDCFG_REGISTER_VAL(0) SDRAM_ESDCFG_T2_W: .word SDRAM_ESDCFG_REGISTER_VAL(3) SDRAM_PRECHARGE_CMD_W: .word (ESDCTL_SDE | ESDCTL_SMODE_PRECHARGE | \ ESDCTL_ROW13 | ESDCTL_COL10) SDRAM_AUTOREF_CMD_W: .word (ESDCTL_SDE | ESDCTL_SMODE_AUTO_REF | \ ESDCTL_ROW13 | ESDCTL_COL10) SDRAM_LOADMODE_CMD_W: .word (ESDCTL_SDE | ESDCTL_SMODE_LOAD_MODE | \ ESDCTL_ROW13 | ESDCTL_COL10) SDRAM_NORMAL_CMD_W: .word SDRAM_ESDCTL_REGISTER_VAL .macro init_aipi /* * setup AIPI1 and AIPI2 */ write32 AIPI1_PSR0, AIPI1_PSR0_VAL write32 AIPI1_PSR1, AIPI1_PSR1_VAL write32 AIPI2_PSR0, AIPI2_PSR0_VAL write32 AIPI2_PSR1, AIPI2_PSR1_VAL .endm /* init_aipi */ .macro init_clock ldr r0, =CSCR /* disable MPLL/SPLL first */ ldr r1, [r0] bic r1, r1, #(CSCR_MPEN|CSCR_SPEN) str r1, [r0] write32 MPCTL0, MPCTL0_VAL write32 SPCTL0, SPCTL0_VAL write32 CSCR, CSCR_VAL | CSCR_MPLL_RESTART | CSCR_SPLL_RESTART /* * add some delay here */ wait_timer 0x1000 /* peripheral clock divider */ write32 PCDR0, PCDR0_VAL write32 PCDR1, PCDR1_VAL /* Configure PCCR0 and PCCR1 */ write32 PCCR0, PCCR0_VAL write32 PCCR1, PCCR1_VAL .endm /* init_clock */ .macro sdram_init ldr r0, SOC_ESDCTL_BASE_W mov r2, #PHYS_SDRAM_1 /* Do initial reset */ mov r1, #ESDMISC_MDDR_DL_RST str r1, [r0, #ESDMISC_ROF] /* Hold for more than 200ns */ wait_timer 0x10000 /* Activate LPDDR iface */ mov r1, #ESDMISC_MDDREN str r1, [r0, #ESDMISC_ROF] /* Check The chip version TO1 or TO2 */ ldr r1, SOC_SI_ID_REG_W ldr r1, [r1] ands r1, r1, #0xF0000000 /* add Latency on CAS only for TO2 */ ldreq r1, SDRAM_ESDCFG_T2_W ldrne r1, SDRAM_ESDCFG_T1_W str r1, [r0, #ESDCFG0_ROF] /* Run initialization sequence */ ldr r1, SDRAM_PRECHARGE_CMD_W str r1, [r0, #ESDCTL0_ROF] ldr r1, [r2, #SDRAM_ALL_VAL] ldr r1, SDRAM_AUTOREF_CMD_W str r1, [r0, #ESDCTL0_ROF] ldr r1, [r2, #SDRAM_ALL_VAL] ldr r1, [r2, #SDRAM_ALL_VAL] ldr r1, SDRAM_LOADMODE_CMD_W str r1, [r0, #ESDCTL0_ROF] ldrb r1, [r2, #SDRAM_MODE_REGISTER_VAL] add r3, r2, #SDRAM_EXT_MODE_REGISTER_VAL ldrb r1, [r3] ldr r1, SDRAM_NORMAL_CMD_W str r1, [r0, #ESDCTL0_ROF] #if (CONFIG_NR_DRAM_BANKS > 1) /* 2nd sdram */ mov r2, #PHYS_SDRAM_2 /* Check The chip version TO1 or TO2 */ ldr r1, SOC_SI_ID_REG_W ldr r1, [r1] ands r1, r1, #0xF0000000 /* add Latency on CAS only for TO2 */ ldreq r1, SDRAM_ESDCFG_T2_W ldrne r1, SDRAM_ESDCFG_T1_W str r1, [r0, #ESDCFG1_ROF] /* Run initialization sequence */ ldr r1, SDRAM_PRECHARGE_CMD_W str r1, [r0, #ESDCTL1_ROF] ldr r1, [r2, #SDRAM_ALL_VAL] ldr r1, SDRAM_AUTOREF_CMD_W str r1, [r0, #ESDCTL1_ROF] ldr r1, [r2, #SDRAM_ALL_VAL] ldr r1, [r2, #SDRAM_ALL_VAL] ldr r1, SDRAM_LOADMODE_CMD_W str r1, [r0, #ESDCTL1_ROF] ldrb r1, [r2, #SDRAM_MODE_REGISTER_VAL] add r3, r2, #SDRAM_EXT_MODE_REGISTER_VAL ldrb r1, [r3] ldr r1, SDRAM_NORMAL_CMD_W str r1, [r0, #ESDCTL1_ROF] #endif /* CONFIG_NR_DRAM_BANKS > 1 */ .endm /* sdram_init */ .globl lowlevel_init lowlevel_init: mov r10, lr init_aipi init_clock sdram_init mov pc,r10