Initial EA2468 u-boot release master u-boot-2010.09_ea2468-v1.00a
authorKevin Wells <wellsk40@gmail.com>
Wed, 6 Apr 2011 23:17:55 +0000 (16:17 -0700)
committerKevin Wells <wellsk40@gmail.com>
Wed, 6 Apr 2011 23:17:55 +0000 (16:17 -0700)
This release contains support for the EA2468 board and geenrates
a u-boot image that can be burnt into internal FLASH and loads
and executes at the end of SDRAM. This version has support for
NAND FLASH and ethernet

Signed-off-by: Kevin Wells <wellsk40@gmail.com>

24 files changed:
Makefile
arch/arm/cpu/arm720t/cpu.c
arch/arm/cpu/arm720t/interrupts.c
arch/arm/cpu/arm720t/lpc24xx/Makefile [new file with mode: 0644]
arch/arm/cpu/arm720t/lpc24xx/clocks.c [new file with mode: 0644]
arch/arm/cpu/arm720t/lpc24xx/common.c [new file with mode: 0644]
arch/arm/cpu/arm720t/lpc24xx/serial.c [new file with mode: 0644]
arch/arm/cpu/arm720t/lpc24xx/timer.c [new file with mode: 0644]
arch/arm/cpu/arm720t/start.S
arch/arm/cpu/arm720t/u-boot.lds
arch/arm/include/asm/arch-arm720t/hardware.h
arch/arm/include/asm/arch-lpc24xx/clocks.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc24xx/hardware.h [new file with mode: 0644]
arch/arm/include/asm/arch-lpc24xx/lpc24xx_registers.h [new file with mode: 0644]
board/nxp/ea2468/Makefile [new file with mode: 0644]
board/nxp/ea2468/config.mk [new file with mode: 0644]
board/nxp/ea2468/ea2468.c [new file with mode: 0644]
board/nxp/ea2468/flash.c [new file with mode: 0644]
board/nxp/ea2468/lowlevel_init.S [new file with mode: 0644]
board/nxp/ea2468/mem.c [new file with mode: 0644]
board/nxp/ea2468/nand.c [new file with mode: 0644]
board/nxp/ea2468/net.c [new file with mode: 0644]
include/configs/ea2468.h [new file with mode: 0644]
lib/time.c

index fa1bddf..e1760a3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -305,13 +305,16 @@ __LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))
 #########################################################################
 
 # Always append ALL so that arch config.mk's can add custom ones
-ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)
+ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)u-boot-lpc.hex $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)
 
 all:           $(ALL)
 
 $(obj)u-boot.hex:      $(obj)u-boot
                $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
 
+$(obj)u-boot-lpc.hex:  $(obj)u-boot.bin
+               $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
+
 $(obj)u-boot.srec:     $(obj)u-boot
                $(OBJCOPY) -O srec $< $@
 
@@ -2168,6 +2171,13 @@ versatilepb_config :     unconfig
        @board/armltd/versatile/split_by_variant.sh $@
 
 #########################################################################
+# NXP development boards
+#########################################################################
+
+ea2468_config: unconfig
+       @$(MKCONFIG) ea2468 arm arm720t ea2468 nxp lpc24xx
+
+#########################################################################
 ## XScale Systems
 #########################################################################
 
index 88c71bf..5e73ff6 100644 (file)
@@ -68,6 +68,8 @@ int cleanup_before_linux (void)
        /* Nothing more needed */
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
        /* No cleanup before linux for IntegratorAP/CM720T as yet */
+#elif defined(CONFIG_LPC24XX)
+       /* No cleanup before linux for LPC24XX */
 #else
 #error No cleanup_before_linux() defined for this CPU type
 #endif
index eb8d425..4e9ad15 100644 (file)
@@ -80,6 +80,8 @@ void do_irq (struct pt_regs *pt_regs)
     pfnct = (void (*)(void))VICVectAddr;
 
     (*pfnct)();
+#elif defined(CONFIG_LPC4XX)
+       /* Nothing to do for LPC24xx */
 #else
 #error do_irq() not defined for this CPU type
 #endif
@@ -192,6 +194,9 @@ int timer_init (void)
        PUT32(T0TC, 0);
        PUT32(T0TCR, 1);        /* enable timer0 */
 
+#elif defined(CONFIG_LPC24XX)
+       extern void lpc24xx_timer_init(void);
+       lpc24xx_timer_init();
 #else
 #error No timer_init() defined for this CPU type
 #endif
@@ -311,6 +316,8 @@ void __udelay (unsigned long usec)
 
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
        /* No timer routines for IntegratorAP/CM720T as yet */
+#elif defined(CONFIG_LPC24XX)
+       /* Timer routines defined elsewhere */
 #else
 #error Timer routines not defined for this CPU type
 #endif
