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
>
prev parent 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.