Newer
Older
barebox / arch / arm / boards / freescale-mx53-loco / lowlevel_init.S
@Marc Kleine-Budde Marc Kleine-Budde on 29 Jul 2011 4 KB arm: add support for the i.MX53 loco board
/*
 * Copyright (C) 2007 Guennadi Liakhovetski <lg@denx.de>
 * Copyright (C) 2009 Freescale Semiconductor, Inc.
 *
 * 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.
 *
 */

#include <config.h>
#include <mach/imx-regs.h>
#include <mach/clock-imx51_53.h>

/*
 * L2CC Cache setup/invalidation/disable
 */
.macro init_l2cc
	/* explicitly disable L2 cache */
	mrc 15, 0, r0, c1, c0, 1
	bic r0, r0, #0x2
	mcr 15, 0, r0, c1, c0, 1

	/* reconfigure L2 cache aux control reg */
	mov r0, #0xC0			/* tag RAM */
	add r0, r0, #0x4		/* data RAM */
	orr r0, r0, #(1 << 24)		/* disable write allocate delay */
	orr r0, r0, #(1 << 23)		/* disable write allocate combine */
	orr r0, r0, #(1 << 22)		/* disable write allocate */

	cmp r3, #0x10			/* r3 contains the silicon rev */

	/* disable write combine for TO 2 and lower revs */
	orrls r0, r0, #(1 << 25)

	mcr 15, 1, r0, c9, c0, 2
.endm /* init_l2cc */

/* AIPS setup - Only setup MPROTx registers.
 * The PACR default values are good.*/
.macro init_aips
	/*
	 * Set all MPROTx to be non-bufferable, trusted for R/W,
	 * not forced to user-mode.
	 */
	ldr r0, =MX53_AIPS1_BASE_ADDR
	ldr r1, =0x77777777
	str r1, [r0, #0x0]
	str r1, [r0, #0x4]

	ldr r0, =MX53_AIPS2_BASE_ADDR
	str r1, [r0, #0x0]
	str r1, [r0, #0x4]
	/*
	 * Clear the on and off peripheral modules Supervisor Protect bit
	 * for SDMA to access them. Did not change the AIPS control registers
	 * (offset 0x20) access type
	 */
.endm /* init_aips */

.macro setup_pll pll, freq
	ldr r0, =\pll
	ldr r1, =0x00001232
	str r1, [r0, #MX5_PLL_DP_CTL]		/* Set DPLL ON (set UPEN bit): BRMO=1 */
	mov r1, #0x2
	str r1, [r0, #MX5_PLL_DP_CONFIG]	/* Enable auto-restart AREN bit */

	ldr r1, W_DP_OP_\freq
	str r1, [r0, #MX5_PLL_DP_OP]
	str r1, [r0, #MX5_PLL_DP_HFS_OP]

	ldr r1, W_DP_MFD_\freq
	str r1, [r0, #MX5_PLL_DP_MFD]
	str r1, [r0, #MX5_PLL_DP_HFS_MFD]

	ldr r1, W_DP_MFN_\freq
	str r1, [r0, #MX5_PLL_DP_MFN]
	str r1, [r0, #MX5_PLL_DP_HFS_MFN]

	ldr r1, =0x00001232
	str r1, [r0, #MX5_PLL_DP_CTL]
1:	ldr r1, [r0, #MX5_PLL_DP_CTL]
	ands r1, r1, #0x1
	beq 1b
.endm

.macro init_clock
	ldr r0, =MX53_CCM_BASE_ADDR


	/* Switch ARM to step clock */
	mov r1, #0x4
	str r1, [r0, #MX5_CCM_CCSR]

	setup_pll MX53_PLL1_BASE_ADDR, 1000
	setup_pll MX53_PLL3_BASE_ADDR, 216

	/* Set the platform clock dividers */
	ldr r0, =MX53_ARM_BASE_ADDR
	ldr r1, =0x00000725
	str r1, [r0, #0x14]

	ldr r0, =MX53_CCM_BASE_ADDR
	mov r1, #0
	str r1, [r0, #MX5_CCM_CACRR]

	/* Switch ARM back to PLL 1 */
	mov r1, #0
	str r1, [r0, #MX5_CCM_CCSR]


	/* Restore the default values in the Gate registers */
	ldr r1, =0xFFFFFFFF
	str r1, [r0, #MX5_CCM_CCGR0]
	str r1, [r0, #MX5_CCM_CCGR1]
	str r1, [r0, #MX5_CCM_CCGR2]
	str r1, [r0, #MX5_CCM_CCGR3]
	str r1, [r0, #MX5_CCM_CCGR4]
	str r1, [r0, #MX5_CCM_CCGR5]
	str r1, [r0, #MX5_CCM_CCGR6]
#if 0
	str r1, [r0, #MX5_CCM_CCGR7]
#endif

	ldr r1, [r0, #MX5_CCM_CSCDR1]
	orr r1, r1, #0x3f
	eor r1, r1, #0x3f
	orr r1, r1, #0x21
	str r1, [r0, #MX5_CCM_CSCDR1]
	/* make sure divider effective */
1:	ldr r1, [r0, #MX5_CCM_CDHIPR]
	cmp r1, #0x0
	bne 1b

	mov r1, #0x0
	str r1, [r0, #MX5_CCM_CCDR]

	/* for cko - for ARM div by 8 */
	mov r1, #0x000A0000
	add r1, r1, #0x00000F0
	str r1, [r0, #MX5_CCM_CCOSR]
.endm

.globl board_init_lowlevel
board_init_lowlevel:
	mov r10, lr

	init_l2cc
	init_aips
	init_clock

	mov pc, r10

/* Board level setting value */
W_DP_OP_1000:		.word MX5_PLL_DP_OP_1000
W_DP_MFD_1000:		.word MX5_PLL_DP_MFD_1000
W_DP_MFN_1000:		.word MX5_PLL_DP_MFN_1000
W_DP_OP_800:		.word MX5_PLL_DP_OP_800
W_DP_MFD_800:		.word MX5_PLL_DP_MFD_800
W_DP_MFN_800:		.word MX5_PLL_DP_MFN_800
W_DP_OP_665:		.word MX5_PLL_DP_OP_665
W_DP_MFD_665:		.word MX5_PLL_DP_MFD_665
W_DP_MFN_665:		.word MX5_PLL_DP_MFN_665
W_DP_OP_216:		.word MX5_PLL_DP_OP_216
W_DP_MFD_216:		.word MX5_PLL_DP_MFD_216
W_DP_MFN_216:		.word MX5_PLL_DP_MFN_216