All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dirk Behme <dirk.behme@googlemail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] [ARM] TI DaVinci support, hopefully final [3/5]
Date: Wed, 08 Aug 2007 17:57:59 +0200	[thread overview]
Message-ID: <46B9E807.3090401@googlemail.com> (raw)
In-Reply-To: <Pine.LNX.4.64ksi.0708071411310.5509@home-gw.koi8.net>

ksi at koi8.net wrote:
> Signed-off-by: Sergey Kubushyn <ksi@koi8.net>

Acked-by: Dirk Behme <dirk.behme@gmail.com>

> diff -purN u-boot.git.orig/cpu/arm926ejs/davinci/lowlevel_init.S u-boot.git/cpu/arm926ejs/davinci/lowlevel_init.S
> --- u-boot.git.orig/cpu/arm926ejs/davinci/lowlevel_init.S	1969-12-31 16:00:00.000000000 -0800
> +++ u-boot.git/cpu/arm926ejs/davinci/lowlevel_init.S	2007-08-07 10:15:34.000000000 -0700
> @@ -0,0 +1,707 @@
> +/*
> + * Low-level board setup code for TI DaVinci SoC based boards.
> + *
> + * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
> + *
> + * Partially based on TI sources, original copyrights follow:
> + */
> +
> +/*
> + * Board specific setup info
> + *
> + * (C) Copyright 2003
> + * Texas Instruments, <www.ti.com>
> + * Kshitij Gupta <Kshitij@ti.com>
> + *
> + * Modified for OMAP 1610 H2 board by Nishant Kamat, Jan 2004
> + *
> + * Modified for OMAP 5912 OSK board by Rishi Bhattacharya, Apr 2004
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * Modified for DV-EVM board by Rishi Bhattacharya, Apr 2005
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * Modified for DV-EVM board by Swaminathan S, Nov 2005
> + * 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>
> +
> +.globl	lowlevel_init
> +lowlevel_init:
> +
> +	/*-------------------------------------------------------*
> +	 * Mask all IRQs by setting all bits in the EINT default *
> +	 *-------------------------------------------------------*/
> +	mov	r1, $0
> +	ldr	r0, =EINT_ENABLE0
> +	str	r1, [r0]
> +	ldr	r0, =EINT_ENABLE1
> +	str	r1, [r0]
> +
> +	/*------------------------------------------------------*
> +	 * Put the GEM in reset					*
> +	 *------------------------------------------------------*/
> +
> +	/* Put the GEM in reset */
> +	ldr	r8, PSC_GEM_FLAG_CLEAR
> +	ldr	r6, MDCTL_GEM
> +	ldr	r7, [r6]
> +	and	r7, r7, r8
> +	str	r7, [r6]
> +
> +	/* Enable the Power Domain Transition Command */
> +	ldr	r6, PTCMD
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x02
> +	str	r7, [r6]
> +
> +	/* Check for Transition Complete(PTSTAT) */
> +checkStatClkStopGem:
> +	ldr	r6, PTSTAT
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x02
> +	bne	checkStatClkStopGem
> +
> +	/* Check for GEM Reset Completion */
> +checkGemStatClkStop:
> +	ldr	r6, MDSTAT_GEM
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x100
> +	bne	checkGemStatClkStop
> +
> +	/* Do this for enabling a WDT initiated reset this is a workaround
> +	   for a chip bug.  Not required under normal situations */
> +	ldr	r6, P1394
> +	mov	r10, $0
> +	str	r10, [r6]
> +
> +	/*------------------------------------------------------*
> +	 * Enable L1 & L2 Memories in Fast mode                 *
> +	 *------------------------------------------------------*/
> +	ldr	r6, DFT_ENABLE
> +	mov	r10, $0x01
> +	str	r10, [r6]
> +
> +	ldr	r6, MMARG_BRF0
> +	ldr	r10, MMARG_BRF0_VAL
> +	str	r10, [r6]
> +
> +	ldr	r6, DFT_ENABLE
> +	mov	r10, $0
> +	str	r10, [r6]
> +
> +	/*------------------------------------------------------*
> +	 * DDR2 PLL Initialization			    	*
> +	 *------------------------------------------------------*/
> +
> +	/* Select the Clock Mode Depending on the Value written in the Boot Table by the run script */
> +	mov	r10, $0
> +	ldr	r6, PLL2_CTL
> +	ldr	r7, PLL_CLKSRC_MASK
> +	ldr	r8, [r6]
> +	and	r8, r8, r7
> +	mov	r9, r10, lsl $8
> +	orr	r8, r8, r9
> +	str	r8, [r6]
> +
> +	/* Select the PLLEN source */
> +	ldr	r7, PLL_ENSRC_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Bypass the PLL */
> +	ldr	r7, PLL_BYPASS_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Wait for few cycles to allow PLLEN Mux switch properly to bypass Clock */
> +	mov	r10, $0x20
> +WaitPPL2Loop:
> +	subs	r10, r10, $1
> +	bne	WaitPPL2Loop
> +
> +	/* Reset the PLL */
> +	ldr	r7, PLL_RESET_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Power up the PLL */
> +	ldr	r7, PLL_PWRUP_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Enable the PLL from Disable Mode */
> +	ldr	r7, PLL_DISABLE_ENABLE_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Program the PLL Multiplier */
> +	ldr	r6, PLL2_PLLM
> +	mov	r2, $0x17	/* 162 MHz */
> +	str	r2, [r6]
> +
> +	/* Program the PLL2 Divisor Value */
> +	ldr	r6, PLL2_DIV2
> +	mov	r3, $0x01
> +	str	r3, [r6]
> +
> +	/* Program the PLL2 Divisor Value */
> +	ldr	r6, PLL2_DIV1
> +	mov	r4, $0x0b	/* 54 MHz */
> +	str	r4, [r6]
> +
> +	/* PLL2 DIV2 MMR */
> +	ldr	r8, PLL2_DIV_MASK
> +	ldr	r6, PLL2_DIV2
> +	ldr	r9, [r6]
> +	and	r8, r8, r9
> +	mov	r9, $0x01
> +	mov	r9, r9, lsl $15
> +	orr	r8, r8, r9
> +	str	r8, [r6]
> +
> +	/* Program the GOSET bit to take new divider values */
> +	ldr	r6, PLL2_PLLCMD
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x01
> +	str	r7, [r6]
> +
> +	/* Wait for Done */
> +	ldr	r6, PLL2_PLLSTAT
> +doneLoop_0:
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x01
> +	bne	doneLoop_0
> +
> +	/* PLL2 DIV1 MMR */
> +	ldr	r8, PLL2_DIV_MASK
> +	ldr	r6, PLL2_DIV1
> +	ldr	r9, [r6]
> +	and	r8, r8, r9
> +	mov	r9, $0x01
> +	mov	r9, r9, lsl $15
> +	orr	r8, r8, r9
> +	str	r8, [r6]
> +
> +	/* Program the GOSET bit to take new divider values */
> +	ldr	r6, PLL2_PLLCMD
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x01
> +	str	r7, [r6]
> +
> +	/* Wait for Done */
> +	ldr	r6, PLL2_PLLSTAT
> +doneLoop:
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x01
> +	bne	doneLoop
> +
> +	/* Wait for PLL to Reset Properly */
> +	mov	r10, $0x218
> +ResetPPL2Loop:
> +	subs	r10, r10, $1
> +	bne	ResetPPL2Loop
> +
> +	/* Bring PLL out of Reset */
> +	ldr	r6, PLL2_CTL
> +	ldr	r8, [r6]
> +	orr	r8, r8, $0x08
> +	str	r8, [r6]
> +
> +	/* Wait for PLL to Lock */
> +	ldr	r10, PLL_LOCK_COUNT
> +PLL2Lock:
> +	subs	r10, r10, $1
> +	bne	PLL2Lock
> +
> +	/* Enable the PLL */
> +	ldr	r6, PLL2_CTL
> +	ldr	r8, [r6]
> +	orr	r8, r8, $0x01
> +	str	r8, [r6]
> +
> +	/*------------------------------------------------------*
> +	 * Issue Soft Reset to DDR Module			*
> +	 *------------------------------------------------------*/
> +
> +	/* Shut down the DDR2 LPSC Module */
> +	ldr	r8, PSC_FLAG_CLEAR
> +	ldr	r6, MDCTL_DDR2
> +	ldr	r7, [r6]
> +	and	r7, r7, r8
> +	orr	r7, r7, $0x03
> +	str	r7, [r6]
> +
> +	/* Enable the Power Domain Transition Command */
> +	ldr	r6, PTCMD
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x01
> +	str	r7, [r6]
> +
> +	/* Check for Transition Complete(PTSTAT) */
> +checkStatClkStop:
> +	ldr	r6, PTSTAT
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x01
> +	bne	checkStatClkStop
> +
> +	/* Check for DDR2 Controller Enable Completion */
> +checkDDRStatClkStop:
> +	ldr	r6, MDSTAT_DDR2
> +	ldr	r7, [r6]
> +	and	r7, r7, $0x1f
> +	cmp	r7, $0x03
> +	bne	checkDDRStatClkStop
> +
> +	/*------------------------------------------------------*
> +	 * Program DDR2 MMRs for 162MHz Setting			*
> +	 *------------------------------------------------------*/
> +
> +	/* Program PHY Control Register */
> +	ldr	r6, DDRCTL
> +	ldr	r7, DDRCTL_VAL
> +	str	r7, [r6]
> +
> +	/* Program SDRAM Bank Config Register */
> +	ldr	r6, SDCFG
> +	ldr	r7, SDCFG_VAL
> +	str	r7, [r6]
> +
> +	/* Program SDRAM TIM-0 Config Register */
> +	ldr	r6, SDTIM0
> +	ldr	r7, SDTIM0_VAL_162MHz
> +	str	r7, [r6]
> +
> +	/* Program SDRAM TIM-1 Config Register */
> +	ldr	r6, SDTIM1
> +	ldr	r7, SDTIM1_VAL_162MHz
> +	str	r7, [r6]
> +
> +	/* Program the SDRAM Bank Config Control Register */
> +	ldr	r10, MASK_VAL
> +	ldr	r8, SDCFG
> +	ldr	r9, SDCFG_VAL
> +	and	r9, r9, r10
> +	str	r9, [r8]
> +
> +	/* Program SDRAM SDREF Config Register */
> +	ldr	r6, SDREF
> +	ldr	r7, SDREF_VAL
> +	str	r7, [r6]
> +
> +	/*------------------------------------------------------*
> +	 * Issue Soft Reset to DDR Module			*
> +	 *------------------------------------------------------*/
> +
> +	/* Issue a Dummy DDR2 read/write */
> +	ldr	r8, DDR2_START_ADDR
> +	ldr	r7, DUMMY_VAL
> +	str	r7, [r8]
> +	ldr	r7, [r8]
> +
> +	/* Shut down the DDR2 LPSC Module */
> +	ldr	r8, PSC_FLAG_CLEAR
> +	ldr	r6, MDCTL_DDR2
> +	ldr	r7, [r6]
> +	and	r7, r7, r8
> +	orr	r7, r7, $0x01
> +	str	r7, [r6]
> +
> +	/* Enable the Power Domain Transition Command */
> +	ldr	r6, PTCMD
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x01
> +	str	r7, [r6]
> +
> +	/* Check for Transition Complete(PTSTAT) */
> +checkStatClkStop2:
> +	ldr	r6, PTSTAT
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x01
> +	bne	checkStatClkStop2
> +
> +	/* Check for DDR2 Controller Enable Completion */
> +checkDDRStatClkStop2:
> +	ldr	r6, MDSTAT_DDR2
> +	ldr	r7, [r6]
> +	and	r7, r7, $0x1f
> +	cmp	r7, $0x01
> +	bne	checkDDRStatClkStop2
> +
> +	/*------------------------------------------------------*
> +	 * Turn DDR2 Controller Clocks On			*
> +	 *------------------------------------------------------*/
> +
> +	/* Enable the DDR2 LPSC Module */
> +	ldr	r6, MDCTL_DDR2
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x03
> +	str	r7, [r6]
> +
> +	/* Enable the Power Domain Transition Command */
> +	ldr	r6, PTCMD
> +	ldr	r7, [r6]
> +	orr	r7, r7, $0x01
> +	str	r7, [r6]
> +
> +	/* Check for Transition Complete(PTSTAT) */
> +checkStatClkEn2:
> +	ldr	r6, PTSTAT
> +	ldr	r7, [r6]
> +	ands	r7, r7, $0x01
> +	bne	checkStatClkEn2
> +
> +	/* Check for DDR2 Controller Enable Completion */
> +checkDDRStatClkEn2:
> +	ldr	r6, MDSTAT_DDR2
> +	ldr	r7, [r6]
> +	and	r7, r7, $0x1f
> +	cmp	r7, $0x03
> +	bne	checkDDRStatClkEn2
> +
> +	/*  DDR Writes and Reads */
> +	ldr	r6, CFGTEST
> +	mov	r3, $0x01
> +	str	r3, [r6]
> +
> +	/*------------------------------------------------------*
> +	 * System PLL Initialization				*
> +	 *------------------------------------------------------*/
> +
> +	/* Select the Clock Mode Depending on the Value written in the Boot Table by the run script */
> +	mov	r2, $0
> +	ldr	r6, PLL1_CTL
> +	ldr	r7, PLL_CLKSRC_MASK
> +	ldr	r8, [r6]
> +	and	r8, r8, r7
> +	mov	r9, r2, lsl $8
> +	orr	r8, r8, r9
> +	str	r8, [r6]
> +
> +	/* Select the PLLEN source */
> +	ldr	r7, PLL_ENSRC_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Bypass the PLL */
> +	ldr	r7, PLL_BYPASS_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Wait for few cycles to allow PLLEN Mux switch properly to bypass Clock */
> +	mov	r10, $0x20
> +
> +WaitLoop:
> +	subs	r10, r10, $1
> +	bne	WaitLoop
> +
> +	/* Reset the PLL */
> +	ldr	r7, PLL_RESET_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Disable the PLL */
> +	orr	r8, r8, $0x10
> +	str	r8, [r6]
> +
> +	/* Power up the PLL */
> +	ldr	r7, PLL_PWRUP_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Enable the PLL from Disable Mode */
> +	ldr	r7, PLL_DISABLE_ENABLE_MASK
> +	and	r8, r8, r7
> +	str	r8, [r6]
> +
> +	/* Program the PLL Multiplier */
> +	ldr	r6, PLL1_PLLM
> +	mov	r3, $0x15	/* For 594MHz */
> +	str	r3, [r6]
> +
> +	/* Wait for PLL to Reset Properly */
> +	mov	r10, $0xff
> +
> +ResetLoop:
> +	subs	r10, r10, $1
> +	bne	ResetLoop
> +
> +	/* Bring PLL out of Reset */
> +	ldr	r6, PLL1_CTL
> +	orr	r8, r8, $0x08
> +	str	r8, [r6]
> +
> +	/* Wait for PLL to Lock */
> +	ldr	r10, PLL_LOCK_COUNT
> +
> +PLL1Lock:
> +	subs	r10, r10, $1
> +	bne	PLL1Lock
> +
> +	/* Enable the PLL */
> +	orr	r8, r8, $0x01
> +	str	r8, [r6]
> +
> +	nop
> +	nop
> +	nop
> +	nop
> +
> +	/*------------------------------------------------------*
> +	 * AEMIF configuration for NOR Flash (double check)     *
> +	 *------------------------------------------------------*/
> +	ldr	r0, _PINMUX0
> +	ldr	r1, _DEV_SETTING
> +	str	r1, [r0]
> +
> +	ldr	r0, WAITCFG
> +	ldr	r1, WAITCFG_VAL
> +	ldr	r2, [r0]
> +	orr	r2, r2, r1
> +	str	r2, [r0]
> +
> +	ldr	r0, ACFG3
> +	ldr	r1, ACFG3_VAL
> +	ldr	r2, [r0]
> +	and	r1, r2, r1
> +	str	r1, [r0]
> +
> +	ldr	r0, ACFG4
> +	ldr	r1, ACFG4_VAL
> +	ldr	r2, [r0]
> +	and	r1, r2, r1
> +	str	r1, [r0]
> +
> +	ldr	r0, ACFG5
> +	ldr	r1, ACFG5_VAL
> +	ldr	r2, [r0]
> +	and	r1, r2, r1
> +	str	r1, [r0]
> +
> +	/*--------------------------------------*
> +	 * VTP manual Calibration               *
> +	 *--------------------------------------*/
> +	ldr	r0, VTPIOCR
> +	ldr	r1, VTP_MMR0
> +	str	r1, [r0]
> +
> +	ldr	r0, VTPIOCR
> +	ldr	r1, VTP_MMR1
> +	str	r1, [r0]
> +
> +	/* Wait for 33 VTP CLK cycles.  VRP operates at 27 MHz */
> +	ldr	r10, VTP_LOCK_COUNT
> +VTPLock:
> +	subs	r10, r10, $1
> +	bne	VTPLock
> +
> +	ldr	r6, DFT_ENABLE
> +	mov	r10, $0x01
> +	str	r10, [r6]
> +
> +	ldr	r6, DDRVTPR
> +	ldr	r7, [r6]
> +	and	r7, r7, $0x1f
> +	and	r8, r7, $0x3e0
> +	orr	r8, r7, r8
> +	ldr	r7, VTP_RECAL
> +	orr	r8, r7, r8
> +	ldr	r7, VTP_EN
> +	orr	r8, r7, r8
> +	str	r8, [r0]
> +
> +
> +	/* Wait for 33 VTP CLK cycles.  VRP operates at 27 MHz */
> +	ldr	r10, VTP_LOCK_COUNT
> +VTP1Lock:
> +	subs	r10, r10, $1
> +	bne	VTP1Lock
> +
> +	ldr	r1, [r0]
> +	ldr	r2, VTP_MASK
> +	and	r2, r1, r2
> +	str	r2, [r0]
> +
> +	ldr	r6, DFT_ENABLE
> +	mov	r10, $0
> +	str	r10, [r6]
> +
> +	/* 
> +	 * Call board-specific lowlevel init.
> + 	 * That MUST be present and THAT returns
> +	 * back to arch calling code with "mov pc, lr."
> +	 */
> +	b	dv_board_init
> +
> +.ltorg
> +
> +_PINMUX0:
> +	.word	0x01c40000		/* Device Configuration Registers */
> +_PINMUX1:
> +	.word	0x01c40004		/* Device Configuration Registers */
> +
> +_DEV_SETTING:
> +	.word	0x00000c1f
> +
> +WAITCFG:
> +	.word	0x01e00004
> +WAITCFG_VAL:
> +	.word	0
> +ACFG3:
> +	.word	0x01e00014
> +ACFG3_VAL:
> +	.word	0x3ffffffd
> +ACFG4:
> +	.word	0x01e00018
> +ACFG4_VAL:
> +	.word	0x3ffffffd
> +ACFG5:
> +	.word	0x01e0001c
> +ACFG5_VAL:
> +	.word	0x3ffffffd
> +
> +MDCTL_DDR2:
> +	.word	0x01c41a34
> +MDSTAT_DDR2:
> +	.word	0x01c41834
> +
> +PTCMD:
> +	.word	0x01c41120
> +PTSTAT:
> +	.word	0x01c41128
> +
> +EINT_ENABLE0:
> +	.word	0x01c48018
> +EINT_ENABLE1:
> +	.word	0x01c4801c
> +
> +PSC_FLAG_CLEAR:
> +	.word	0xffffffe0
> +PSC_GEM_FLAG_CLEAR:
> +	.word	0xfffffeff
> +
> +/* DDR2 MMR & CONFIGURATION VALUES, 162 MHZ clock */
> +DDRCTL:
> +	.word	0x200000e4
> +DDRCTL_VAL:
> +	.word	0x50006405
> +SDREF:
> +	.word	0x2000000c
> +SDREF_VAL:
> +	.word	0x000005c3
> +SDCFG:
> +	.word	0x20000008
> +SDCFG_VAL:
> +#ifdef	DDR_4BANKS
> +	.word	0x00178622
> +#elif defined DDR_8BANKS
> +	.word	0x00178632
> +#else
> +#error "Unknown DDR configuration!!!"
> +#endif
> +SDTIM0:
> +	.word	0x20000010
> +SDTIM0_VAL_162MHz:
> +	.word	0x28923211
> +SDTIM1:
> +	.word	0x20000014
> +SDTIM1_VAL_162MHz:
> +	.word	0x0016c722
> +VTPIOCR:
> +	.word	0x200000f0	/* VTP IO Control register */
> +DDRVTPR:
> +	.word	0x01c42030	/* DDR VPTR MMR */
> +VTP_MMR0:
> +	.word	0x201f
> +VTP_MMR1:
> +	.word	0xa01f
> +DFT_ENABLE:
> +	.word	0x01c4004c
> +VTP_LOCK_COUNT:
> +	.word	0x5b0
> +VTP_MASK:
> +	.word	0xffffdfff
> +VTP_RECAL:
> +	.word	0x40000
> +VTP_EN:
> +	.word	0x02000
> +CFGTEST:
> +	.word	0x80010000
> +MASK_VAL:
> +	.word	0x00000fff
> +
> +/* GEM Power Up & LPSC Control Register */
> +MDCTL_GEM:
> +	.word	0x01c41a9c
> +MDSTAT_GEM:
> +	.word	0x01c4189c
> +
> +/* For WDT reset chip bug */
> +P1394:
> +	.word	0x01c41a20
> +
> +PLL_CLKSRC_MASK:
> +	.word	0xfffffeff	/* Mask the Clock Mode bit */
> +PLL_ENSRC_MASK:
> +	.word	0xffffffdf	/* Select the PLLEN source */
> +PLL_BYPASS_MASK:
> +	.word	0xfffffffe	/* Put the PLL in BYPASS */
> +PLL_RESET_MASK:
> +	.word	0xfffffff7	/* Put the PLL in Reset Mode */
> +PLL_PWRUP_MASK:
> +	.word	0xfffffffd	/* PLL Power up Mask Bit  */
> +PLL_DISABLE_ENABLE_MASK:
> +	.word	0xffffffef	/* Enable the PLL from Disable */
> +PLL_LOCK_COUNT:
> +	.word	0x2000
> +
> +/* PLL1-SYSTEM PLL MMRs */
> +PLL1_CTL:
> +	.word	0x01c40900
> +PLL1_PLLM:
> +	.word	0x01c40910
> +
> +/* PLL2-SYSTEM PLL MMRs */
> +PLL2_CTL:
> +	.word	0x01c40d00
> +PLL2_PLLM:
> +	.word	0x01c40d10
> +PLL2_DIV1:
> +	.word	0x01c40d18
> +PLL2_DIV2:
> +	.word	0x01c40d1c
> +PLL2_PLLCMD:
> +	.word	0x01c40d38
> +PLL2_PLLSTAT:
> +	.word	0x01c40d3c
> +PLL2_DIV_MASK:
> +	.word	0xffff7fff
> +
> +MMARG_BRF0:
> +	.word	0x01c42010	/* BRF margin mode 0 (R/W)*/
> +MMARG_BRF0_VAL:
> +	.word	0x00444400
> +
> +DDR2_START_ADDR:
> +	.word	0x80000000
> +DUMMY_VAL:
> +	.word	0xa55aa55a
> diff -purN u-boot.git.orig/cpu/arm926ejs/davinci/lxt972.c u-boot.git/cpu/arm926ejs/davinci/lxt972.c
> --- u-boot.git.orig/cpu/arm926ejs/davinci/lxt972.c	1969-12-31 16:00:00.000000000 -0800
> +++ u-boot.git/cpu/arm926ejs/davinci/lxt972.c	2007-08-07 10:23:53.000000000 -0700
> @@ -0,0 +1,142 @@
> +/*
> + * Intel LXT971/LXT972 PHY Driver for TI DaVinci
> + * (TMS320DM644x) based boards.
> + *
> + * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
> + *
> + * --------------------------------------------------------
> + *
> + * 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 <common.h>
> +#include <net.h>
> +#include <lxt971a.h>
> +#include <asm/arch/emac_defs.h>
> +
> +#ifdef CONFIG_DRIVER_TI_EMAC
> +
> +#ifdef CONFIG_CMD_NET
> +
> +int lxt972_is_phy_connected(int phy_addr)
> +{
> +	u_int16_t	id1, id2;
> +
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_COMMON_ID1, &id1))
> +		return(0);
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_COMMON_ID2, &id2))
> +		return(0);
> +
> +	if ((id1 == (0x0013)) && ((id2  & 0xfff0) == 0x78e0))
> +		return(1);
> +
> +	return(0);
> +}
> +
> +int lxt972_get_link_speed(int phy_addr)
> +{
> +	u_int16_t		stat1, tmp;
> +	volatile emac_regs*	emac = (emac_regs *)EMAC_BASE_ADDR;
> +
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_LXT971_STAT2, &stat1))
> +		return(0);
> +
> +	if (!(stat1 & PHY_LXT971_STAT2_LINK))	/* link up? */
> +		return(0);
> +
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_LXT971_DIG_CFG, &tmp))
> +		return(0);
> +
> +	tmp |= PHY_LXT971_DIG_CFG_MII_DRIVE;
> +
> +	dm644x_eth_phy_write(phy_addr, PHY_LXT971_DIG_CFG, tmp);
> +	/* Read back */
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_LXT971_DIG_CFG, &tmp))
> +		return(0);
> +
> +
> +	/* Speed doesn't matter, there is no setting for it in EMAC... */
> +	if (stat1 & PHY_LXT971_STAT2_100BTX) {
> +		if (stat1 & PHY_LXT971_STAT2_DUPLEX_MODE) {
> +			/* set DM644x EMAC for Full Duplex  */
> +			emac->MACCONTROL = EMAC_MACCONTROL_MIIEN_ENABLE | EMAC_MACCONTROL_FULLDUPLEX_ENABLE;
> +		} else {
> +			/*set DM644x EMAC for Half Duplex  */
> +			emac->MACCONTROL = EMAC_MACCONTROL_MIIEN_ENABLE;
> +		}
> +
> +		return(1);
> +	} else {
> +		if (stat1 & PHY_LXT971_STAT2_DUPLEX_MODE) {
> +			/* set DM644x EMAC for Full Duplex  */
> +			emac->MACCONTROL = EMAC_MACCONTROL_MIIEN_ENABLE | EMAC_MACCONTROL_FULLDUPLEX_ENABLE;
> +		} else {
> +			/*set DM644x EMAC for Half Duplex  */
> +			emac->MACCONTROL = EMAC_MACCONTROL_MIIEN_ENABLE;
> +		}
> +
> +		return(1);
> +	}
> +
> +	return(0);
> +}
> +
> +
> +int lxt972_init_phy(int phy_addr)
> +{
> +	int	ret = 1;
> +
> +	if (!lxt972_get_link_speed(phy_addr)) {
> +		/* Try another time */
> +		ret = lxt972_get_link_speed(phy_addr);
> +	}
> +
> +	/* Disable PHY Interrupts */
> +	dm644x_eth_phy_write(phy_addr, PHY_LXT971_INT_ENABLE, 0);
> +
> +	return(ret);
> +}
> +
> +
> +int lxt972_auto_negotiate(int phy_addr)
> +{
> +	u_int16_t	tmp;
> +
> +
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_COMMON_CTRL, &tmp))
> +		return(0);
> +
> +	/* Restart Auto_negotiation  */
> +	tmp |= PHY_COMMON_CTRL_RES_AUTO;
> +	dm644x_eth_phy_write(phy_addr, PHY_COMMON_CTRL, tmp);
> +
> +	/*check AutoNegotiate complete */
> +	udelay (10000);
> +	if (!dm644x_eth_phy_read(phy_addr, PHY_COMMON_STAT, &tmp))
> +		return(0);
> +
> +	if (!(tmp & PHY_COMMON_STAT_AN_COMP))
> +		return(0);
> +
> +	return (lxt972_get_link_speed(phy_addr));
> +}
> +
> +#endif	/* CONFIG_CMD_NET */
> +
> +#endif	/* CONFIG_DRIVER_ETHER */
> diff -purN u-boot.git.orig/cpu/arm926ejs/davinci/nand.c u-boot.git/cpu/arm926ejs/davinci/nand.c
> --- u-boot.git.orig/cpu/arm926ejs/davinci/nand.c	1969-12-31 16:00:00.000000000 -0800
> +++ u-boot.git/cpu/arm926ejs/davinci/nand.c	2007-08-07 10:15:34.000000000 -0700
> @@ -0,0 +1,389 @@
> +/*
> + * NAND driver for TI DaVinci based boards.
> + *
> + * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
> + *
> + * Based on Linux DaVinci NAND driver by TI. Original copyright follows:
> + */
> +
> +/*
> + *
> + * linux/drivers/mtd/nand/nand_davinci.c
> + *
> + * NAND Flash Driver
> + *
> + * Copyright (C) 2006 Texas Instruments.
> + *
> + * ----------------------------------------------------------------------------
> + *
> + * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
> + * ----------------------------------------------------------------------------
> + *
> + *  Overview:
> + *   This is a device driver for the NAND flash device found on the
> + *   DaVinci board which utilizes the Samsung k9k2g08 part.
> + *
> + Modifications:
> + ver. 1.0: Feb 2005, Vinod/Sudhakar
> + -
> + *
> + */
> +
> +#include <common.h>
> +
> +#ifdef CFG_USE_NAND
> +#if !defined(CFG_NAND_LEGACY)
> +
> +#include <nand.h>
> +#include <asm/arch/nand_defs.h>
> +#include <asm/arch/emif_defs.h>
> +
> +extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
> +
> +static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd)
> +{
> +	struct		nand_chip *this = mtd->priv;
> +	u_int32_t	IO_ADDR_W = (u_int32_t)this->IO_ADDR_W;
> +
> +	IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);
> +
> +	switch (cmd) {
> +		case NAND_CTL_SETCLE:
> +			IO_ADDR_W |= MASK_CLE;
> +			break;
> +		case NAND_CTL_SETALE:
> +			IO_ADDR_W |= MASK_ALE;
> +			break;
> +	}
> +
> +	this->IO_ADDR_W = (void *)IO_ADDR_W;
> +}
> +
> +/* Set WP on deselect, write enable on select */
> +static void nand_davinci_select_chip(struct mtd_info *mtd, int chip)
> +{
> +#define GPIO_SET_DATA01	0x01c67018
> +#define GPIO_CLR_DATA01	0x01c6701c
> +#define GPIO_NAND_WP	(1 << 4)
> +#ifdef SONATA_BOARD_GPIOWP
> +	if (chip < 0) {
> +		REG(GPIO_CLR_DATA01) |= GPIO_NAND_WP;
> +	} else {
> +		REG(GPIO_SET_DATA01) |= GPIO_NAND_WP;
> +	}
> +#endif
> +}
> +
> +#ifdef CFG_NAND_HW_ECC
> +#ifdef CFG_NAND_LARGEPAGE
> +static struct nand_oobinfo davinci_nand_oobinfo = {
> +	.useecc = MTD_NANDECC_AUTOPLACE,
> +	.eccbytes = 12,
> +	.eccpos = {8, 9, 10, 24, 25, 26, 40, 41, 42, 56, 57, 58},
> +	.oobfree = { {2, 6}, {12, 12}, {28, 12}, {44, 12}, {60, 4} }
> +};
> +#elif defined(CFG_NAND_SMALLPAGE)
> +static struct nand_oobinfo davinci_nand_oobinfo = {
> +	.useecc = MTD_NANDECC_AUTOPLACE,
> +	.eccbytes = 3,
> +	.eccpos = {0, 1, 2},
> +	.oobfree = { {6, 2}, {8, 8} }
> +};
> +#else
> +#error "Either CFG_NAND_LARGEPAGE or CFG_NAND_SMALLPAGE must be defined!"
> +#endif
> +
> +static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
> +{
> +	emifregs	emif_addr;
> +	int		dummy;
> +
> +	emif_addr = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;
> +
> +	dummy = emif_addr->NANDF1ECC;
> +	dummy = emif_addr->NANDF2ECC;
> +	dummy = emif_addr->NANDF3ECC;
> +	dummy = emif_addr->NANDF4ECC;
> +
> +	emif_addr->NANDFCR |= (1 << 8);
> +}
> +
> +static u_int32_t nand_davinci_readecc(struct mtd_info *mtd, u_int32_t region)
> +{
> +	u_int32_t	ecc = 0;
> +	emifregs	emif_base_addr;
> +
> +	emif_base_addr = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;
> +
> +	if (region == 1)
> +		ecc = emif_base_addr->NANDF1ECC;
> +	else if (region == 2)
> +		ecc = emif_base_addr->NANDF2ECC;
> +	else if (region == 3)
> +		ecc = emif_base_addr->NANDF3ECC;
> +	else if (region == 4)
> +		ecc = emif_base_addr->NANDF4ECC;
> +
> +	return(ecc);
> +}
> +
> +static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code)
> +{
> +	u_int32_t		tmp;
> +	int			region, n;
> +	struct nand_chip	*this = mtd->priv;
> +
> +	n = (this->eccmode == NAND_ECC_HW12_2048) ? 4 : 1;
> +
> +	region = 1;
> +	while (n--) {
> +		tmp = nand_davinci_readecc(mtd, region);
> +		*ecc_code++ = tmp;
> +		*ecc_code++ = tmp >> 16;
> +		*ecc_code++ = ((tmp >> 8) & 0x0f) | ((tmp >> 20) & 0xf0);
> +		region++;
> +	}
> +	return(0);
> +}
> +
> +static void nand_davinci_gen_true_ecc(u_int8_t *ecc_buf)
> +{
> +	u_int32_t	tmp = ecc_buf[0] | (ecc_buf[1] << 16) | ((ecc_buf[2] & 0xf0) << 20) | ((ecc_buf[2] & 0x0f) << 8);
> +
> +	ecc_buf[0] = ~(P64o(tmp) | P64e(tmp) | P32o(tmp) | P32e(tmp) | P16o(tmp) | P16e(tmp) | P8o(tmp) | P8e(tmp));
> +	ecc_buf[1] = ~(P1024o(tmp) | P1024e(tmp) | P512o(tmp) | P512e(tmp) | P256o(tmp) | P256e(tmp) | P128o(tmp) | P128e(tmp));
> +	ecc_buf[2] = ~( P4o(tmp) | P4e(tmp) | P2o(tmp) | P2e(tmp) | P1o(tmp) | P1e(tmp) | P2048o(tmp) | P2048e(tmp));
> +}
> +
> +static int nand_davinci_compare_ecc(u_int8_t *ecc_nand, u_int8_t *ecc_calc, u_int8_t *page_data)
> +{
> +	u_int32_t	i;
> +	u_int8_t	tmp0_bit[8], tmp1_bit[8], tmp2_bit[8];
> +	u_int8_t	comp0_bit[8], comp1_bit[8], comp2_bit[8];
> +	u_int8_t	ecc_bit[24];
> +	u_int8_t	ecc_sum = 0;
> +	u_int8_t	find_bit = 0;
> +	u_int32_t	find_byte = 0;
> +	int		is_ecc_ff;
> +
> +	is_ecc_ff = ((*ecc_nand == 0xff) && (*(ecc_nand + 1) == 0xff) && (*(ecc_nand + 2) == 0xff));
> +
> +	nand_davinci_gen_true_ecc(ecc_nand);
> +	nand_davinci_gen_true_ecc(ecc_calc);
> +
> +	for (i = 0; i <= 2; i++) {
> +		*(ecc_nand + i) = ~(*(ecc_nand + i));
> +		*(ecc_calc + i) = ~(*(ecc_calc + i));
> +	}
> +
> +	for (i = 0; i < 8; i++) {
> +		tmp0_bit[i] = *ecc_nand % 2;
> +		*ecc_nand = *ecc_nand / 2;
> +	}
> +
> +	for (i = 0; i < 8; i++) {
> +		tmp1_bit[i] = *(ecc_nand + 1) % 2;
> +		*(ecc_nand + 1) = *(ecc_nand + 1) / 2;
> +	}
> +
> +	for (i = 0; i < 8; i++) {
> +		tmp2_bit[i] = *(ecc_nand + 2) % 2;
> +		*(ecc_nand + 2) = *(ecc_nand + 2) / 2;
> +	}
> +
> +	for (i = 0; i < 8; i++) {
> +		comp0_bit[i] = *ecc_calc % 2;
> +		*ecc_calc = *ecc_calc / 2;
> +	}
> +
> +	for (i = 0; i < 8; i++) {
> +		comp1_bit[i] = *(ecc_calc + 1) % 2;
> +		*(ecc_calc + 1) = *(ecc_calc + 1) / 2;
> +	}
> +
> +	for (i = 0; i < 8; i++) {
> +		comp2_bit[i] = *(ecc_calc + 2) % 2;
> +		*(ecc_calc + 2) = *(ecc_calc + 2) / 2;
> +	}
> +
> +	for (i = 0; i< 6; i++)
> +		ecc_bit[i] = tmp2_bit[i + 2] ^ comp2_bit[i + 2];
> +
> +	for (i = 0; i < 8; i++)
> +		ecc_bit[i + 6] = tmp0_bit[i] ^ comp0_bit[i];
> +
> +	for (i = 0; i < 8; i++)
> +		ecc_bit[i + 14] = tmp1_bit[i] ^ comp1_bit[i];
> +
> +	ecc_bit[22] = tmp2_bit[0] ^ comp2_bit[0];
> +	ecc_bit[23] = tmp2_bit[1] ^ comp2_bit[1];
> +
> +	for (i = 0; i < 24; i++)
> +		ecc_sum += ecc_bit[i];
> +
> +	switch (ecc_sum) {
> +		case 0:
> +			/* Not reached because this function is not called if
> +			   ECC values are equal */
> +			return 0;
> +		case 1:
> +			/* Uncorrectable error */
> +			DEBUG (MTD_DEBUG_LEVEL0, "ECC UNCORRECTED_ERROR 1\n");
> +			return(-1);
> +		case 12:
> +			/* Correctable error */
> +			find_byte = (ecc_bit[23] << 8) +
> +				(ecc_bit[21] << 7) +
> +				(ecc_bit[19] << 6) +
> +				(ecc_bit[17] << 5) +
> +				(ecc_bit[15] << 4) +
> +				(ecc_bit[13] << 3) +
> +				(ecc_bit[11] << 2) +
> +				(ecc_bit[9]  << 1) +
> +				ecc_bit[7];
> +
> +			find_bit = (ecc_bit[5] << 2) + (ecc_bit[3] << 1) + ecc_bit[1];
> +
> +			DEBUG (MTD_DEBUG_LEVEL0, "Correcting single bit ECC error at offset: %d, bit: %d\n", find_byte, find_bit);
> +
> +			page_data[find_byte] ^= (1 << find_bit);
> +
> +			return(0);
> +		default:
> +			if (is_ecc_ff) {
> +				if (ecc_calc[0] == 0 && ecc_calc[1] == 0 && ecc_calc[2] == 0)
> +					return(0);
> +			}
> +			DEBUG (MTD_DEBUG_LEVEL0, "UNCORRECTED_ERROR default\n");
> +			return(-1);
> +	}
> +}
> +
> +static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc)
> +{
> +	struct nand_chip	*this;
> +	int			block_count = 0, i, rc;
> +
> +	this = mtd->priv;
> +	block_count = (this->eccmode == NAND_ECC_HW12_2048) ? 4 : 1;
> +	for (i = 0; i < block_count; i++) {
> +		if (memcmp(read_ecc, calc_ecc, 3) != 0) {
> +			rc = nand_davinci_compare_ecc(read_ecc, calc_ecc, dat);
> +			if (rc < 0) {
> +				return(rc);
> +			}
> +		}
> +		read_ecc += 3;
> +		calc_ecc += 3;
> +		dat += 512;
> +	}
> +	return(0);
> +}
> +#endif
> +
> +static int nand_davinci_dev_ready(struct mtd_info *mtd)
> +{
> +	emifregs	emif_addr;
> +
> +	emif_addr = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;
> +
> +	return(emif_addr->NANDFSR & 0x1);
> +}
> +
> +static int nand_davinci_waitfunc(struct mtd_info *mtd, struct nand_chip *this, int state)
> +{
> +	while(!nand_davinci_dev_ready(mtd)) {;}
> +	*NAND_CE0CLE = NAND_STATUS;
> +	return(*NAND_CE0DATA);
> +}
> +
> +static void nand_flash_init(void)
> +{
> +	u_int32_t	acfg1 = 0x3ffffffc;
> +	u_int32_t	acfg2 = 0x3ffffffc;
> +	u_int32_t	acfg3 = 0x3ffffffc;
> +	u_int32_t	acfg4 = 0x3ffffffc;
> +	emifregs	emif_regs;
> +
> +	/*------------------------------------------------------------------*
> +	 *  NAND FLASH CHIP TIMEOUT @ 459 MHz                               *
> +	 *                                                                  *
> +	 *  AEMIF.CLK freq   = PLL1/6 = 459/6 = 76.5 MHz                    *
> +	 *  AEMIF.CLK period = 1/76.5 MHz = 13.1 ns                         *
> +	 *                                                                  *
> +	 *------------------------------------------------------------------*/
> +	 acfg1 = 0
> +	 	| (0 << 31 )	/* selectStrobe */
> +	 	| (0 << 30 )	/* extWait */
> +	 	| (1 << 26 )	/* writeSetup	10 ns */
> +	 	| (3 << 20 )	/* writeStrobe	40 ns */
> +	 	| (1 << 17 )	/* writeHold	10 ns */
> +	 	| (1 << 13 )	/* readSetup	10 ns */
> +	 	| (5 << 7 )	/* readStrobe	60 ns */
> +	 	| (1 << 4 )	/* readHold	10 ns */
> +	 	| (3 << 2 )	/* turnAround	?? ns */
> +	 	| (0 << 0 )	/* asyncSize	8-bit bus */
> +	 	;
> +
> +	emif_regs = (emifregs)DAVINCI_ASYNC_EMIF_CNTRL_BASE;
> +
> +	emif_regs->AWCCR |= 0x10000000;
> +	emif_regs->AB1CR = acfg1;	/* 0x08244128 */;
> +	emif_regs->AB2CR = acfg2;
> +	emif_regs->AB3CR = acfg3;
> +	emif_regs->AB4CR = acfg4;
> +	emif_regs->NANDFCR = 0x00000101;
> +}
> +
> +int board_nand_init(struct nand_chip *nand)
> +{
> +	nand->IO_ADDR_R   = (void  __iomem *)NAND_CE0DATA;
> +	nand->IO_ADDR_W   = (void  __iomem *)NAND_CE0DATA;
> +	nand->chip_delay  = 0;
> +	nand->select_chip = nand_davinci_select_chip;
> +#ifdef CFG_NAND_USE_FLASH_BBT
> +	nand->options	  = NAND_USE_FLASH_BBT;
> +#endif
> +#ifdef CFG_NAND_HW_ECC
> +#ifdef CFG_NAND_LARGEPAGE
> +	nand->eccmode     = NAND_ECC_HW12_2048;
> +#elif defined(CFG_NAND_SMALLPAGE)
> +	nand->eccmode     = NAND_ECC_HW3_512;
> +#else
> +#error "Either CFG_NAND_LARGEPAGE or CFG_NAND_SMALLPAGE must be defined!"
> +#endif
> +	nand->autooob	  = &davinci_nand_oobinfo;
> +	nand->calculate_ecc = nand_davinci_calculate_ecc;
> +	nand->correct_data  = nand_davinci_correct_data;
> +	nand->enable_hwecc  = nand_davinci_enable_hwecc;
> +#else
> +	nand->eccmode     = NAND_ECC_SOFT;
> +#endif
> +
> +	/* Set address of hardware control function */
> +	nand->hwcontrol = nand_davinci_hwcontrol;
> +
> +	nand->dev_ready = nand_davinci_dev_ready;
> +	nand->waitfunc = nand_davinci_waitfunc;
> +
> +	nand_flash_init();
> +
> +	return(0);
> +}
> +
> +#else
> +#error "U-Boot legacy NAND support not available for DaVinci chips"
> +#endif
> +#endif	/* CFG_USE_NAND */
> diff -purN u-boot.git.orig/cpu/arm926ejs/davinci/reset.S u-boot.git/cpu/arm926ejs/davinci/reset.S
> --- u-boot.git.orig/cpu/arm926ejs/davinci/reset.S	1969-12-31 16:00:00.000000000 -0800
> +++ u-boot.git/cpu/arm926ejs/davinci/reset.S	2007-08-07 10:15:34.000000000 -0700
> @@ -0,0 +1,77 @@
> +/*
> + * Processor reset using WDT for TI TMS320DM644x SoC.
> + *
> + * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
> + *
> + * -----------------------------------------------------
> + *
> + * 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
> + */
> +
> +.globl reset_cpu
> +reset_cpu:
> +	ldr	r0, WDT_TGCR
> +	mov	r1, $0x08
> +	str	r1, [r0]
> +	ldr	r1, [r0]
> +	orr	r1, r1, $0x03
> +	str	r1, [r0]
> +	mov	r1, $0
> +	ldr	r0, WDT_TIM12
> +	str	r1, [r0]
> +	ldr	r0, WDT_TIM34
> +	str	r1, [r0]
> +	ldr	r0, WDT_PRD12
> +	str	r1, [r0]
> +	ldr	r0, WDT_PRD34
> +	str	r1, [r0]
> +	ldr	r0, WDT_TCR
> +	ldr	r1, [r0]
> +	orr	r1, r1, $0x40
> +	str	r1, [r0]
> +	ldr	r0, WDT_WDTCR
> +	ldr	r1, [r0]
> +	orr	r1, r1, $0x4000
> +	str	r1, [r0]
> +	ldr	r1, WDTCR_VAL1
> +	str	r1, [r0]
> +	ldr	r1, WDTCR_VAL2
> +	str	r1, [r0]
> +	nop
> +	nop
> +	nop
> +	nop
> +reset_cpu_loop:
> +	b	reset_cpu_loop
> +
> +WDT_TGCR:
> +	.word	0x01c21c24
> +WDT_TIM12:
> +	.word	0x01c21c10
> +WDT_TIM34:
> +	.word	0x01c21c14
> +WDT_PRD12:
> +	.word	0x01c21c18
> +WDT_PRD34:
> +	.word	0x01c21c1c
> +WDT_TCR:
> +	.word	0x01c21c20
> +WDT_WDTCR:
> +	.word	0x01c21c28
> +WDTCR_VAL1:
> +	.word	0xa5c64000
> +WDTCR_VAL2:
> +	.word	0xda7e4000
> diff -purN u-boot.git.orig/cpu/arm926ejs/davinci/timer.c u-boot.git/cpu/arm926ejs/davinci/timer.c
> --- u-boot.git.orig/cpu/arm926ejs/davinci/timer.c	1969-12-31 16:00:00.000000000 -0800
> +++ u-boot.git/cpu/arm926ejs/davinci/timer.c	2007-08-07 10:15:34.000000000 -0700
> @@ -0,0 +1,165 @@
> +/*
> + * (C) Copyright 2003
> + * Texas Instruments <www.ti.com>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Alex Zuepke <azu@sysgo.de>
> + *
> + * (C) Copyright 2002-2004
> + * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
> + *
> + * (C) Copyright 2004
> + * Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
> + *
> + * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
> + *
> + * 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 <common.h>
> +#include <arm926ejs.h>
> +
> +typedef volatile struct {
> +	u_int32_t	pid12;
> +	u_int32_t	emumgt_clksped;
> +	u_int32_t	gpint_en;
> +	u_int32_t	gpdir_dat;
> +	u_int32_t	tim12;
> +	u_int32_t	tim34;
> +	u_int32_t	prd12;
> +	u_int32_t	prd34;
> +	u_int32_t	tcr;
> +	u_int32_t	tgcr;
> +	u_int32_t	wdtcr;
> +	u_int32_t	tlgc;
> +	u_int32_t	tlmr;
> +} davinci_timer;
> +
> +davinci_timer		*timer = (davinci_timer *)CFG_TIMERBASE;
> +
> +#define TIMER_LOAD_VAL	(CFG_HZ_CLOCK / CFG_HZ)
> +#define READ_TIMER	timer->tim34
> +
> +static ulong timestamp;
> +static ulong lastinc;
> +
> +int timer_init(void)
> +{
> +	/* We are using timer34 in unchained 32-bit mode, full speed */
> +	timer->tcr = 0x0;
> +	timer->tgcr = 0x0;
> +	timer->tgcr = 0x06;
> +	timer->tim34 = 0x0;
> +	timer->prd34 = TIMER_LOAD_VAL;
> +	lastinc = 0;
> +	timer->tcr = 0x80 << 16;
> +	timestamp = 0;
> +
> +	return(0);
> +}
> +
> +void reset_timer(void)
> +{
> +	reset_timer_masked();
> +}
> +
> +ulong get_timer(ulong base)
> +{
> +	return(get_timer_masked() - base);
> +}
> +
> +void set_timer(ulong t)
> +{
> +	timestamp = t;
> +}
> +
> +void udelay(unsigned long usec)
> +{
> +	udelay_masked(usec);
> +}
> +
> +void reset_timer_masked(void)
> +{
> +	lastinc = READ_TIMER;
> +	timestamp = 0;
> +}
> +
> +ulong get_timer_raw(void)
> +{
> +	ulong now = READ_TIMER;
> +
> +	if (now >= lastinc) {
> +		/* normal mode */
> +		timestamp += now - lastinc;
> +	} else {
> +		/* overflow ... */
> +		timestamp += now + TIMER_LOAD_VAL - lastinc;
> +	}
> +	lastinc = now;
> +	return timestamp;
> +}
> +
> +ulong get_timer_masked(void)
> +{
> +	return(get_timer_raw() / TIMER_LOAD_VAL);
> +}
> +
> +void udelay_masked(unsigned long usec)
> +{
> +	ulong tmo;
> +	ulong endtime;
> +	signed long diff;
> +
> +	tmo = CFG_HZ_CLOCK / 1000;
> +	tmo *= usec;
> +	tmo /= 1000;
> +
> +	endtime = get_timer_raw() + tmo;
> +
> +	do {
> +		ulong now = get_timer_raw();
> +		diff = endtime - now;
> +	} while (diff >= 0);
> +}
> +
> +/*
> + * This function is derived from PowerPC code (read timebase as long long).
> + * On ARM it just returns the timer value.
> + */
> +unsigned long long get_ticks(void)
> +{
> +	return(get_timer(0));
> +}
> +
> +/*
> + * This function is derived from PowerPC code (timebase clock frequency).
> + * On ARM it returns the number of timer ticks per second.
> + */
> +ulong get_tbclk(void)
> +{
> +	ulong tbclk;
> +
> +	tbclk = CFG_HZ;
> +	return(tbclk);
> +}
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >>  http://get.splunk.com/
> _______________________________________________
> U-Boot-Users mailing list
> U-Boot-Users at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/u-boot-users
> 

      reply	other threads:[~2007-08-08 15:57 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-07 21:12 [U-Boot-Users] [ARM] TI DaVinci support, hopefully final [3/5] ksi at koi8.net
2007-08-08 15:57 ` Dirk Behme [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46B9E807.3090401@googlemail.com \
    --to=dirk.behme@googlemail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.