diff --git a/arch/arm/cpu/arm720t/lpc24xx/Makefile b/arch/arm/cpu/arm720t/lpc24xx/Makefile
new file mode 100644 (file)
index 0000000..bb851c0
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# (C) Copyright 2000-2007
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(SOC).a
+
+COBJS  = timer.o clocks.o serial.o common.o
+
+SRCS   := $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+
+all:   $(obj).depend $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/arch/arm/cpu/arm720t/lpc24xx/clocks.c b/arch/arm/cpu/arm720t/lpc24xx/clocks.c
new file mode 100644 (file)
index 0000000..ff261ca
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx clock control driver
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Note: Avoid the use of any static data in this driver, as it's used
+ * prior to the main memory being setup.
+ */
+
+/*
+ * Note: Parts of this driver have been modified from EA provided source code
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+#include <asm/arch/clocks.h>
+
+int clk_get_rate(lpc24xx_clk clk)
+{
+       long regaddr, regval, bitoff;
+
+       if ((int) clk >= CLK_BAT_RAM) {
+               bitoff = (long) clk - 16;
+               regaddr = PCLKSEL1;
+       } else {
+               bitoff = (long) clk;
+               regaddr = PCLKSEL0;
+       }
+
+       regval = __raw_readl(regaddr);
+       regval = regval >> (bitoff << 1);
+       regval &= 0x3;
+
+       switch (regval) {
+       case 0x0:
+               bitoff = 4;
+               break;
+
+       case 0x1:
+               bitoff = 1;
+               break;
+
+       case 0x2:
+               bitoff = 2;
+               break;
+
+       default:
+               if ((clk == CLK_CAN1) || (clk == CLK_CAN2))
+                       bitoff = 6;
+               else
+                       bitoff = 8;
+               break;
+       }
+
+       return (int) CONFIG_SYS_CLK_RATE / bitoff;
+}
+
+int clk_enable(lpc24xx_clk clk, int enable)
+{
+       if (enable)
+               __raw_writel(__raw_readl(PCONP) | (1 << (int) clk),
+                       PCONP);
+       else
+               __raw_writel(__raw_readl(PCONP) & ~(1 << (int) clk),
+                       PCONP);
+}
+
+static void lpc24xx_pll_latch(long pllcon)
+{
+       __raw_writel(pllcon, PLLCON);
+       __raw_writel(0xAA, PLLFEED);
+       __raw_writel(0x55, PLLFEED);
+}
+
+void lpc24xx_sys_clocks(void)
+{
+       /* Enable PLL, disconnected */
+       if (__raw_readl(PLLSTAT) & (1 << 25))
+               lpc24xx_pll_latch(1);
+
+       /* Disable PLL, disconnected */
+       lpc24xx_pll_latch(0);
+
+       /* Enable main osc and wait until stable */
+       __raw_writel(__raw_readl(SCSREG) | 0x20, SCSREG);
+       while (!(__raw_readl(SCSREG) & 0x40));
+
+       /* Select main oscillator as PLL source */
+       __raw_writel(1, CLKSRCSEL);
+
+       /* Setup PLL for desired target clock rate */
+       __raw_writel(CONFIG_SYSPLL_M | (CONFIG_SYSPLL_N << 16), PLLCFG);
+       __raw_writel(0xAA, PLLFEED);
+       __raw_writel(0x55, PLLFEED);
+
+       /* Enable PLL, disconnected */
+       lpc24xx_pll_latch(1);
+
+       /* CPU clock divider */
+       __raw_writel(CONFIG_CLKCFG, CCLKCFG);
+
+#if CONFIG_ENAB_USBCLK == 1
+       /* USB clock divider */
+       __raw_writel(CONFIG_USBCLKCFG, USBCLKCFG);
+#endif
+
+       /* Wait for PLL clock */
+       while (!(__raw_readl(PLLSTAT) & (1 << 26)));
+
+       /* Enable PLL, connected */
+       lpc24xx_pll_latch(3);
+
+       /* Wait for connect status */
+       while (!(__raw_readl(PLLSTAT) & (1 << 25)));
+
+#if CONFIG_PCLK_DIV == 8
+       __raw_writel(0xFFFFFFFF, PCLKSEL0);
+       __raw_writel(0xFFFFFFFF, PCLKSEL1);
+#endif
+#if CONFIG_PCLK_DIV == 4
+       __raw_writel(0x00000000, PCLKSEL0);
+       __raw_writel(0x00000000, PCLKSEL1);
+#endif
+#if CONFIG_PCLK_DIV == 2
+       __raw_writel(0xAAAAAAAA, PCLKSEL0);
+       __raw_writel(0xAAAAAAAA, PCLKSEL1);
+#endif
+#if CONFIG_PCLK_DIV == 1
+       __raw_writel(0x55555555, PCLKSEL0);
+       __raw_writel(0x55555555, PCLKSEL1);
+#endif
+}
+
diff --git a/arch/arm/cpu/arm720t/lpc24xx/common.c b/arch/arm/cpu/arm720t/lpc24xx/common.c
new file mode 100644 (file)
index 0000000..00ace9e
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx common functions
+ *
+ * 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 <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+
+/*
+ * Remap internal SRAM to address 0x0, as it's needed for vector table support
+ */
+void lpc24xx_sram_remap(void)
+{
+       __raw_writel(0x2, MEMMAP);
+}
diff --git a/arch/arm/cpu/arm720t/lpc24xx/serial.c b/arch/arm/cpu/arm720t/lpc24xx/serial.c
new file mode 100644 (file)
index 0000000..2bb37b2
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx serial port functions
+ *
+ * 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 <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+#include <asm/arch/clocks.h>
+
+#if CONFIG_LPC24XX_UART == 0
+#define UART_BASE UART0_BASE
+#define UART_CLK CLK_UART0
+#endif
+#if CONFIG_LPC24XX_UART == 1
+#define UART_BASE UART1_BASE
+#define UART_CLK CLK_UART1
+#endif
+#if CONFIG_LPC24XX_UART == 2
+#define UART_BASE UART2_BASE
+#define UART_CLK CLK_UART2
+#endif
+#if CONFIG_LPC24XX_UART == 3
+#define UART_BASE UART3_BASE
+#define UART_CLK CLK_UART3
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void serial_setbrg(void)
+{
+       long div, clkrate;
+
+       clkrate = clk_get_rate(UART_CLK);
+       div = clkrate / (gd->baudrate * 16);
+
+       __raw_writel(__raw_readl(UART_LCR(UART_BASE)) | 0x80,
+               UART_LCR(UART_BASE));
+       __raw_writel(div & 0xFF, UART_FIFO_DLL(UART_BASE));
+       __raw_writel((div >> 8) & 0xFF, UART_IER_DLM(UART_BASE));
+       __raw_writel(__raw_readl(UART_LCR(UART_BASE)) & ~0x80,
+               UART_LCR(UART_BASE));
+}
+
+int serial_init(void)
+{
+       volatile unsigned int tmp32;
+
+       /* Enable UART clock adn pin muxing */
+       clk_enable(UART_CLK, 1);
+#if CONFIG_LPC24XX_UART == 0
+       __raw_writel((__raw_readl(PINSEL0) & ~0xFFFFFF0F) | 0x50, PINSEL0);
+#endif
+#if CONFIG_LPC24XX_UART == 1
+       __raw_writel((__raw_readl(PINSEL0) & ~0x3FFFFFFF) | 0x40000000, PINSEL0);
+       __raw_writel((__raw_readl(PINSEL1) & ~0xFFFFFFFC) | 0x1, PINSEL1);
+#endif
+#if CONFIG_LPC24XX_UART == 2
+       __raw_writel((__raw_readl(PINSEL0) & ~0xFFF0FFFF) | 0x50000, PINSEL0);
+#endif
+#if CONFIG_LPC24XX_UART == 3
+       __raw_writel((__raw_readl(PINSEL0) & ~0xFFFFFFF0) | 0xA, PINSEL0);
+#endif
+
+       /* set baudrate */
+       gd->baudrate = CONFIG_BAUDRATE;
+       serial_setbrg();
+
+       /* Setup default UART state for N81 with FIFO mode */
+       __raw_writel(0x3, UART_LCR(UART_BASE));
+
+       /* Clear FIFOs and set FIFO level */
+       __raw_writel(0x7, UART_FCR_IIR(UART_BASE));
+       tmp32 = __raw_readl(UART_FCR_IIR(UART_BASE));
+       tmp32 = __raw_readl(UART_LSR(UART_BASE));
+
+       return 0;
+}
+
+int serial_getc(void)
+{
+       /* Wait for a character from the UART */
+       while (!(__raw_readl(UART_LSR(UART_BASE)) & (1 << 0)));
+
+       return (int) (__raw_readl(UART_FIFO_DLL(UART_BASE)) & 0xFF);
+}
+
+void serial_putc(const char c)
+{
+       /* Wait for FIFO to become empty */
+       while (!(__raw_readl(UART_LSR(UART_BASE)) & (1 << 5)));
+
+       __raw_writel((long) c, UART_FIFO_DLL(UART_BASE));
+
+       /* If \n, also do \r */
+       if (c == '\n')
+               serial_putc('\r');
+}
+
+int serial_tstc(void)
+{
+       /* Test for a character from the UART */
+       if (!(__raw_readl(UART_LSR(UART_BASE)) & 1))
+               return 0;
+
+       return 1;
+}
+
+void serial_puts(const char *s)
+{
+       while (*s)
+               serial_putc (*s++);
+}
+
diff --git a/arch/arm/cpu/arm720t/lpc24xx/timer.c b/arch/arm/cpu/arm720t/lpc24xx/timer.c
new file mode 100644 (file)
index 0000000..b2f3dc1
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx timer driver
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Note: Avoid the use of any static data in this driver, as it's used
+ * prior to the main memory being setup.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+#include <asm/arch/clocks.h>
+
+#define TIMER_BASE TIMER0_BASE
+#define UDELAY_BASE TIMER1_BASE
+#define TIMER_CLK CLK_TIMER0
+#define UDELAY_CLK CLK_TIMER1
+
+void reset_timer(void)
+{
+       unsigned int clkdlycnt, tbaseclk;
+
+       /* Reset timer */
+       __raw_writel(2, TIMER_TCR(TIMER_BASE));
+       __raw_writel(0, TIMER_TCR(TIMER_BASE));
+       __raw_writel(0, TIMER_TC(TIMER_BASE));
+
+       /* Clear and enable match function */
+       __raw_writel(1, TIMER_IR(TIMER_BASE));
+
+       /* Count mode is PCLK edge */
+       __raw_writel(0, TIMER_CTCR(TIMER_BASE));
+
+       /* Set prescale counter */
+       tbaseclk = clk_get_rate(TIMER_CLK);
+       clkdlycnt = (tbaseclk / CONFIG_SYS_HZ);
+       __raw_writel(clkdlycnt, TIMER_PR(TIMER_BASE));
+
+       /* Enable the timer */
+       __raw_writel(1, TIMER_TCR(TIMER_BASE));
+}
+
+ulong get_timer(ulong base)
+{
+       ulong tcr = __raw_readl(TIMER_TC(TIMER_BASE));
+       return tcr - base;
+}
+
+void udelay(unsigned long usec)
+{
+       long tbaseclk;
+
+       /* Enable timer system clock */
+       clk_enable(UDELAY_CLK, 1);
+
+       /* Reset timer */
+       __raw_writel(2, TIMER_TCR(UDELAY_BASE));
+       __raw_writel(0, TIMER_TCR(UDELAY_BASE));
+       __raw_writel(0, TIMER_PC(UDELAY_BASE));
+       __raw_writel(0, TIMER_PR(UDELAY_BASE));
+
+       /* Clear and enable match function */
+       __raw_writel(1, TIMER_IR(UDELAY_BASE));
+
+       /* Count mode is PCLK edge */
+       __raw_writel(0, TIMER_CTCR(UDELAY_BASE));
+
+       /* Set prescale counter value for proper tick rate */
+       tbaseclk = clk_get_rate(UDELAY_CLK);
+       tbaseclk = (tbaseclk / 1000000) - 1;
+       __raw_writel(tbaseclk, TIMER_PR(UDELAY_BASE));
+
+       /* Set match for number of usecs */
+       __raw_writel(usec, TIMER_MR0(UDELAY_BASE));
+
+       /* Interrupt on match 0 */
+       __raw_writel(1, TIMER_MCR(UDELAY_BASE));
+
+       /* Enable the timer */
+       __raw_writel(1, TIMER_TCR(UDELAY_BASE));
+
+       /* Loop until match occurs */
+       while (!(__raw_readl(TIMER_IR(UDELAY_BASE)) & 0x1));
+
+       /* Stop timer */
+       __raw_writel(0, TIMER_TCR(UDELAY_BASE));
+
+       /* Disable timer system clock */
+       clk_enable(UDELAY_CLK, 0);
+}
+
+void lpc24xx_timer_init(void)
+{
+       clk_enable(TIMER_CLK, 1);
+       reset_timer();
+}
+
index d6f2c16..6f5a19d 100644 (file)
@@ -139,7 +139,7 @@ relocate:                           /* relocate U-Boot to RAM           */
        beq     stack_setup
 
 #if TEXT_BASE
-#ifndef CONFIG_LPC2292 /* already done in lowlevel_init */
+#ifndef CONFIG_LPC24XX /* already done in lowlevel_init */
        ldr     r2, =0x0                /* Relocate the exception vectors   */
        cmp     r1, r2                  /* and associated data to address   */
        ldmneia r0!, {r3-r10}           /* 0x0. Do nothing if TEXT_BASE is  */
@@ -369,6 +369,8 @@ lock_loop:
        ldr     r0, VPBDIV_ADR
        mov     r1, #0x01       /* VPB clock is same as process clock */
        str     r1, [r0]
+#elif defined(CONFIG_LPC24XX)
+       /* Nothing needed for LPC24xx */
 #else
 #error No cpu_init_crit() defined for current CPU type
 #endif
@@ -607,6 +609,14 @@ reset_cpu:
 .globl reset_cpu
 reset_cpu:
        mov     pc, r0
+#elif defined(CONFIG_LPC24XX)
+       .align  5
+reset_cpu:
+.globl reset_cpu
+.globl lpc24xx_cpu_reset
+       ldr     r0, =lpc24xx_cpu_reset
+       mov     pc, r0
+
 #else
 #error No reset_cpu() defined for current CPU type
 #endif
