|  | /* | 
|  | * For clock initialization, see chapter 3 of the "MCIMX27 Multimedia | 
|  | * Applications Processor Reference Manual, Rev. 0.2". | 
|  | * | 
|  | * (C) Copyright 2008 Eric Jarrige <eric.jarrige@armadeus.org> | 
|  | * (C) Copyright 2009 Ilya Yanok <yanok@emcraft.com> | 
|  | * | 
|  | * 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/macro.h> | 
|  | #include <asm/arch/imx-regs.h> | 
|  | #include <generated/asm-offsets.h> | 
|  |  | 
|  | 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 |