index c975fc3..c47a2a1 100644 (file)
@@ -26,7 +26,7 @@ OUTPUT_ARCH(arm)
 ENTRY(_start)
 SECTIONS
 {
-       . = 0x00000000;
+       . = 0xA1F80000;
 
        . = ALIGN(4);
        .text :
index 9bee19f..31b7149 100644 (file)
@@ -34,6 +34,8 @@
 /* include armadillo specific hardware file if there was one */
 #elif defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
 /* include IntegratorCP/CM720T specific hardware file if there was one */
+#elif defined(CONFIG_LPC24XX)
+#include <asm/arch-lpc24xx/lpc24xx_registers.h>
 #else
 #error No hardware file defined for this configuration
 #endif
diff --git a/arch/arm/include/asm/arch-lpc24xx/clocks.h b/arch/arm/include/asm/arch-lpc24xx/clocks.h
new file mode 100644 (file)
index 0000000..c04a83e
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx clock control defines
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __LPC24XX_CLOCKS_H
+#define __LPC24XX_CLOCKS_H
+
+typedef enum {
+       CLK_WDT = 0,
+       CLK_TIMER0,
+       CLK_TIMER1,
+       CLK_UART0,
+       CLK_UART1,
+       CLK_PWM0,
+       CLK_PWM1,
+       CLK_I2C0,
+       CLK_SPI,
+       CLK_RTC,
+       CLK_SSP1,
+       CLK_DAC,
+       CLK_EMC = CLK_DAC,
+       CLK_ADC,
+       CLK_CAN1,
+       CLK_CAN2,
+       CLK_ACF,
+       CLK_BAT_RAM = 16,
+       CLK_GPIO,
+       CLK_PCB,
+       CLK_I2C1,
+       CLK_LCD, /* For LPC24xx parts with LCD only */
+       CLK_SSP0,
+       CLK_TIMER2,
+       CLK_TIMER3,
+       CLK_UART2,
+       CLK_UART3,
+       CLK_I2C2,
+       CLK_I2S,
+       CLK_MCI,
+       CLK_SDC = CLK_MCI,
+       CLK_GPDMA,
+       CLK_SYSCON,
+       CLK_ENET = CLK_SYSCON,
+       CLK_USB
+} lpc24xx_clk;
+
+extern int clk_get_rate(lpc24xx_clk);
+extern int clk_enable(lpc24xx_clk, int enable);
+extern void lpc24xx_sys_clocks(void);
+
+#endif
+
diff --git a/arch/arm/include/asm/arch-lpc24xx/hardware.h b/arch/arm/include/asm/arch-lpc24xx/hardware.h
new file mode 100644 (file)
index 0000000..bd6a616
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx clock control defines
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __LPC24XX_HARDWARE_H
+#define __LPC24XX_HARDWARE_H
+
+
+#endif
+
diff --git a/arch/arm/include/asm/arch-lpc24xx/lpc24xx_registers.h b/arch/arm/include/asm/arch-lpc24xx/lpc24xx_registers.h
new file mode 100644 (file)
index 0000000..7098d6b
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx chip defines
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __LPC24XX_REGISTERS_H
+#define __LPC24XX_REGISTERS_H
+
+/*
+ * Peripheral block base addresses
+ */
+#define FGPIO_BASE             0x3FFFC000
+#define WDT_BASE               0xE0000000
+#define TIMER0_BASE            0xE0004000
+#define TIMER1_BASE            0xE0008000
+#define UART0_BASE             0xE000C000
+#define UART1_BASE             0xE0010000
+#define PWM0_BASE              0xE0014000
+#define PWM1_BASE              0xE0018000
+#define I2C0_BASE              0xE001C000
+#define SPI_BASE               0xE0020000
+#define RTC_BASE               0xE0024000
+#define GPIO_BASE              0xE0028000
+#define PCB_BASE               0xE002C000
+#define SSP1_BASE              0xE0030000
+#define ADC_BASE               0xE0034000
+#define CANAFRAM_BASE          0xE0038000
+#define CANAFREG_BASE          0xE003C000
+#define CANCOMREG_BASE         0xE0040000
+#define CANCONT1_BASE          0xE0044000
+#define CANCONT2_BASE          0xE0048000
+#define I2C1_BASE              0xE005C000
+#define SSP0_BASE              0xE0068000
+#define DAC_BASE               0xE006C000
+#define TIMER2_BASE            0xE0070000
+#define TIMER3_BASE            0xE0074000
+#define UART2_BASE             0xE0078000
+#define UART3_BASE             0xE007C000
+#define I2C2_BASE              0xE0080000
+#define BATTRAM_BASE           0xE0084000
+#define I2S_BASE               0xE0088000
+#define SDMMC_BASE             0xE008C000
+#define SCB_BASE               0xE01FC000
+#define MAC_BASE               0xFFE00000
+#define EMC_BASE               0xFFE08000
+
+/*
+ * Pin connect block (pinsel/pinmode) registers
+ */
+#define PINSEL0                        (PCB_BASE + 0x00)
+#define PINSEL1                        (PCB_BASE + 0x04)
+#define PINSEL2                        (PCB_BASE + 0x08)
+#define PINSEL3                        (PCB_BASE + 0x0C)
+#define PINSEL4                        (PCB_BASE + 0x10)
+#define PINSEL5                        (PCB_BASE + 0x14)
+#define PINSEL6                        (PCB_BASE + 0x18)
+#define PINSEL7                        (PCB_BASE + 0x1C)
+#define PINSEL8                        (PCB_BASE + 0x20)
+#define PINSEL9                        (PCB_BASE + 0x24)
+#define PINSEL10               (PCB_BASE + 0x28)
+#define PINSEL11               (PCB_BASE + 0x2C) /* LPC247x only */
+#define PINMODE0               (PCB_BASE + 0x40)
+#define PINMODE1               (PCB_BASE + 0x44)
+#define PINMODE2               (PCB_BASE + 0x48)
+#define PINMODE3               (PCB_BASE + 0x4C)
+#define PINMODE4               (PCB_BASE + 0x50)
+#define PINMODE5               (PCB_BASE + 0x54)
+#define PINMODE6               (PCB_BASE + 0x58)
+#define PINMODE7               (PCB_BASE + 0x5C)
+#define PINMODE8               (PCB_BASE + 0x60)
+#define PINMODE9               (PCB_BASE + 0x64)
+
+/*
+ * Memory map control block registers
+ */
+#define MAMCR                  (SCB_BASE + 0x000)
+#define MAMTIM                 (SCB_BASE + 0x004)
+#define MEMMAP                 (SCB_BASE + 0x040)
+#define PLLCON                 (SCB_BASE + 0x080)
+#define PLLCFG                 (SCB_BASE + 0x084)
+#define PLLSTAT                        (SCB_BASE + 0x088)
+#define PLLFEED                        (SCB_BASE + 0x08C)
+#define PCON                   (SCB_BASE + 0x0C0)
+#define PCONP                  (SCB_BASE + 0x0C4)
+#define CCLKCFG                        (SCB_BASE + 0x104)
+#define USBCLKCFG              (SCB_BASE + 0x108)
+#define CLKSRCSEL              (SCB_BASE + 0x10C)
+#define INTWAKE                        (SCB_BASE + 0x144)
+#define SCSREG                 (SCB_BASE + 0x1A0)
+#define IRCTRIM                        (SCB_BASE + 0x1A4)
+#define PCLKSEL0               (SCB_BASE + 0x1A8)
+#define PCLKSEL1               (SCB_BASE + 0x1AC)
+
+/*
+ * UART block registers
+ */
+#define UART_FIFO_DLL(x)       ((x) + 0x00)
+#define UART_IER_DLM(x)                ((x) + 0x04)
+#define UART_FCR_IIR(x)                ((x) + 0x08)
+#define UART_LCR(x)            ((x) + 0x0C)
+#define UART_MCR(x)            ((x) + 0x10)
+#define UART_LSR(x)            ((x) + 0x14)
+#define UART_MSR(x)            ((x) + 0x18)
+#define UART_SCR(x)            ((x) + 0x2C)
+#define UART_ACR(x)            ((x) + 0x20)
+#define UART_FDI(x)            ((x) + 0x28)
+#define UART_TER(x)            ((x) + 0x30)
+
+/*
+ * Timer block registers
+ */
+#define TIMER_IR(x)            ((x) + 0x00)
+#define TIMER_TCR(x)           ((x) + 0x04)
+#define TIMER_TC(x)            ((x) + 0x08)
+#define TIMER_PR(x)            ((x) + 0x0C)
+#define TIMER_PC(x)            ((x) + 0x10)
+#define TIMER_MCR(x)           ((x) + 0x14)
+#define TIMER_MR0(x)           ((x) + 0x18)
+#define TIMER_MR1(x)           ((x) + 0x1C)
+#define TIMER_MR2(x)           ((x) + 0x20)
+#define TIMER_MR3(x)           ((x) + 0x24)
+#define TIMER_CCR(x)           ((x) + 0x28)
+#define TIMER_CR0(x)           ((x) + 0x2C)
+#define TIMER_CR1(x)           ((x) + 0x30)
+#define TIMER_EMR(x)           ((x) + 0x3C)
+#define TIMER_CTCR(x)          ((x) + 0x70)
+
+/*
+ * MAC block registers
+ */
+#define MAC_MAC1               (MAC_BASE + 0x000)
+#define MAC_MAC2               (MAC_BASE + 0x004)
+#define MAC_IPGT               (MAC_BASE + 0x008)
+#define MAC_IPGR               (MAC_BASE + 0x00C)
+#define MAC_CLRT               (MAC_BASE + 0x010)
+#define MAC_MAXF               (MAC_BASE + 0x014)
+#define MAC_SUPP               (MAC_BASE + 0x018)
+#define MAC_TEST               (MAC_BASE + 0x01C)
+#define MAC_MCFG               (MAC_BASE + 0x020)
+#define MAC_MCMD               (MAC_BASE + 0x024)
+#define MAC_MADR               (MAC_BASE + 0x028)
+#define MAC_MWTD               (MAC_BASE + 0x02C)
+#define MAC_MRDD               (MAC_BASE + 0x030)
+#define MAC_MIND               (MAC_BASE + 0x034)
+#define MAC_SA0                        (MAC_BASE + 0x040)
+#define MAC_SA1                        (MAC_BASE + 0x044)
+#define MAC_SA2                        (MAC_BASE + 0x048)
+#define MAC_COMMAND            (MAC_BASE + 0x100)
+#define MAC_STATUS             (MAC_BASE + 0x104)
+#define MAC_RXDESC             (MAC_BASE + 0x108)
+#define MAC_RXSTATUS           (MAC_BASE + 0x10C)
+#define MAC_RXDESCNUM          (MAC_BASE + 0x110)
+#define MAC_RXPRODIDX          (MAC_BASE + 0x114)
+#define MAC_RXCONSIDX          (MAC_BASE + 0x118)
+#define MAC_TXDESC             (MAC_BASE + 0x11C)
+#define MAC_TXSTATUS           (MAC_BASE + 0x120)
+#define MAC_TXDESCNUM          (MAC_BASE + 0x124)
+#define MAC_TXPRODIDX          (MAC_BASE + 0x128)
+#define MAC_TXCONSIDX          (MAC_BASE + 0x12C)
+#define MAC_TSV0               (MAC_BASE + 0x158)
+#define MAC_TSV1               (MAC_BASE + 0x15C)
+#define MAC_RSV                        (MAC_BASE + 0x160)
+#define MAC_FLOWCTRLCNTR       (MAC_BASE + 0x170)
+#define MAC_FLOWCTRLSTS                (MAC_BASE + 0x174)
+#define MAC_RXFILTCTRL         (MAC_BASE + 0x200)
+#define MAC_RXFILTWOLSTS       (MAC_BASE + 0x204)
+#define MAC_TXFILTWOLCLR       (MAC_BASE + 0x208)
+#define MAC_HASHFLTRL          (MAC_BASE + 0x210)
+#define MAC_HASHFLTRH          (MAC_BASE + 0x214)
+#define MAC_INTSTAT            (MAC_BASE + 0xFE0)
+#define MAC_INTENAB            (MAC_BASE + 0xFE4)
+#define MAC_INTCLR             (MAC_BASE + 0xFE8)
+#define MAC_INTSET             (MAC_BASE + 0xFEC)
+#define MAC_POWERDOWN          (MAC_BASE + 0xFF4)
+#define MAC_MODULEID           (MAC_BASE + 0xFFC)
+
+/*
+ * EMC block registers
+ */
+#define EMC_CONTROL            (EMC_BASE + 0x000)
+#define EMC_STATUS             (EMC_BASE + 0x004)
+#define EMC_CONFIG             (EMC_BASE + 0x008)
+#define EMC_DYNCONTROL         (EMC_BASE + 0x020)
+#define EMC_DYNCREFRESH                (EMC_BASE + 0x024)
+#define EMC_MEMDYNREADCONFIG   (EMC_BASE + 0x028)
+#define EMC_DYNTRP             (EMC_BASE + 0x030)
+#define EMC_DYNTRAS            (EMC_BASE + 0x034)
+#define EMC_DYNTSREX           (EMC_BASE + 0x038)
+#define EMC_DYNTAPR            (EMC_BASE + 0x03C)
+#define EMC_DYNTDAL            (EMC_BASE + 0x040)
+#define EMC_DYNTWR             (EMC_BASE + 0x044)
+#define EMC_DYNTRC             (EMC_BASE + 0x048)
+#define EMC_DYNTRFC            (EMC_BASE + 0x04C)
+#define EMC_DYNTXSR            (EMC_BASE + 0x050)
+#define EMC_DYNTRRD            (EMC_BASE + 0x054)
+#define EMC_DYNTMRD            (EMC_BASE + 0x058)
+#define EMC_STATICEXTWAIT      (EMC_BASE + 0x080)
+#define EMC_DYNCONFIG(x)       (EMC_BASE + 0x100 + ((x) * 0x20))
+#define EMC_DYNRASCAS(x)       (EMC_BASE + 0x104 + ((x) * 0x20))
+#define EMC_STATICCONFIG(x)    (EMC_BASE + 0x200 + ((x) * 0x20))
+#define EMC_STATICWAITWEN(x)   (EMC_BASE + 0x204 + ((x) * 0x20))
+#define EMC_STATICWAITOEN(x)   (EMC_BASE + 0x208 + ((x) * 0x20))
+#define EMC_STATICWAITRD(x)    (EMC_BASE + 0x20C + ((x) * 0x20))
+#define EMC_STATICWAITPAGE(x)  (EMC_BASE + 0x210 + ((x) * 0x20))
+#define EMC_STATICWAITWR(x)    (EMC_BASE + 0x214 + ((x) * 0x20))
+#define EMC_STATICWAITTURN(x)  (EMC_BASE + 0x218 + ((x) * 0x20))
+
+/*
+ * GPIO block registers
+ */
+#define IOPIN(x)               (GPIO_BASE + 0x00 + ((x) * 0x10)
+#define IOSET(x)               (GPIO_BASE + 0x04 + ((x) * 0x10)
+#define IODIR(x)               (GPIO_BASE + 0x08 + ((x) * 0x10)
+#define IOCLR(x)               (GPIO_BASE + 0x0C + ((x) * 0x10)
+
+/*
+ * GPIO fast block (32-bit ports only) registers
+ */
+#define GPIO_FIODIR(x)         (FGPIO_BASE + 0x00 + (x * 0x20))
+#define GPIO_FIOMASK(x)                (FGPIO_BASE + 0x10 + (x * 0x20))
+#define GPIO_FIOPIN(x)         (FGPIO_BASE + 0x14 + (x * 0x20))
+#define GPIO_FIOSET(x)         (FGPIO_BASE + 0x18 + (x * 0x20))
+#define GPIO_FIOCLR(x)         (FGPIO_BASE + 0x1C + (x * 0x20))
+
+#endif
+
diff --git a/board/nxp/ea2468/Makefile b/board/nxp/ea2468/Makefile
new file mode 100644 (file)
index 0000000..889cbbf
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# (C) Copyright 2007
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := ea2468.o nand.o net.o mem.o flash.o
+SOBJTS := lowlevel_init.o
+
+SRCS   := $(SOBJTS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJTS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak $(obj).depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/nxp/ea2468/config.mk b/board/nxp/ea2468/config.mk
new file mode 100644 (file)
index 0000000..ae2f6ac
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2000
+# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+# Marius Groeger <mgroeger@sysgo.de>
+#
+# (C) Copyright 2000
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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
+#
+
+#address where u-boot will be relocated
+TEXT_BASE = 0xA1F80000
diff --git a/board/nxp/ea2468/ea2468.c b/board/nxp/ea2468/ea2468.c
new file mode 100644 (file)
index 0000000..4d1cf6d
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx clock control defines
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void lpc24xx_misc_init(void)
+{
+       /*
+        * Memory accelerator module is used only for boot, but can be
+        * enabled to speed things up.
+        */
+       __raw_writel(0x4, MAMTIM);
+       __raw_writel(0x2, MAMCR);
+}
+
+int board_init(void)
+{
+       gd->bd->bi_arch_number = CONFIG_LPC24XX_MACHID;
+
+       /* location of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
+
+       return 0;
+}
+
+int misc_init_r(void)
+{
+       /* Remap internal SRAM to 0x0 after relocation */
+       lpc24xx_sram_remap();
+
+       return 0;
+}
+
+#define LPC24XX_WDMOD          0xE0000000
+#define LPC24XX_WDTC           0xE0000004
+#define LPC24XX_WDFEED         0xE0000008
+#define LPC24XX_WDCLKSEL       0xE0000010
+void lpc24xx_cpu_reset(void)
+{
+       /* Use the watchdog timer to reset the system */
+
+       /* Set WDT clocking to PCLK */
+       __raw_writel(1, LPC24XX_WDCLKSEL);
+
+       /* Set lowest possible timeout */
+       __raw_writel(0xFF, LPC24XX_WDTC);
+
+       /* Enable WDT, but do not service it, to fire reset */
+       __raw_writel(0x3, LPC24XX_WDMOD);
+       __raw_writel(0xAA, LPC24XX_WDFEED);
+       __raw_writel(0x55, LPC24XX_WDFEED);
+
+       while (1);
+}
+
+int dram_init(void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+       return (0);
+}
+
diff --git a/board/nxp/ea2468/flash.c b/board/nxp/ea2468/flash.c
new file mode 100644 (file)
index 0000000..193fd6a
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: JEDEC FLASH legacy setup
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+
+/*
+ * SST39V 16-bit x 2MByte NOR FLASH on CS0
+ */
+unsigned long board_flash_get_legacy(unsigned long base, int banknum,
+       flash_info_t *info)
+{
+       uint32_t addr;
+       int i;
+
+       if (banknum != 1)
+               return 0;
+
+       info->size              = CONFIG_SYS_FLASH0_SIZE;
+       info->sector_count      = CONFIG_SYS_FLASH0_SIZE / 0x1000;
+       info->flash_id          = 0x023500BF;
+       info->portwidth         = 2;
+       info->chipwidth         = 2;
+       info->buffer_size       = 32;
+       info->erase_blk_tout    = 16384;
+       info->write_tout        = 2;
+       info->buffer_write_tout = 5;
+       info->vendor            = 2;
+       info->cmd_reset         = 0x00F0;
+       info->interface         = 2;
+       info->legacy_unlock     = 0;
+       info->manufacturer_id   = 1;
+       info->device_id         = 0x0235;
+       info->device_id2        = 0;
+
+       info->ext_addr          = 0x002A;
+       info->cfi_version       = 0x3133;
+       info->cfi_offset        = 0x0055;
+       info->addr_unlock1      = 0x00005555;
+       info->addr_unlock2      = 0x00002AAA;
+       info->name              = "SST39V";
+       for (i = 0, addr = -info->size;
+            i < info->sector_count;
+            ++i, addr += 0x1000) {
+               info->start[i] = addr;
+               info->protect[i] = 0x00;
+       }
+
+       return 1;
+}
diff --git a/board/nxp/ea2468/lowlevel_init.S b/board/nxp/ea2468/lowlevel_init.S
new file mode 100644 (file)
index 0000000..2d58186
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.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/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+
+.extern _TEXT_BASE
+.extern lpc24xx_sys_clocks
+.extern lpc24xx_mem_if
+.extern lpc24xx_misc_init
+
+_TEXT_BASE:
+       .word   TEXT_BASE
+
+PINSEL_CONFIGS:
+       .word PINSEL0,  0x00000000
+       .word PINSEL1,  0x00000000
+       .word PINSEL2,  0x00000000
+       .word PINSEL3,  0x00000000
+       .word PINSEL4,  0x50000000
+#if defined(LPC24XX_32BIT_BUS)
+       .word PINSEL5,  0x55010115
+       .word PINSEL7,  0x55555555
+#else
+       .word PINSEL5,  0x05050555
+       .word PINSEL7,  0x00000000
+#endif
+       .word PINSEL6,  0x55555555
+       .word PINSEL8,  0x55555555
+       .word PINSEL9,  0x50555555
+       .word PINSEL10, 0x00000000
+       .word PINSEL11, 0x00000000
+       .word PINMODE0, 0x00000000
+       .word PINMODE1, 0x00000000
+       .word PINMODE2, 0x00000000
+       .word PINMODE3, 0x00000000
+       .word PINMODE4, 0x00000000
+       .word PINMODE5, 0x00000000
+       .word PINMODE6, 0x00000000
+       .word PINMODE7, 0x00000000
+       .word PINMODE8, 0x00000000
+       .word PINMODE9, 0x00000000
+       .word 0x0
+
+.globl lowlevel_init
+lowlevel_init:
+       /* Temporary stack */
+       ldr sp, =0x40010000
+
+       /* Don't mess with r12 */
+       stmfd sp!, {r12, lr}
+
+       /* Setup pinsel and pinmode registers */
+       adr r0, PINSEL_CONFIGS
+       ldr r1, [r0], #4
+
+pin_loop:
+       cmp r1, #0
+       beq pin_loop_exit
+       ldr r2, [r0], #4
+       str r2, [r1]
+       ldr r1, [r0], #4
+       b pin_loop
+
+pin_loop_exit:
+       /* Setup system clocking and memory */
+       bl lpc24xx_sys_clocks
+       bl lpc24xx_mem_if
+       bl lpc24xx_misc_init
+
+       ldmfd sp!, {r12, pc}
+
diff --git a/board/nxp/ea2468/mem.c b/board/nxp/ea2468/mem.c
new file mode 100644 (file)
index 0000000..024a1e4
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: LPC24xx board specific memory interface setup
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Note: Avoid the use of any static data in this driver, as it's used
+ * prior to the main memory being setup. Do *not* map IRAM to address
+ * 0x0 until u-boot is running in DRAM.
+ */
+
+/*
+ * Note: This driver has been modified from EA provided source code
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+#include <asm/arch/clocks.h>
+
+#define msdelay(x) udelay(x * 1000)
+
+void lpc24xx_mem_if(void)
+{
+       volatile long tmp32;
+
+       /* Enable EMC clock */
+       clk_enable(CLK_EMC, 1);
+
+       __raw_writel(1, EMC_CONTROL);
+
+#if defined(LPC24XX_32BIT_BUS)
+       __raw_writel(1, EMC_DYNTRP);
+       __raw_writel(3, EMC_DYNTRAS);
+       __raw_writel(5, EMC_DYNTSREX);
+       __raw_writel(1, EMC_DYNTAPR);
+       __raw_writel(5, EMC_DYNTDAL);
+       __raw_writel(1, EMC_DYNTWR);
+       __raw_writel(5, EMC_DYNTRC);
+       __raw_writel(5, EMC_DYNTRFC);
+       __raw_writel(5, EMC_DYNTXSR);
+       __raw_writel(1, EMC_DYNTRRD);
+       __raw_writel(1, EMC_DYNTMRD);
+       __raw_writel(1, EMC_MEMDYNREADCONFIG);
+       __raw_writel(0x0202, EMC_DYNRASCAS(0));
+       __raw_writel(0x5480, EMC_DYNCONFIG(0));
+
+#else
+       __raw_writel(2, EMC_DYNTRP);
+       __raw_writel(3, EMC_DYNTRAS);
+       __raw_writel(7, EMC_DYNTSREX);
+       __raw_writel(2, EMC_DYNTAPR);
+       __raw_writel(5, EMC_DYNTDAL);
+       __raw_writel(1, EMC_DYNTWR);
+       __raw_writel(5, EMC_DYNTRC);
+       __raw_writel(5, EMC_DYNTRFC);
+       __raw_writel(7, EMC_DYNTXSR);
+       __raw_writel(1, EMC_DYNTRRD);
+       __raw_writel(2, EMC_DYNTMRD);
+       __raw_writel(1, EMC_MEMDYNREADCONFIG);
+       __raw_writel(0x0303, EMC_DYNRASCAS(0));
+       __raw_writel(0x50680, EMC_DYNCONFIG(0));
+#endif
+
+       msdelay(100);
+
+       /* NOP */
+       __raw_writel(0x183, EMC_DYNCONTROL);
+       msdelay(200);
+
+       /* Pre-charge all with fast refresh */
+       __raw_writel(0x103, EMC_DYNCONTROL);
+       __raw_writel(0x2, EMC_DYNCREFRESH);
+       msdelay(1);
+
+       /* Set refresh period */
+       __raw_writel(28, EMC_DYNCREFRESH);
+
+       /* Load mode word */
+       __raw_writel(0x083, EMC_DYNCONTROL);
+#if defined(LPC24XX_32BIT_BUS)
+       tmp32 = __raw_readl(PHYS_SDRAM_1 | (0X22 << 11));
+#else
+       tmp32 = __raw_readl(PHYS_SDRAM_1 | (0X33 << 12));
+#endif
+
+       /* Normal mode */
+       __raw_writel(0x0, EMC_DYNCONTROL);
+
+       /* Enable DRAM buffer */
+       __raw_writel(__raw_readl(EMC_DYNCONFIG(0)) | 0x80000,
+               EMC_DYNCONFIG(0));
+
+       msdelay(1);
+
+       __raw_writel(0x2, EMC_STATICWAITWEN(0));
+       __raw_writel(0x2, EMC_STATICWAITOEN(0));
+       __raw_writel(0x1f, EMC_STATICWAITRD(0));
+       __raw_writel(0x1f, EMC_STATICWAITPAGE(0));
+       __raw_writel(0x1f, EMC_STATICWAITWR(0));
+       __raw_writel(0xf, EMC_STATICWAITTURN(0));
+       __raw_writel(0x81, EMC_STATICCONFIG(0));
+
+       __raw_writel(0x2, EMC_STATICWAITWEN(1));
+       __raw_writel(0x2, EMC_STATICWAITOEN(1));
+       __raw_writel(0x8, EMC_STATICWAITRD(1));
+       __raw_writel(0x1f, EMC_STATICWAITPAGE(1));
+       __raw_writel(0x8, EMC_STATICWAITWR(1));
+       __raw_writel(0xf, EMC_STATICWAITTURN(1));
+       __raw_writel(0x80, EMC_STATICCONFIG(1));
+}
+
diff --git a/board/nxp/ea2468/nand.c b/board/nxp/ea2468/nand.c
new file mode 100644 (file)
index 0000000..a258b27
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Simple NAND interface driver
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+
+#if defined(CONFIG_CMD_NAND)
+
+#include <nand.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+
+/* GPIO read of busy status doesn't seem to work */
+#define USE_NAND_DELAY 40
+
+/*
+ * EA2468 board setup with CS1 as chip select. ALE uses A19, CLE uses A21,
+ * and NAND RDY/BUSY is read on GPIO P2.21. CS1 is controlled as a GPIO
+ * instead of a CS on GPIO P4.31 to lock the CS state during NAND transfers.
+ */
+#define NAND_ALE_OFFS  (1 << 19)
+#define NAND_CLE_OFFS  (1 << 20)
+
+static void ea2468_set_nand_cs(unsigned int set)
+{
+#if 0 // FIXME - GPIO based CS not working on EA board
+       /* NAND_CS is on P4.31 */
+       if (set)
+               __raw_writel((0x1 << 31), GPIO_FIOSET(4));
+       else
+               __raw_writel((0x1 << 31), GPIO_FIOCLR(4));
+#endif
+}
+
+static void ea2468_nand_hwcontrol(struct mtd_info *mtd, int cmd,
+       unsigned int ctrl)
+{
+       struct nand_chip *this = mtd->priv;
+       char *pCMD;
+       long IO_ADDR_W;
+
+       if (ctrl & NAND_CTRL_CHANGE) {
+               IO_ADDR_W = (long) this->IO_ADDR_W &
+                       ~(NAND_CLE_OFFS | NAND_ALE_OFFS);
+
+               if (ctrl & NAND_CLE)
+                       IO_ADDR_W |= NAND_CLE_OFFS;
+               else if (ctrl & NAND_ALE)
+                       IO_ADDR_W |= NAND_ALE_OFFS;
+
+               if (ctrl & NAND_NCE)
+                       ea2468_set_nand_cs(0);
+               else
+                       ea2468_set_nand_cs(1);
+
+               this->IO_ADDR_W = (void *) IO_ADDR_W;
+       }
+
+       if (cmd != NAND_CMD_NONE) {
+               pCMD = (char *) this->IO_ADDR_W;
+               *pCMD = cmd;
+       }
+
+       return;
+}
+
+#if USE_NAND_DELAY == 0
+static int ea2468_nand_device_ready(struct mtd_info *mtd)
+{
+       /* Ready/~busy is on P2.21 */
+       return ((__raw_readl(GPIO_FIOPIN(2)) & (1 << 21)) != 0);
+}
+#endif
+
+/*
+ * Setup NAND timing and standard NAND functions
+ */
+int board_nand_init(struct nand_chip *nand)
+{
+#if 0 // FIXME - GPIO based CS not working on EA board
+       /* Setup CS1 on p4.31 for GPIO output instead of CS1 */
+       __raw_writel(__raw_readl(PINSEL9) & ~(0x3 << 30), PINSEL9);
+       __raw_writel(__raw_readl(GPIO_FIODIR(4)) | (0x1 << 31),
+               GPIO_FIODIR(4));
+       ea2468_set_nand_cs(1);
+#endif
+
+       /* Setup NAND ready on P2.21 for GPIO input */
+       __raw_writel(__raw_readl(PINSEL5) & ~(0x3 << 10), PINSEL5);
+       __raw_writel(__raw_readl(GPIO_FIODIR(2)) & ~(0x1 << 21),
+               GPIO_FIODIR(2));
+
+       nand->cmd_ctrl = ea2468_nand_hwcontrol;
+#if USE_NAND_DELAY == 0
+       nand->dev_ready = ea2468_nand_device_ready;
+#else
+       nand->chip_delay = USE_NAND_DELAY;
+#endif
+       nand->ecc.mode = NAND_ECC_SOFT;
+       nand->options = NAND_USE_FLASH_BBT;
+
+       return 0;
+}
+#endif
diff --git a/board/nxp/ea2468/net.c b/board/nxp/ea2468/net.c
new file mode 100644 (file)
index 0000000..351995d
--- /dev/null
@@ -0,0 +1,580 @@
+/*
+ * Copyright (C) 2011 by NXP Semiconductors
+ * All rights reserved.
+ *
+ * @Author: Kevin Wells
+ * @Descr: Network driver based on LPC32x0 MAC driver
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <command.h>
+#include <net.h>
+#include "miiphy.h"
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/lpc24xx_registers.h>
+#include <asm/arch/clocks.h>
+
+
+/* Structure of a TX/RX descriptor */
+typedef struct
+{
+  volatile unsigned long packet;
+  volatile unsigned long control;
+} TXRX_DESC_T;
+
+/* Structure of a RX status entry */
+typedef struct
+{
+  volatile unsigned long statusinfo;
+  volatile unsigned long statushashcrc;
+} RX_STATUS_T;
+
+#define LPC24XX_ENETRAM_ADDR   0x7Fe00000
+#define LPC24XX_ENETRAM_SIZE   0x00004000
+#define USE_PHY_RMII
+#define ENET_MAX_TX_PACKETS    4
+#define ENET_MAX_RX_PACKETS    4 /* Do not use more than 4 */
+#define PHYDEF_PHYADDR         1
+#define ENET_MAXF_SIZE         1536
+#define DP83848_PHY_STATUS     0x10
+#define MAC_NONREVA_MODULEID   ((0x3902 << 16) | 0x2000)
+/*
+ * Buffer storage size, needs space for descriptors, statuses, and data
+ * buffers
+ */
+#define BUFF_SIZE_BYTES                ((ENET_MAXF_SIZE * (ENET_MAX_TX_PACKETS + \
+                               ENET_MAX_RX_PACKETS)) + 512)
+
+static TXRX_DESC_T *pTXDesc;
+static unsigned long *pTXStatus;
+static unsigned long pTXVBuffs [ENET_MAX_TX_PACKETS];
+static TXRX_DESC_T *pRXDesc;
+static RX_STATUS_T *pRXStatus;
+static unsigned long pRXVBuffs [ENET_MAX_RX_PACKETS];
+static unsigned long *ethbuffs;
+
+#define msDelay(x) udelay(x * 1000)
+#define error printf
+#define debug printf
+
+static int lpc24xx_mii_write(long PhyReg, long Value)
+{
+       long mst = 250;
+       int sts = 0;
+
+       /* Write value at PHY address and register */
+       __raw_writel((PHYDEF_PHYADDR << 8) | PhyReg, MAC_MADR);
+       __raw_writel(Value, MAC_MWTD);
+
+       /* Wait for unbusy status */
+       while (mst > 0) {
+               if ((__raw_readl(MAC_MIND) & 1) == 0) {
+                       mst = 0;
+                       sts = 1;
+               } else {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+
+       return sts;
+}
+
+static int lpc24xx_mii_read(unsigned long PhyReg, unsigned long *data) 
+{
+       unsigned long mst = 250;
+       int sts = 0;
+
+       /* Read value at PHY address and register */
+       __raw_writel((PHYDEF_PHYADDR << 8) | PhyReg, MAC_MADR);
+       __raw_writel(1, MAC_MCMD);
+
+       /* Wait for unbusy status */
+       while (mst > 0) {
+               if ((__raw_readl(MAC_MIND) & 1) == 0) {
+                       mst = 0;
+                       *data = __raw_readl(MAC_MRDD);
+                       sts = 1;
+               } else {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+
+       __raw_writel(0, MAC_MCMD);
+
+       return sts;
+}
+
+static int lpc24xx_phy_reset(void)
+{
+       int goodacc;
+       unsigned long tmp1, mst;
+
+       /* Reset the PHY and wait for reset to complete */
+       goodacc = lpc24xx_mii_write(PHY_BMCR, PHY_BMCR_RESET);
+       if (goodacc == 0)
+               return 0;
+
+       mst = 400;
+       goodacc = 0;
+       while (mst > 0) {
+               lpc24xx_mii_read(PHY_BMCR, &tmp1);
+               if ((tmp1 & PHY_BMCR_RESET) == 0) {
+                       mst = 0;
+                       goodacc = 1;
+               } else {
+                       mst--;
+                       msDelay(1);
+               }
+       }
+
+       return goodacc;
+}
+
+static int phy_get_link_status(void)
+{
+        unsigned long status;
+
+        /* Status is read once to clear old link state */
+        lpc24xx_mii_read(PHY_BMSR, &status);
+
+        /*
+        * Wait if the link is up, and autonegotiation is in progress
+        * (ie - we're capable and it's not done)
+        */
+        status = 0;
+        lpc24xx_mii_read(PHY_BMSR, &status);
+        if ((status & PHY_BMSR_LS) && (status & PHY_BMSR_AUTN_ABLE)
+            && !(status & PHY_BMSR_AUTN_COMP)) {
+                int i = 0;
+
+                while (!(status & PHY_BMSR_AUTN_COMP)) {
+                        /* Timeout reached */
+                        if (i > 1000) {
+                                error("Phy auto-negotiation timeout\n");
+                                return 1;
+                        }
+
+                        i++;
+                        msDelay(1);   /* 1 ms */
+                        lpc24xx_mii_read(PHY_BMSR,&status);
+                }
+                return 0;
+        } else {
+                if (status & PHY_BMSR_LS)
+                        return 0;
+                else
+                        return 1;
+        }
+
+        return 1;
+}
+
+static int txrx_setup(void)
+{
+       int idx;
+       unsigned long *pTXStatusL, pbase1, pbase2, pbase3;
+       TXRX_DESC_T *pTXRXDesc;
+       RX_STATUS_T *pRXStatusL;
+
+       /* Get physical address and size of DMA buffers */
+#if BUFF_SIZE_BYTES > LPC24XX_ENETRAM_SIZE
+       ethbuffs = malloc(BUFF_SIZE_BYTES);
+       if (!ethbuffs) {
+               error("Error allocating MAC buffers\n");
+               return 0;
+       }
+
+#else
+       ethbuffs = (unsigned long *) LPC24XX_ENETRAM_ADDR;
+#endif
+
+       /* Setup base pointers */
+       pbase1 = (unsigned long) ethbuffs; /* Start of descriptors */
+       pbase2 = pbase1 + 256;  /* Start of statuses */
+       pbase3 = pbase1 + 512; /* Start of buffers */
+
+       /* Setup pointers to TX structures */
+       __raw_writel(pbase1, MAC_TXDESC);
+       __raw_writel(pbase2, MAC_TXSTATUS);
+       __raw_writel(ENET_MAX_TX_PACKETS - 1, MAC_TXDESCNUM);
+
+       /* Save base address of TX descriptor table and TX status */
+       pTXRXDesc = (TXRX_DESC_T *) pbase1;
+       pTXStatusL = (unsigned long *) pbase2;
+       pTXDesc = pTXRXDesc;
+       pTXStatus = pTXStatusL;
+
+       /* Build TX descriptors */
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++) {
+               pTXRXDesc->packet = pbase3;
+               pTXRXDesc->control = 0;
+
+               /* Statuses are pre-filled to help with debugging */
+               *pTXStatusL = 0xFFFFFFFF;
+
+               /* Save virtual address of buffer */
+               pTXVBuffs [idx] = (unsigned long) pbase3;
+
+               /* Next descriptor and status */
+               pTXRXDesc++;
+               pTXStatusL++;
+               pbase3 += ENET_MAXF_SIZE;
+       }
+
+       /* Setup pointers to RX structures */
+       __raw_writel((long) pTXRXDesc, MAC_RXDESC);
+       __raw_writel((long) pTXStatusL, MAC_RXSTATUS);
+       __raw_writel(ENET_MAX_RX_PACKETS - 1, MAC_RXDESCNUM);
+
+       /* Save base address of RX descriptor table and RX status */
+       pRXDesc = pTXRXDesc;
+       pRXStatus = pRXStatusL = (RX_STATUS_T *) pTXStatusL;
+
+       /* Build RX descriptors */
+       for (idx = 0; idx < ENET_MAX_TX_PACKETS; idx++) {
+               pTXRXDesc->packet = pbase3;
+               pTXRXDesc->control = 0x80000000 | (ENET_MAXF_SIZE - 1);
+
+               /* Statuses are pre-filled to help with debugging */
+               pRXStatusL->statusinfo = 0xFFFFFFFF;
+               pRXStatusL->statushashcrc = 0xFFFFFFFF;
+
+               /* Save virtual address of buffer */
+               pRXVBuffs [idx] = (unsigned long) pbase3;
+
+               /* Next descriptor and status */
+               pTXRXDesc++;
+               pRXStatusL++;
+               pbase3 += ENET_MAXF_SIZE;
+       }
+
+    return 1;
+}
+
+int lpc24xx_eth_deinit(void)
+{
+       /* Reset PHY */
+       (void) lpc24xx_phy_reset();
+
+       /* Reset all MAC logic */
+       __raw_writel(0xCF00, MAC_MAC1);
+       __raw_writel(0x001C, MAC_COMMAND);
+       msDelay(2);
+
+       clk_enable(CLK_ENET, 0);
+
+#if BUFF_SIZE_BYTES > LPC24XX_ENETRAM_SIZE
+       free(ethbuffs);
+#endif
+
+       return 1;
+}
+
+int lpc24xx_hw_init(void)
+{
+       int btemp;
+       unsigned int duplex, speed;
+       unsigned long moduleid, tmp1, mst = 250;
+       char bd_enetaddr[6];
+
+       /* Get MAC address from environment variable */
+       eth_getenv_enetaddr("ethaddr", bd_enetaddr);
+
+       /* Enable MII clocking */
+       clk_enable(CLK_ENET, 1);
+
+       /* PINSEL muxing for the MII/RMII interfaces */
+#ifdef USE_PHY_RMII
+       /*
+        * Connect the following pins for RMII mode:
+        * ENET_TX_EN           P1.4
+        * ENET_TXD[0:1]        P1.0, P1.1
+        * ENET_RXD[0:1]        P1.9, P1.10
+        * ENET_RX_ER           P1.14
+        * ENET_CRS             P1.8
+        * ENET_REF/RX_CLK      P1.15
+        * ENET_MDC             P1.16
+        * ENET_MDIO            P1.17
+        */
+
+       /*
+        * Rev '-' parts also need P1.6 enabled, but later parts should not
+        * have this enabled. Use the module ID to determine if P1.6
+        * should be enabled or not.
+        */
+       moduleid = __raw_readl(MAC_MODULEID);
+
+       tmp1 = __raw_readl(PINSEL2);
+       if (moduleid == MAC_NONREVA_MODULEID) {
+               /* Rev '-' parts */
+               tmp1 &= ~0xF03F330F;
+               tmp1 |=  0x50151105;
+       } else {
+               /* Rev 'A' parts */
+               tmp1 &= ~0xF03F030F;
+               tmp1 |=  0x50150105;
+       }
+       __raw_writel(tmp1, PINSEL2);
+
+       /* MDIO and MDC */
+       tmp1 = __raw_readl(PINSEL3);
+       tmp1 &= ~0x0000000F;
+       tmp1 |=  0x00000005;
+       __raw_writel(tmp1, PINSEL3);
+
+       /* Pin mode - disable pullups and pulldowns */
+       tmp1 = __raw_readl(PINMODE2);
+       if (moduleid == MAC_NONREVA_MODULEID) {
+               /* Rev '-' parts */
+               tmp1 &= ~0xF03F330F;
+               tmp1 |=  0xA02A220A;
+       } else {
+               /* Rev 'A' parts */
+               tmp1 &= ~0xF03F030F;
+               tmp1 |=  0xA02A020A;
+       }
+       __raw_writel(tmp1, PINMODE2);
+
+       /* MDIO and MDC */
+       tmp1 = __raw_readl(PINMODE3);
+       tmp1 &= ~0x0000000F;
+       tmp1 |=  0x0000000A;
+       __raw_writel(tmp1, PINMODE3);
+
+#else
+       /*
+        * Connect the following pins for MII mode
+        * ENET_TX_EN           
+        * ENET_TXD[0:3]        
+        * ENET_TX_ER           
+        * ENET_TX_CLK          
+        * ENET_RX_DV           
+        * ENET_RXD[0:3]        
+        * ENET_RX_ER           
+        * ENET_RX_CLK          
+        * ENET_COL             
+        * ENET_CRS             
+        */
+#pragma error Finish me!
+#endif
+
+       /* Set RMII management clock rate */
+       __raw_writel((7 << 2), MAC_MCFG);
+
+       /* Reset all MAC logic */
+       __raw_writel(0xCF00, MAC_MAC1);
+       __raw_writel(0x0038, MAC_COMMAND);
+       msDelay(10);
+
+       /* Initial MAC initialization */
+       __raw_writel(0x0002, MAC_MAC1);
+       __raw_writel(0x0030, MAC_MAC2);
+       __raw_writel(ENET_MAXF_SIZE, MAC_MAXF);
+
+       /* Maximum number of retries, 0x37 collision window, gap */
+       __raw_writel(0xF | (0x37 << 8), MAC_CLRT);
+       __raw_writel(0x12, MAC_IPGR);
+
+#ifdef USE_PHY_RMII
+       /* RMII setup */
+       __raw_writel(0x240, MAC_COMMAND);
+       __raw_writel(0x000, MAC_SUPP);
+       msDelay(10);
+#else
+       /* MII setup */
+       __raw_writel(0x040, MAC_COMMAND);
+#endif
+
+       /* Enable rate auto-negotiation for the link */
+       if (lpc24xx_mii_write(PHY_BMCR,
+               (PHY_BMCR_100MB | PHY_BMCR_AUTON)) == 0)
+               return 0;
+
+       mst = 1000;
+        btemp = 1;
+        while (mst > 0) {
+                /* Wait for Link status to set UP or Timeout */
+                if (phy_get_link_status() == 0) {
+                        mst = 0;
+                        btemp = 0;
+                        debug("ENET: auto-negotiation complete\n");
+                } else {
+                        mst--;
+                        msDelay(1);
+                }
+        }
+
+        if (btemp) {
+                debug("ENET: auto-negotiation failed\n");
+                return 0;
+        }
+
+        /* Read PHY Status Register to determine Ethernet Configuration */
+        tmp1 = 0;
+        lpc24xx_mii_read(DP83848_PHY_STATUS, &tmp1);
+        duplex = (tmp1 & 0x0004) >> 2;
+        speed = (tmp1 & 0x0002) >> 1;
+
+       /* Configure Full/Half Duplex mode */
+       if (duplex == 1) {
+               /* Full duplex is supported */
+               __raw_writel(__raw_readl(MAC_MAC2) | 1, MAC_MAC2);
+               __raw_writel(__raw_readl(MAC_COMMAND) | (1 << 10),
+                       MAC_COMMAND);
+               __raw_writel(0x15, MAC_IPGT);
+               debug("ENET: Full duplex\n");
+       } else {
+               __raw_writel(0x12, MAC_IPGT);
+               debug("ENET: Half duplex\n");
+       }
+
+       /* Configure 100MBit/10MBit mode */
+       if (speed == 0) {
+               /* 100MBase mode */
+               __raw_writel((1 << 8), MAC_SUPP);
+               debug("ENET: 100MBaseT\n");
+       } else  {
+               /* 10MBase mode */
+               __raw_writel(0, MAC_SUPP);
+               debug("ENET: 10BaseT\n");
+       }
+
+       /* Save station address */
+       __raw_writel((unsigned long) (bd_enetaddr[0] |
+               (bd_enetaddr[1] << 8)), MAC_SA2);
+       __raw_writel((unsigned long) (bd_enetaddr[2] |
+               (bd_enetaddr[3] << 8)), MAC_SA1);
+       __raw_writel((unsigned long) (bd_enetaddr[4] |
+               (bd_enetaddr[5] << 8)), MAC_SA0);
+
+       /* Setup TX and RX descriptors */
+       if (!txrx_setup()) {
+               error("Error initializing MAC buffers\n");
+               lpc24xx_eth_deinit();
+               return 0;
+       }
+
+       /* Enable broadcast and matching address packets */
+       __raw_writel(0x22, MAC_RXFILTCTRL);
+
+       /* Clear and enable interrupts */
+       __raw_writel(0xFFFF, MAC_INTCLR);
+       __raw_writel(0x0, MAC_INTENAB);
+
+       /* Enable receive and transmit mode of MAC ethernet core */
+       __raw_writel(__raw_readl(MAC_COMMAND) | 0x03, MAC_COMMAND);
+       __raw_writel(__raw_readl(MAC_MAC1) | 1, MAC_MAC1);
+
+       /*
+        * Perform a 'dummy' send of the first ethernet frame with a size of 4
+        * to 'prime' the MAC.
+        */
+       tmp1 = 0;
+       eth_send(&tmp1, 4);
+
+       return 1;
+}
+
+void eth_halt(void)
+{
+       lpc24xx_eth_deinit();
+}
+
+int eth_init(bd_t *bd)
+{
+       /* De-init if an error occurred */
+       if (lpc24xx_hw_init() == 0) {
+               error("ENET init failure\n");
+               lpc24xx_eth_deinit();
+               return -1;
+       }
+
+       return 0;
+}
+
+int eth_rx(void)
+{
+       unsigned long idx, length;
+
+       /* Determine if a frame has been received */
+       length = 0;
+       idx = __raw_readl(MAC_RXCONSIDX);
+       if (__raw_readl(MAC_RXPRODIDX) != idx) {
+               /* Clear interrupt */
+               __raw_writel((1 << 3), MAC_INTCLR);
+
+               /* Frame received, get size of RX packet */
+               length = pRXStatus[idx].statusinfo & 0x7FF;
+
+               /* Pass the packet up to the protocol layer */
+               if (length > 0) {
+                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);
+                       NetReceive(NetRxPackets[0], (unsigned short) length);
+               }
+
+               /* Return DMA buffer */
+               idx++;
+               if (idx >= ENET_MAX_RX_PACKETS)
+                       idx = 0;
+
+               __raw_writel(idx, MAC_RXCONSIDX);
+       }
+
+       return (int) length;
+}
+
+int eth_send(volatile void *packet, int length)
+{
+       unsigned long idx, cidx, fb;
+
+       /* Determine number of free buffers and wait for a buffer if needed */
+       fb = 0;
+       while (fb == 0) {
+               idx = __raw_readl(MAC_TXPRODIDX);
+               cidx = __raw_readl(MAC_TXCONSIDX);
+
+               if (idx == cidx)
+                       fb = ENET_MAX_TX_PACKETS;
+               else if (cidx > idx)
+                       fb = (ENET_MAX_TX_PACKETS - 1) -
+                               ((idx + ENET_MAX_TX_PACKETS) - cidx);
+               else
+                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);
+       }
+
+       /* Update descriptor with new frame size */
+       pTXDesc[idx].control = (length | 0x40000000);
+
+       /* Move data to buffer */
+       memcpy((void *) pTXVBuffs [idx], (void *)packet, length);
+
+       /* Get next index for transmit data DMA buffer and descriptor */
+       idx++;
+       if (idx >= ENET_MAX_TX_PACKETS)
+               idx = 0;
+
+       __raw_writel(idx, MAC_TXPRODIDX);
+
+       return 0;
+}
+
diff --git a/include/configs/ea2468.h b/include/configs/ea2468.h
new file mode 100644 (file)
index 0000000..580edc3
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * (C) Copyright 2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * Configuation settings for the LPC2468ODIMM board from Embedded Artists.
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * Linux machine type
+ */
+#define CONFIG_LPC24XX_MACHID          MACH_TYPE_LPC24XX
+
+/*
+ * SDRAM physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS           1
+#define PHYS_SDRAM_1                   0xA0000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE              0x02000000 /* 32 MB SDRAM */
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
+
+/*
+ * Needed for board init
+ */
+#undef CONFIG_SKIP_LOWLEVEL_INIT
+
+/*
+ * Board specific oscillator rate
+ */
+#define OSC_RATE                       12000000
+
+/*
+ * Special note: For the timing setup below, just changing the timings here
+ * may not be enough. There is usually board specific code that also needs
+ * to be setup.
+ */
+
+/*
+ * Default PLL clock rate for the CPU. The combination of N, M, with the
+ * oscilaltor rate are used to setup the PLL rate. The formula for the
+ * PLL rate is (2 * OSC_RATE * (M + 1)) / (N + 1). There are limitations
+ * to the rate. See the User's guide. The rate selected here is ideal
+ * for good CPU performance and will meet the requirements of the USB
+ * clock source.
+ *
+ * Example:
+ * For M = 11, N = 0, and OSC_RATE = 12MHz, the PLL rate is
+ * (2 * 12M * 12) / 1 = 288MHz
+ */
+#define CONFIG_SYSPLL_M                        11
+#define CONFIG_SYSPLL_N                        0
+#define PLL_RATE                       ((2 * (OSC_RATE) * \
+       ((CONFIG_SYSPLL_M) + 1)) / ((CONFIG_SYSPLL_N) + 1))
+
+/*
+ * The CPU, USB, and peripheral clock dividers are provided here. The CPU
+ * USB clock are both based off the PLL clock and the divider sets the
+ * rate from the PLL clock. If USB is used, a divider should be selected
+ * that will allow the USB clock to run at 48MHz - this requires selecting
+ * a PLL rate that is a perfect or very solid integer divider of 48MHz.
+ * The CPU rate must not exceed 72MHz. Peripheral clocking can be selected
+ * with PCLK_DIV value and must be 1, 2, or 4. The PCLK divider is based
+ * against the CPU clock. Note CLKCFG and USBCLKCFG values are off by 1,
+ * so use a value of 4 for a divider of 5.
+ */
+#define CONFIG_CLKCFG                  4 /* Divided by 5 */
+#define CONFIG_PCLK_DIV                        2 /* 1, 2, 4, or 8 only */
+#define CONFIG_SYS_CLK_RATE            ((PLL_RATE) / ((CONFIG_CLKCFG) + 1))
+#define CONFIG_ENAB_USBCLK             1
+#define CONFIG_USBCLKCFG               5 /* Divided by 6 */
+
+/*
+ * Enable this define if the data bus width is 32-bit (ie, 32-bit DRAM)
+ */
+/* #define LPC24XX_32BIT_BUS */
+
+#define PHYS_FLASH_1                   0x80000000
+#define PHYS_FLASH_SIZE                        0x00400000
+#define CONFIG_SYS_FLASH_BASE          (PHYS_FLASH_1)
+#define CONFIG_SYS_FLASH0_SIZE         (PHYS_FLASH_SIZE)
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_MAX_FLASH_BANKS     1
+#define CONFIG_SYS_FLASH_CFI_WIDTH     FLASH_CFI_16BIT
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_SYS_MAX_FLASH_SECT      1024
+#define CONFIG_FLASH_CFI_LEGACY
+
+/*
+ * 2KHz clock tick
+ */
+#define        CONFIG_SYS_HZ                   1000
+#define CONFIG_SYS_SYS_CLK_FREQ                CONFIG_SYSPLL_CLK_RATE
+
+/*
+ * CPU options
+ */
+#define CONFIG_ARM7                    1
+#define CONFIG_ARM_THUMB               1
+#undef CONFIG_ARM7_REVD
+#define CONFIG_LPC24XX
+#define CONFIG_SYS_NO_ICACHE           1
+#define CONFIG_SYS_NO_DCACHE           1
+
+/*
+ * Address and size of stored environment Data
+ */
+#define CONFIG_ENV_IS_IN_NAND          1
+#define CONFIG_ENV_SIZE                        0x40000 /* 2 blocks */
+#define CONFIG_ENV_OFFSET              0x40000 /* Blocks 2, 3 */
+#define CONFIG_ENV_ADDR                        0xA0000100 /* ATAGs passed here */
+
+/*
+ * Area and size for malloc
+ */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 1024 * 1024)
+
+/*
+ * No support for IRQs
+ */
+#undef CONFIG_USE_IRQ
+
+/*
+ * Stack size and global data size
+ */
+#define CONFIG_STACKSIZE               (32 * 1024)
+#define CONFIG_SYS_GBL_DATA_SIZE       128
+
+/*
+ * ATAG support
+ */
+#define CONFIG_CMDLINE_TAG             1
+#define CONFIG_SETUP_MEMORY_TAGS       1
+#define CONFIG_INITRD_TAG              1
+
+/*
+ * System UART selection, valid selections include 0, 1, 2, 3
+ */
+#define CONFIG_LPC24XX_UART            0 /* 0 - 3 */
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      {9600, 19200, 38400, 57600, 115200}
+
+/*
+ * Default load address for programs
+ */
+#define CONFIG_SYS_LOAD_ADDR           0xA0100000
+
+/*
+ * Default boot delay is 3 seconds
+ */
+#define CONFIG_BOOTDELAY               3
+#define CONFIG_ZERO_BOOTDELAY_CHECK
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+/*
+ * Prompt and command buffer setup
+ */
+#define CONFIG_SYS_LONGHELP
+#define        CONFIG_SYS_CBSIZE               256
+#define        CONFIG_SYS_PROMPT               "uboot> "
+#define        CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16)
+#define        CONFIG_SYS_MAXARGS              16
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+
+/*
+ * Default range for the memory tests
+ */
+#define CONFIG_SYS_MEMTEST_START       PHYS_SDRAM_1
+#define CONFIG_SYS_MEMTEST_END         (PHYS_SDRAM_1 + 0x01000000)
+
+/*
+ * Support for NAND FLASH, environment store in NAND at block 100
+ */
+#define CONFIG_CMD_NAND
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           0x81000000
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/*
+ * Support for various capabilities
+ */
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+
+/*
+ * Network setup
+ */
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_IPADDR          192.168.1.101
+#define CONFIG_SERVERIP                192.168.1.41
+#define CONFIG_GATEWAYIP       192.168.1.1
+#define CONFIG_ETHADDR         00:E0:0C:00:00:01
+
+#define CONFIG_BOOTFILE                uImage
+#define CONFIG_LOADADDR                0xA0100000
+#define CONFIG_ROOTPATH                /home/user/dev/rootfs
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_SUBNETMASK
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_HOSTNAME
+#define CONFIG_BOOTP_BOOTFILESIZE
+
+/*
+ * Other commands
+ */
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_ECHO
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_SAVES
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_BDI
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_ELF
+#undef CONFIG_CMD_MISC
+#define CONFIG_MISC_INIT_R
+
+/*
+ * Initial data areas
+ */
+#define CONFIG_SYS_INIT_RAM_ADDR 0x40000000
+#define CONFIG_SYS_INIT_RAM_SIZE 0x10000
+#define CONFIG_SYS_INIT_SP_OFFSET (CONFIG_SYS_INIT_RAM_SIZE - \
+       GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR        (CONFIG_SYS_INIT_RAM_ADDR + \
+       CONFIG_SYS_INIT_SP_OFFSET)
+
+#endif
+
index a309c26..47b4a71 100644 (file)
@@ -29,7 +29,7 @@
 #endif
 
 /* ------------------------------------------------------------------------- */
-
+#if !defined(CONFIG_LPC24XX)
 void udelay(unsigned long usec)
 {
        ulong kv;
@@ -41,3 +41,4 @@ void udelay(unsigned long usec)
                usec -= kv;
        } while(usec);
 }
+#endif