]> git.sur5r.net Git - u-boot/commitdiff
Merge branch 'Makefile' of git://git.denx.de/u-boot-arm
authorWolfgang Denk <wd@denx.de>
Sun, 31 Aug 2008 22:16:29 +0000 (00:16 +0200)
committerWolfgang Denk <wd@denx.de>
Sun, 31 Aug 2008 22:16:29 +0000 (00:16 +0200)
148 files changed:
MAINTAINERS
MAKEALL
Makefile
board/ads5121/ads5121.c
board/ap325rxa/Makefile [new file with mode: 0644]
board/ap325rxa/ap325rxa.c [new file with mode: 0644]
board/ap325rxa/config.mk [new file with mode: 0644]
board/ap325rxa/cpld-ap325rxa.c [new file with mode: 0644]
board/ap325rxa/lowlevel_init.S [new file with mode: 0644]
board/ap325rxa/u-boot.lds [new file with mode: 0644]
board/davinci/common/Makefile [new file with mode: 0644]
board/davinci/common/misc.c [new file with mode: 0644]
board/davinci/common/misc.h [new file with mode: 0644]
board/davinci/common/psc.c [new file with mode: 0644]
board/davinci/common/psc.h [new file with mode: 0644]
board/davinci/dv-evm/Makefile [deleted file]
board/davinci/dv-evm/board_init.S [deleted file]
board/davinci/dv-evm/config.mk [deleted file]
board/davinci/dv-evm/dv_board.c [deleted file]
board/davinci/dv-evm/u-boot.lds [deleted file]
board/davinci/dvevm/Makefile [new file with mode: 0644]
board/davinci/dvevm/board_init.S [new file with mode: 0644]
board/davinci/dvevm/config.mk [new file with mode: 0644]
board/davinci/dvevm/dvevm.c [new file with mode: 0644]
board/davinci/dvevm/u-boot.lds [new file with mode: 0644]
board/davinci/schmoogie/Makefile
board/davinci/schmoogie/dv_board.c [deleted file]
board/davinci/schmoogie/schmoogie.c [new file with mode: 0644]
board/davinci/sffsdr/sffsdr.c
board/davinci/sonata/Makefile
board/davinci/sonata/dv_board.c [deleted file]
board/davinci/sonata/sonata.c [new file with mode: 0644]
board/freescale/m54451evb/m54451evb.c
board/freescale/m54455evb/m54455evb.c
board/freescale/m54455evb/mii.c
board/integratorap/Makefile
board/integratorap/memsetup.S [deleted file]
board/integratorcp/Makefile
board/integratorcp/memsetup.S [deleted file]
board/rsk7203/Makefile [new file with mode: 0644]
board/rsk7203/config.mk [new file with mode: 0644]
board/rsk7203/lowlevel_init.S [new file with mode: 0644]
board/rsk7203/rsk7203.c [new file with mode: 0644]
board/rsk7203/u-boot.lds [new file with mode: 0644]
board/samsung/smdk6400/.gitignore [new file with mode: 0644]
board/samsung/smdk6400/Makefile [new file with mode: 0644]
board/samsung/smdk6400/config.mk [new file with mode: 0644]
board/samsung/smdk6400/lowlevel_init.S [new file with mode: 0644]
board/samsung/smdk6400/smdk6400.c [new file with mode: 0644]
board/samsung/smdk6400/u-boot-nand.lds [new file with mode: 0644]
board/sh7785lcr/Makefile [new file with mode: 0644]
board/sh7785lcr/config.mk [new file with mode: 0644]
board/sh7785lcr/lowlevel_init.S [new file with mode: 0644]
board/sh7785lcr/rtl8169.h [new file with mode: 0644]
board/sh7785lcr/rtl8169_mac.c [new file with mode: 0644]
board/sh7785lcr/selfcheck.c [new file with mode: 0644]
board/sh7785lcr/sh7785lcr.c [new file with mode: 0644]
board/sh7785lcr/u-boot.lds [new file with mode: 0644]
cpu/arm1176/Makefile [new file with mode: 0644]
cpu/arm1176/config.mk [new file with mode: 0644]
cpu/arm1176/cpu.c [new file with mode: 0644]
cpu/arm1176/s3c64xx/Makefile [new file with mode: 0644]
cpu/arm1176/s3c64xx/config.mk [new file with mode: 0644]
cpu/arm1176/s3c64xx/cpu_init.S [new file with mode: 0644]
cpu/arm1176/s3c64xx/interrupts.c [new file with mode: 0644]
cpu/arm1176/s3c64xx/speed.c [new file with mode: 0644]
cpu/arm1176/s3c64xx/usb.c [new file with mode: 0644]
cpu/arm1176/start.S [new file with mode: 0644]
cpu/arm926ejs/davinci/dp83848.c
cpu/arm926ejs/davinci/ether.c
cpu/arm926ejs/davinci/lxt972.c
cpu/mcf5227x/speed.c
cpu/mcf523x/cpu_init.c
cpu/mcf523x/speed.c
cpu/mcf52x2/cpu_init.c
cpu/mcf52x2/speed.c
cpu/mcf532x/speed.c
cpu/mcf5445x/speed.c
cpu/mcf547x_8x/speed.c
cpu/mpc512x/Makefile
cpu/mpc512x/fec.c [deleted file]
cpu/mpc512x/fec.h [deleted file]
cpu/mpc5xxx/Makefile
cpu/mpc5xxx/fec.c [deleted file]
cpu/mpc5xxx/fec.h [deleted file]
cpu/mpc5xxx/sdma.h [deleted file]
cpu/ppc4xx/44x_spd_ddr2.c
cpu/ppc4xx/ndfc.c
cpu/ppc4xx/uic.c
cpu/sh2/Makefile [new file with mode: 0644]
cpu/sh2/cache.c [new file with mode: 0644]
cpu/sh2/config.mk [new file with mode: 0644]
cpu/sh2/cpu.c [new file with mode: 0644]
cpu/sh2/interrupts.c [new file with mode: 0644]
cpu/sh2/start.S [new file with mode: 0644]
cpu/sh2/time.c [new file with mode: 0644]
cpu/sh2/watchdog.c [new file with mode: 0644]
doc/README.sh7785lcr [new file with mode: 0644]
drivers/i2c/fsl_i2c.c
drivers/mtd/nand/Makefile
drivers/mtd/nand/s3c64xx.c [new file with mode: 0644]
drivers/net/Makefile
drivers/net/mpc512x_fec.c [new file with mode: 0644]
drivers/net/mpc512x_fec.h [new file with mode: 0644]
drivers/net/mpc5xxx_fec.c [new file with mode: 0644]
drivers/net/mpc5xxx_fec.h [new file with mode: 0644]
drivers/serial/Makefile
drivers/serial/s3c64xx.c [new file with mode: 0644]
drivers/serial/serial_sh.c
drivers/usb/usb_ohci.c
examples/Makefile
include/asm-arm/arch-davinci/emac_defs.h
include/asm-arm/arch-s3c64xx/hardware.h [new file with mode: 0644]
include/asm-m68k/fsl_i2c.h
include/asm-sh/cpu_sh2.h [new file with mode: 0644]
include/asm-sh/cpu_sh4.h
include/asm-sh/cpu_sh7203.h [new file with mode: 0644]
include/asm-sh/cpu_sh7723.h [new file with mode: 0644]
include/asm-sh/cpu_sh7785.h [new file with mode: 0644]
include/asm-sh/processor.h
include/common.h
include/configs/M5235EVB.h
include/configs/M5249EVB.h
include/configs/M5253DEMO.h
include/configs/M5271EVB.h
include/configs/M5272C3.h
include/configs/M5275EVB.h
include/configs/M5282EVB.h
include/configs/M54451EVB.h
include/configs/M54455EVB.h
include/configs/M5475EVB.h
include/configs/M5485EVB.h
include/configs/ads5121.h
include/configs/ap325rxa.h [new file with mode: 0644]
include/configs/rsk7203.h [new file with mode: 0644]
include/configs/sequoia.h
include/configs/sh7785lcr.h [new file with mode: 0644]
include/configs/smdk6400.h [new file with mode: 0644]
include/mpc512x.h
include/mpc5xxx_sdma.h [new file with mode: 0644]
include/s3c6400.h [new file with mode: 0644]
include/s3c64x0.h [new file with mode: 0644]
lib_arm/board.c
lib_m68k/board.c
nand_spl/board/samsung/smdk6400/Makefile [new file with mode: 0644]
nand_spl/board/samsung/smdk6400/config.mk [new file with mode: 0644]
nand_spl/board/samsung/smdk6400/u-boot.lds [new file with mode: 0644]
net/eth.c

index 57a79b41389006a5afa178da62926c237d969a17..3f16dabf52079907f2df1b1a6935b485966c06e1 100644 (file)
@@ -531,6 +531,7 @@ Prakash Kumar <prakash@embedx.com>
 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
 
        mx31ads         i.MX31
+       SMDK6400        S3C6400
 
 David Müller <d.mueller@elsoft.ch>
 
@@ -753,12 +754,15 @@ Yusuke Goda <goda.yusuke@renesas.com>
        MIGO-R          SH7722
 
 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+                 <iwamatsu.nobuhiro@renesas.com>
 
        MS7750SE        SH7750
        MS7722SE        SH7722
        R7780MP         SH7780
        R2DPlus         SH7751R
        SH7763RDP       SH7763
+       RSK7203         SH7203
+       AP325RXA        SH7723
 
 Mark Jonas <mark.jonas@de.bosch.com>
 
@@ -767,6 +771,11 @@ Mark Jonas <mark.jonas@de.bosch.com>
 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
 
        MS7720SE        SH7720
+       R0P77850011RL   SH7785
+
+Yusuke Goda <goda.yusuke@renesas.com>
+
+       MIGO-R          SH7722
 
 #########################################################################
 # Blackfin Systems:                                                    #
diff --git a/MAKEALL b/MAKEALL
index e382947353e6d9309139aed326b1373f5e3bed15..fe284b5ee23f937666421767c72e074ca5c87829 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -519,6 +519,7 @@ LIST_ARM11="                \
        imx31_litekit   \
        imx31_phycore   \
        mx31ads         \
+       smdk6400        \
 "
 
 #########################################################################
@@ -740,6 +741,9 @@ LIST_blackfin="             \
 ## SH Systems
 #########################################################################
 
+LIST_sh2="             \
+       rsk7203         \
+"
 LIST_sh3="             \
        mpr2            \
        ms7720se        \
@@ -752,9 +756,12 @@ LIST_sh4="         \
        r7780mp         \
        r2dplus         \
        sh7763rdp       \
+       sh7785lcr       \
+       ap325rxa        \
 "
 
 LIST_sh="              \
+       ${LIST_sh2}     \
        ${LIST_sh3}     \
        ${LIST_sh4}     \
 "
@@ -799,7 +806,7 @@ do
        |mips|mips_el \
        |nios|nios2 \
        |ppc|5xx|5xxx|512x|8xx|8220|824x|8260|83xx|85xx|86xx|4xx|7xx|74xx|TSEC \
-       |sh|sh3|sh4 \
+       |sh|sh2|sh3|sh4 \
        |sparc \
        |x86|I486 \
        )
index a00195ccd034fd55e6cb2431a7da6c6afb87d669..2d4b51316aef322031cac219bf7eeccc1e591d20 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2496,7 +2496,7 @@ cp1026_config: unconfig
        @board/integratorcp/split_by_variant.sh $@
 
 davinci_dvevm_config : unconfig
-       @$(MKCONFIG) $(@:_config=) arm arm926ejs dv-evm davinci davinci
+       @$(MKCONFIG) $(@:_config=) arm arm926ejs dvevm davinci davinci
 
 davinci_schmoogie_config :     unconfig
        @$(MKCONFIG) $(@:_config=) arm arm926ejs schmoogie davinci davinci
@@ -2759,6 +2759,23 @@ mx31ads_config           : unconfig
 omap2420h4_config      : unconfig
        @$(MKCONFIG) $(@:_config=) arm arm1136 omap2420h4 NULL omap24xx
 
+#########################################################################
+## ARM1176 Systems
+#########################################################################
+smdk6400_noUSB_config  \
+smdk6400_config        :       unconfig
+       @mkdir -p $(obj)include $(obj)board/samsung/smdk6400
+       @mkdir -p $(obj)nand_spl/board/samsung/smdk6400
+       @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
+       @if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then                       \
+               echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
+               $(MKCONFIG) $(@:_config=) arm arm1176 smdk6400 samsung s3c64xx;         \
+       else                                                                            \
+               echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
+               $(MKCONFIG) $(@:_noUSB_config=) arm arm1176 smdk6400 samsung s3c64xx;   \
+       fi
+       @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
+
 #========================================================================
 # i386
 #========================================================================
@@ -3006,6 +3023,14 @@ mimc200_config           :       unconfig
 # SH3 (SuperH)
 #========================================================================
 
+#########################################################################
+## sh2 (Renesas SuperH)
+#########################################################################
+rsk7203_config: unconfig
+       @ >include/config.h
+       @echo "#define CONFIG_RSK7203 1" >> include/config.h
+       @./mkconfig -a $(@:_config=) sh sh2 rsk7203
+
 #########################################################################
 ## sh3 (Renesas SuperH)
 #########################################################################
@@ -3042,17 +3067,27 @@ ms7722se_config :       unconfig
 r2dplus_config  :   unconfig
        @mkdir -p $(obj)include
        @echo "#define CONFIG_R2DPLUS 1" > $(obj)include/config.h
-       @./mkconfig -a $(@:_config=) sh sh4 r2dplus
+       @$(MKCONFIG) -a $(@:_config=) sh sh4 r2dplus
 
 r7780mp_config: unconfig
        @mkdir -p $(obj)include
        @echo "#define CONFIG_R7780MP 1" > $(obj)include/config.h
-       @./mkconfig -a $(@:_config=) sh sh4 r7780mp
+       @$(MKCONFIG) -a $(@:_config=) sh sh4 r7780mp
 
 sh7763rdp_config  :   unconfig
        @mkdir -p $(obj)include
        @echo "#define CONFIG_SH7763RDP 1" > $(obj)include/config.h
-       @./mkconfig -a $(@:_config=) sh sh4 sh7763rdp
+       @$(MKCONFIG) -a $(@:_config=) sh sh4 sh7763rdp
+
+sh7785lcr_config  :   unconfig
+       @ >include/config.h
+       @echo "#define CONFIG_SH7785LCR 1" >> include/config.h
+       @$(MKCONFIG) -a $(@:_config=) sh sh4 sh7785lcr
+
+ap325rxa_config  :   unconfig
+       @mkdir -p $(obj)include
+       @echo "#define CONFIG_AP325RXA 1" > $(obj)include/config.h
+       @$(MKCONFIG) -a $(@:_config=) sh sh4 ap325rxa
 
 #========================================================================
 # SPARC
index ba3d7d2a0d5547788c5bb4b6b44c9bceed12f77b..deaa292b9af60ff893195c3f6688333ac5e579fa 100644 (file)
@@ -25,6 +25,7 @@
 #include <mpc512x.h>
 #include <asm/bitops.h>
 #include <command.h>
+#include <asm/processor.h>
 #include <fdt_support.h>
 #ifdef CONFIG_MISC_INIT_R
 #include <i2c.h>
@@ -92,6 +93,9 @@ int board_early_init_f (void)
         * Configure Flash Speed
         */
        *((volatile u32 *)(CFG_IMMR + LPC_OFFSET + CS0_CONFIG)) = CFG_CS0_CFG;
+       if (SVR_MJREV (im->sysconf.spridr) >= 2) {
+               *((volatile u32 *)(CFG_IMMR + LPC_OFFSET + CS_ALE_TIMING_CONFIG)) = CFG_CS_ALETIMING;
+       }
        /*
         * Enable clocks
         */
diff --git a/board/ap325rxa/Makefile b/board/ap325rxa/Makefile
new file mode 100644 (file)
index 0000000..21f3e6e
--- /dev/null
@@ -0,0 +1,51 @@
+#########################################################################
+#
+# Copyright (C) 2008 Renesas Solutions Corp.
+# Copyright (C) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
+#
+# board/ap325rxa/Makefile
+#
+# 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  := ap325rxa.o cpld-ap325rxa.o
+SOBJS  := lowlevel_init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(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/ap325rxa/ap325rxa.c b/board/ap325rxa/ap325rxa.c
new file mode 100644 (file)
index 0000000..cfa0261
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ * Copyright (C) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.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 <common.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+
+/* PRI control register */
+#define PRPRICR5       0xFF800048 /* LMB */
+#define PRPRICR5_D     0x2a
+
+/* FPGA control */
+#define FPGA_NAND_CTL  0xB410020C
+#define FPGA_NAND_RST  0x0008
+#define FPGA_NAND_INIT 0x0000
+#define FPGA_NAND_RST_WAIT     10000
+
+/* I/O port data */
+#define PACR_D 0x0000
+#define PBCR_D 0x0000
+#define PCCR_D 0x1000
+#define PDCR_D 0x0000
+#define PECR_D 0x0410
+#define PFCR_D 0xffff
+#define PGCR_D 0x0000
+#define PHCR_D 0x5011
+#define PJCR_D 0x4400
+#define PKCR_D 0x7c00
+#define PLCR_D 0x0000
+#define PMCR_D 0x0000
+#define PNCR_D 0x0000
+#define PQCR_D 0x0000
+#define PRCR_D 0x0000
+#define PSCR_D 0x0000
+#define PTCR_D 0x0010
+#define PUCR_D 0x0fff
+#define PVCR_D 0xffff
+#define PWCR_D 0x0000
+#define PXCR_D 0x7500
+#define PYCR_D 0x0000
+#define PZCR_D 0x5540
+
+/* Pin Function Controler data */
+#define PSELA_D        0x1410
+#define PSELB_D        0x0140
+#define PSELC_D        0x0000
+#define PSELD_D        0x0400
+
+/* I/O Buffer Hi-Z data */
+#define        HIZCRA_D        0x0000
+#define HIZCRB_D       0x1000
+#define HIZCRC_D       0x0000
+#define HIZCRD_D       0x0000
+
+/* Module select reg data */
+#define MSELCRA_D      0x0014
+#define MSELCRB_D      0x0018
+
+/* Module Stop reg Data */
+#define MSTPCR2_D      0xFFD9F280
+
+/* CPLD loader */
+extern void init_cpld(void);
+
+int checkboard(void)
+{
+       puts("BOARD: AP325RXA\n");
+       return 0;
+}
+
+int board_init(void)
+{
+       /* Pin Function Controler Init */
+       outw(PSELA_D, PSELA);
+       outw(PSELB_D, PSELB);
+       outw(PSELC_D, PSELC);
+       outw(PSELD_D, PSELD);
+
+       /* I/O Buffer Hi-Z Init */
+       outw(HIZCRA_D, HIZCRA);
+       outw(HIZCRB_D, HIZCRB);
+       outw(HIZCRC_D, HIZCRC);
+       outw(HIZCRD_D, HIZCRD);
+
+       /* Module select reg Init */
+       outw(MSELCRA_D, MSELCRA);
+       outw(MSELCRB_D, MSELCRB);
+
+       /* Module Stop reg Init */
+       outl(MSTPCR2_D, MSTPCR2);
+
+       /* I/O ports */
+       outw(PACR_D, PACR);
+       outw(PBCR_D, PBCR);
+       outw(PCCR_D, PCCR);
+       outw(PDCR_D, PDCR);
+       outw(PECR_D, PECR);
+       outw(PFCR_D, PFCR);
+       outw(PGCR_D, PGCR);
+       outw(PHCR_D, PHCR);
+       outw(PJCR_D, PJCR);
+       outw(PKCR_D, PKCR);
+       outw(PLCR_D, PLCR);
+       outw(PMCR_D, PMCR);
+       outw(PNCR_D, PNCR);
+       outw(PQCR_D, PQCR);
+       outw(PRCR_D, PRCR);
+       outw(PSCR_D, PSCR);
+       outw(PTCR_D, PTCR);
+       outw(PUCR_D, PUCR);
+       outw(PVCR_D, PVCR);
+       outw(PWCR_D, PWCR);
+       outw(PXCR_D, PXCR);
+       outw(PYCR_D, PYCR);
+       outw(PZCR_D, PZCR);
+
+       /* PRI control register Init */
+       outl(PRPRICR5_D, PRPRICR5);
+
+       /* cpld init */
+       init_cpld();
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       gd->bd->bi_memstart = CFG_SDRAM_BASE;
+       gd->bd->bi_memsize = CFG_SDRAM_SIZE;
+       printf("DRAM:  %dMB\n", CFG_SDRAM_SIZE / (1024 * 1024));
+       return 0;
+}
+
+void led_set_state(unsigned short value)
+{
+}
+
+void ide_set_reset(int idereset)
+{
+       outw(FPGA_NAND_RST, FPGA_NAND_CTL);     /* NAND RESET */
+       udelay(FPGA_NAND_RST_WAIT);
+       outw(FPGA_NAND_INIT, FPGA_NAND_CTL);
+}
diff --git a/board/ap325rxa/config.mk b/board/ap325rxa/config.mk
new file mode 100644 (file)
index 0000000..b52a5e5
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2007
+# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+#
+# 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
+
+#
+# TEXT_BASE refers to image _after_ relocation.
+#
+# NOTE: Must match value used in u-boot.lds (in this directory).
+#
+
+TEXT_BASE = 0x8FFC0000
diff --git a/board/ap325rxa/cpld-ap325rxa.c b/board/ap325rxa/cpld-ap325rxa.c
new file mode 100644 (file)
index 0000000..16fadcb
--- /dev/null
@@ -0,0 +1,206 @@
+/***************************************************************
+ * Project:
+ *       CPLD SlaveSerial Configuration via embedded microprocessor.
+ *
+ * Copyright info:
+ *
+ *       This is free software; you can redistribute it and/or modify
+ *       it as you like.
+ *
+ *       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.
+ *
+ * Description:
+ *
+ *      This is the main source file that will allow a microprocessor
+ *      to configure Xilinx Virtex, Virtex-E, Virtex-EM, Virtex-II,
+ *      and Spartan-II devices via the SlaveSerial Configuration Mode.
+ *      This code is discussed in Xilinx Application Note, XAPP502.
+ *
+ * History:
+ *       3-October-2001  MN/MP  - Created
+ *       20-August-2008  Renesas Solutions - Modified to SH7723
+ ****************************************************************/
+
+#include <common.h>
+
+/* Serial */
+#define SCIF_BASE 0xffe00000 /* SCIF0 */
+#define SCSMR  (vu_short *)(SCIF_BASE + 0x00)
+#define SCBRR  (vu_char *)(SCIF_BASE + 0x04)
+#define SCSCR  (vu_short *)(SCIF_BASE + 0x08)
+#define SC_TDR (vu_char *)(SCIF_BASE + 0x0C)
+#define SC_SR  (vu_short *)(SCIF_BASE + 0x10)
+#define SCFCR  (vu_short *)(SCIF_BASE + 0x18)
+#define        RFCR    (vu_long *)0xFE400020
+
+#define SCSCR_INIT             0x0038
+#define SCSCR_CLR              0x0000
+#define SCFCR_INIT             0x0006
+#define SCSMR_INIT             0x0080
+#define RFCR_CLR               0xA400
+#define SCI_TD_E               0x0020
+#define SCI_TDRE_CLEAR 0x00df
+
+#define BPS_SETTING_VALUE      1 /* 12.5MHz */
+#define WAIT_RFCR_COUNTER      500
+
+/* CPLD data size */
+#define CPLD_DATA_SIZE 169216
+
+/* out */
+#define CPLD_PFC_ADR   ((vu_short *)0xA4050112)
+
+#define CPLD_PROG_ADR  ((vu_char *)0xA4050132)
+#define CPLD_PROG_DAT  0x80
+
+/* in */
+#define CPLD_INIT_ADR  ((vu_char *)0xA4050132)
+#define CPLD_INIT_DAT  0x40
+#define CPLD_DONE_ADR  ((vu_char *)0xA4050132)
+#define CPLD_DONE_DAT  0x20
+
+#define        HIZCRB                  ((vu_short *)0xA405015A)
+
+/* data */
+#define CPLD_NOMAL_START       0xA0A80000
+#define CPLD_SAFE_START                0xA0AC0000
+#define MODE_SW                                (vu_char *)0xA405012A
+
+static void init_cpld_loader(void)
+{
+
+       *SCSCR = SCSCR_CLR;
+       *SCFCR = SCFCR_INIT;
+       *SCSMR = SCSMR_INIT;
+
+       *SCBRR = BPS_SETTING_VALUE;
+
+       *RFCR = RFCR_CLR; /* Refresh counter clear */
+
+       while (*RFCR < WAIT_RFCR_COUNTER)
+               ;
+
+       *SCFCR = 0x0; /* RTRG=00, TTRG=00 */
+                                 /* MCE=0,TFRST=0,RFRST=0,LOOP=0 */
+       *SCSCR = SCSCR_INIT;
+}
+
+static int check_write_ready(void)
+{
+       u16 status = *SC_SR;
+       return status & SCI_TD_E;
+}
+
+static void write_cpld_data(char ch)
+{
+       while (!check_write_ready())
+               ;
+
+       *SC_TDR = ch;
+       *SC_SR;
+       *SC_SR = SCI_TDRE_CLEAR;
+}
+
+static int delay(void)
+{
+       int i;
+       int c = 0;
+       for (i = 0; i < 200; i++) {
+               c = *(volatile int *)0xa0000000;
+       }
+       return c;
+}
+
+/***********************************************************************
+ *
+ * Function:     slave_serial
+ *
+ * Description:  Initiates SlaveSerial Configuration.
+ *               Calls ShiftDataOut() to output serial data
+ *
+ ***********************************************************************/
+static void slave_serial(void)
+{
+       int i;
+       unsigned char *flash;
+
+       *CPLD_PROG_ADR |= CPLD_PROG_DAT; /* PROGRAM_OE HIGH */
+       delay();
+
+       /*
+        * Toggle Program Pin by Toggling Program_OE bit
+        * This is accomplished by writing to the Program Register in the CPLD
+        *
+        * NOTE: The Program_OE bit should be driven high to bring the Virtex
+        *      Program Pin low. Likewise, it should be driven low
+        *      to bring the Virtex Program Pin to High-Z
+        */
+
+       *CPLD_PROG_ADR &= ~CPLD_PROG_DAT; /* PROGRAM_OE LOW */
+       delay();
+
+       /*
+        * Bring Program High-Z
+        * (Drive Program_OE bit low to bring Virtex Program Pin to High-Z
+        */
+
+       /* Program_OE bit Low brings the Virtex Program Pin to High Z: */
+       *CPLD_PROG_ADR |= CPLD_PROG_DAT; /* PROGRAM_OE HIGH */
+
+       while ((*CPLD_INIT_ADR & CPLD_INIT_DAT) == 0)
+               delay();
+
+       /* Begin Slave-Serial Configuration */
+       flash = (unsigned char *)CPLD_NOMAL_START;
+
+       for (i = 0; i < CPLD_DATA_SIZE; i++)
+               write_cpld_data(*flash++);
+}
+
+/***********************************************************************
+ *
+ * Function: check_done_bit
+ *
+ * Description: This function takes monitors the CPLD Input Register
+ *                by checking the status of the DONE bit in that Register.
+ *               By doing so, it monitors the Xilinx Virtex device's DONE
+ *               Pin to see if configuration bitstream has been properly
+ *               loaded
+ *
+ ***********************************************************************/
+static void check_done_bit(void)
+{
+       while (!(*CPLD_DONE_ADR & CPLD_DONE_DAT))
+               ;
+}
+
+/***********************************************************************
+ *
+ * Function: init_cpld
+ *
+ * Description: Begins Slave Serial configuration of Xilinx FPGA
+ *
+ ***********************************************************************/
+void init_cpld(void)
+{
+       /* Init serial device */
+       init_cpld_loader();
+
+       if (*CPLD_DONE_ADR & CPLD_DONE_DAT)     /* Already DONE */
+               return;
+
+       *HIZCRB = 0x0000;
+       *CPLD_PFC_ADR = 0x7c00;                 /* FPGA PROG = OUTPUT */
+
+       /* write CPLD data from NOR flash to device */
+       slave_serial();
+
+       /*
+        * Monitor the DONE bit in the CPLD Input Register to see if
+        * configuration successful
+        */
+
+       check_done_bit();
+}
diff --git a/board/ap325rxa/lowlevel_init.S b/board/ap325rxa/lowlevel_init.S
new file mode 100644 (file)
index 0000000..4f66588
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ * Copyright (C) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
+ *
+ * board/ap325rxa/lowlevel_init.S
+ *
+ * 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/processor.h>
+
+/*
+ * Board specific low level init code, called _very_ early in the
+ * startup sequence. Relocation to SDRAM has not happened yet, no
+ * stack is available, bss section has not been initialised, etc.
+ *
+ * (Note: As no stack is available, no subroutines can be called...).
+ */
+
+       .global lowlevel_init
+
+       .text
+       .align  2
+
+lowlevel_init:
+       mov.l   DRVCRA_A, r1
+       mov.l   DRVCRA_D, r0
+       mov.w   r0, @r1
+
+       mov.l   DRVCRB_A, r1
+       mov.l   DRVCRB_D, r0
+       mov.w   r0, @r1
+
+       mov.l   RWTCSR_A, r1
+       mov.l   RWTCSR_D1, r0
+       mov.w   r0, @r1
+
+       mov.l   RWTCNT_A, r1
+       mov.l   RWTCNT_D, r0
+       mov.w   r0, @r1
+
+       mov.l   RWTCSR_A, r1
+       mov.l   RWTCSR_D2, r0
+       mov.w   r0, @r1
+
+       mov.l   FRQCR_A, r1
+       mov.l   FRQCR_D, r0
+       mov.l   r0, @r1
+
+       mov.l   CMNCR_A, r1
+       mov.l   CMNCR_D, r0
+       mov.l   r0, @r1
+
+       mov.l   CS0BCR_A ,r1
+       mov.l   CS0BCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS4BCR_A ,r1
+       mov.l   CS4BCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS5ABCR_A ,r1
+       mov.l   CS5ABCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS5BBCR_A ,r1
+       mov.l   CS5BBCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS6ABCR_A ,r1
+       mov.l   CS6ABCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS6BBCR_A ,r1
+       mov.l   CS6BBCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS0WCR_A ,r1
+       mov.l   CS0WCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS4WCR_A ,r1
+       mov.l   CS4WCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS5AWCR_A ,r1
+       mov.l   CS5AWCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS5BWCR_A ,r1
+       mov.l   CS5BWCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS6AWCR_A ,r1
+       mov.l   CS6AWCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   CS6BWCR_A ,r1
+       mov.l   CS6BWCR_D ,r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_SDCR_A, r1
+       mov.l   SBSC_SDCR_D1, r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_SDWCR_A, r1
+       mov.l   SBSC_SDWCR_D, r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_SDPCR_A, r1
+       mov.l   SBSC_SDPCR_D, r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_RTCSR_A, r1
+       mov.l   SBSC_RTCSR_D, r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_RTCNT_A, r1
+       mov.l   SBSC_RTCNT_D, r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_RTCOR_A, r1
+       mov.l   SBSC_RTCOR_D, r0
+       mov.l   r0, @r1
+
+       mov.l   SBSC_SDMR3_A1, r1
+       mov.l   SBSC_SDMR3_D, r0
+       mov.b   r0, @r1
+
+       mov.l   SBSC_SDMR3_A2, r1
+       mov.l   SBSC_SDMR3_D, r0
+       mov.b   r0, @r1
+
+       mov.l   SLEEP_CNT, r1
+2:     tst     r1, r1
+       nop
+       bf/s    2b
+       dt      r1
+
+       mov.l   SBSC_SDMR3_A3, r1
+       mov.l   SBSC_SDMR3_D, r0
+       mov.b   r0, @r1
+
+       mov.l   SBSC_SDCR_A, r1
+       mov.l   SBSC_SDCR_D2, r0
+       mov.l   r0, @r1
+
+       mov.l   CCR_A, r1
+       mov.l   CCR_D, r0
+       mov.l   r0, @r1
+
+       ! BL bit off (init = ON)  (?!?)
+
+       stc     sr, r0                          ! BL bit off(init=ON)
+       mov.l   SR_MASK_D, r1
+       and     r1, r0
+       ldc     r0, sr
+
+       rts
+        mov    #0, r0
+
+       .align  2
+
+DRVCRA_A:      .long   DRVCRA
+DRVCRB_A:      .long   DRVCRB
+DRVCRA_D:      .long   0x4555
+DRVCRB_D:      .long   0x0005
+
+RWTCSR_A:      .long   RWTCSR
+RWTCNT_A:      .long   RWTCNT
+FRQCR_A:       .long   FRQCR
+RWTCSR_D1:     .long   0xa507
+RWTCSR_D2:     .long   0xa504
+RWTCNT_D:      .long   0x5a00
+FRQCR_D:       .long   0x0b04474a
+
+SBSC_SDCR_A:   .long   SBSC_SDCR
+SBSC_SDWCR_A:  .long   SBSC_SDWCR
+SBSC_SDPCR_A:  .long   SBSC_SDPCR
+SBSC_RTCSR_A:  .long   SBSC_RTCSR
+SBSC_RTCNT_A:  .long   SBSC_RTCNT
+SBSC_RTCOR_A:  .long   SBSC_RTCOR
+SBSC_SDMR3_A1: .long   0xfe510000
+SBSC_SDMR3_A2: .long   0xfe500242
+SBSC_SDMR3_A3: .long   0xfe5c0042
+
+SBSC_SDCR_D1:  .long   0x92810112
+SBSC_SDCR_D2:  .long   0x92810912
+SBSC_SDWCR_D:  .long   0x05162482
+SBSC_SDPCR_D:  .long   0x00300087
+SBSC_RTCSR_D:  .long   0xa55a0212
+SBSC_RTCNT_D:  .long   0xa55a0000
+SBSC_RTCOR_D:  .long   0xa55a0040
+SBSC_SDMR3_D:  .long   0x00
+
+CMNCR_A:       .long   CMNCR
+CS0BCR_A:      .long   CS0BCR
+CS4BCR_A:      .long   CS4BCR
+CS5ABCR_A:     .long   CS5ABCR
+CS5BBCR_A:     .long   CS5BBCR
+CS6ABCR_A:     .long   CS6ABCR
+CS6BBCR_A:     .long   CS6BBCR
+CS0WCR_A:      .long   CS0WCR
+CS4WCR_A:      .long   CS4WCR
+CS5AWCR_A:     .long   CS5AWCR
+CS5BWCR_A:     .long   CS5BWCR
+CS6AWCR_A:     .long   CS6AWCR
+CS6BWCR_A:     .long   CS6BWCR
+
+CMNCR_D:       .long   0x00000013
+CS0BCR_D:      .long   0x24920400
+CS4BCR_D:      .long   0x24920400
+CS5ABCR_D:     .long   0x24920400
+CS5BBCR_D:     .long   0x7fff0600
+CS6ABCR_D:     .long   0x24920400
+CS6BBCR_D:     .long   0x24920600
+CS0WCR_D:      .long   0x00000480
+CS4WCR_D:      .long   0x00000480
+CS5AWCR_D:     .long   0x00000380
+CS5BWCR_D:     .long   0x00000600
+CS6AWCR_D:     .long   0x00000300
+CS6BWCR_D:     .long   0x00000540
+
+CCR_A:         .long   0xff00001c
+CCR_D:         .long   0x0000090d
+
+SLEEP_CNT:     .long   0x00000800
+SR_MASK_D:     .long   0xEFFFFF0F
diff --git a/board/ap325rxa/u-boot.lds b/board/ap325rxa/u-boot.lds
new file mode 100644 (file)
index 0000000..a670374
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyrigth (c) 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-sh-linux", "elf32-sh-linux", "elf32-sh-linux")
+OUTPUT_ARCH(sh)
+ENTRY(_start)
+
+SECTIONS
+{
+       /*
+          Base address of internal SDRAM is 0x88000000.
+          Although size of SDRAM can be either 16 or 32 MBytes,
+          we assume 16 MBytes (ie ignore upper half if the full
+          32 MBytes is present).
+
+          NOTE: This address must match with the definition of
+          TEXT_BASE in config.mk (in this directory).
+
+       */
+       . = 0x88000000 + (128*1024*1024) - (256*1024);
+
+       PROVIDE (reloc_dst = .);
+
+       PROVIDE (_ftext = .);
+       PROVIDE (_fcode = .);
+       PROVIDE (_start = .);
+
+       .text :
+       {
+               cpu/sh4/start.o         (.text)
+               . = ALIGN(8192);
+               common/environment.o    (.ppcenv)
+               . = ALIGN(8192);
+               common/environment.o    (.ppcenvr)
+               . = ALIGN(8192);
+               *(.text)
+               . = ALIGN(4);
+       } =0xFF
+       PROVIDE (_ecode = .);
+       .rodata :
+       {
+               *(.rodata)
+               . = ALIGN(4);
+       }
+       PROVIDE (_etext = .);
+
+
+       PROVIDE (_fdata = .);
+       .data :
+       {
+               *(.data)
+               . = ALIGN(4);
+       }
+       PROVIDE (_edata = .);
+
+       PROVIDE (_fgot = .);
+       .got :
+       {
+               *(.got)
+               . = ALIGN(4);
+       }
+       PROVIDE (_egot = .);
+
+       PROVIDE (__u_boot_cmd_start = .);
+       .u_boot_cmd :
+       {
+               *(.u_boot_cmd)
+               . = ALIGN(4);
+       }
+       PROVIDE (__u_boot_cmd_end = .);
+
+       PROVIDE (reloc_dst_end = .);
+       /* _reloc_dst_end = .; */
+
+       PROVIDE (bss_start = .);
+       PROVIDE (__bss_start = .);
+       .bss :
+       {
+               *(.bss)
+               . = ALIGN(4);
+       }
+       PROVIDE (bss_end = .);
+
+       PROVIDE (_end = .);
+}
+
diff --git a/board/davinci/common/Makefile b/board/davinci/common/Makefile
new file mode 100644 (file)
index 0000000..127bb6e
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# (C) Copyright 2006
+# 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
+
+ifneq ($(OBJTREE),$(SRCTREE))
+$(shell mkdir -p $(obj)board/$(VENDOR)/common)
+endif
+
+LIB    = $(obj)lib$(VENDOR).a
+
+COBJS  := psc.o misc.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak $(obj).depend
+
+#########################################################################
+# This is for $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/davinci/common/misc.c b/board/davinci/common/misc.c
new file mode 100644 (file)
index 0000000..71a3b87
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Miscelaneous DaVinci functions.
+ *
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
+ * Copyright (C) 2004 Texas Instruments.
+ *
+ * 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 <i2c.h>
+#include <asm/arch/hardware.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+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);
+}
+
+static int dv_get_pllm_output(uint32_t pllm)
+{
+       return (pllm + 1) * (CFG_HZ_CLOCK / 1000000);
+}
+
+void dv_display_clk_infos(void)
+{
+       printf("ARM Clock: %dMHz\n", dv_get_pllm_output(REG(PLL1_PLLM)) / 2);
+       printf("DDR Clock: %dMHz\n", dv_get_pllm_output(REG(PLL2_PLLM)) /
+              ((REG(PLL2_DIV2) & 0x1f) + 1) / 2);
+}
+
+/* Read ethernet MAC address from EEPROM for DVEVM compatible boards.
+ * Returns 1 if found, 0 otherwise.
+ */
+int dvevm_read_mac_address(uint8_t *buf)
+{
+#ifdef CFG_I2C_EEPROM_ADDR
+       /* Read MAC address. */
+       if (i2c_read(CFG_I2C_EEPROM_ADDR, 0x7F00, CFG_I2C_EEPROM_ADDR_LEN,
+                    (uint8_t *) &buf[0], 6))
+               goto i2cerr;
+
+       /* Check that MAC address is not null. */
+       if (memcmp(buf, "\0\0\0\0\0\0", 6) == 0)
+               goto err;
+
+       return 1; /* Found */
+
+i2cerr:
+       printf("Read from EEPROM @ 0x%02x failed\n", CFG_I2C_EEPROM_ADDR);
+err:
+#endif /* CFG_I2C_EEPROM_ADDR */
+
+       return 0;
+}
+
+/* If there is a MAC address in the environment, and if it is not identical to
+ * the MAC address in the ROM, then a warning is printed and the MAC address
+ * from the environment is used.
+ *
+ * If there is no MAC address in the environment, then it will be initialized
+ * (silently) from the value in the ROM.
+ */
+void dv_configure_mac_address(uint8_t *rom_enetaddr)
+{
+       int i;
+       u_int8_t env_enetaddr[6];
+       char *tmp = getenv("ethaddr");
+       char *end;
+
+       /* Read Ethernet MAC address from the U-Boot environment.
+        * If it is not defined, env_enetaddr[] will be cleared. */
+       for (i = 0; i < 6; i++) {
+               env_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
+               if (tmp)
+                       tmp = (*end) ? end+1 : end;
+       }
+
+       /* Check if ROM and U-Boot environment MAC addresses match. */
+       if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6) != 0 &&
+           memcmp(env_enetaddr, rom_enetaddr, 6) != 0) {
+               printf("Warning: MAC addresses don't match:\n");
+               printf("  ROM MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",
+                      rom_enetaddr[0], rom_enetaddr[1],
+                      rom_enetaddr[2], rom_enetaddr[3],
+                      rom_enetaddr[4], rom_enetaddr[5]);
+               printf("  \"ethaddr\" value: %02X:%02X:%02X:%02X:%02X:%02X\n",
+                      env_enetaddr[0], env_enetaddr[1],
+                      env_enetaddr[2], env_enetaddr[3],
+                      env_enetaddr[4], env_enetaddr[5]) ;
+               debug("### Using MAC address from environment\n");
+       }
+       if (!tmp) {
+               char ethaddr[20];
+
+               /* There is no MAC address in the environment, so we initialize
+                * it from the value in the ROM. */
+               sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
+                       rom_enetaddr[0], rom_enetaddr[1],
+                       rom_enetaddr[2], rom_enetaddr[3],
+                       rom_enetaddr[4], rom_enetaddr[5]) ;
+               debug("### Setting environment from ROM MAC address = \"%s\"\n",
+                     ethaddr);
+               setenv("ethaddr", ethaddr);
+       }
+}
diff --git a/board/davinci/common/misc.h b/board/davinci/common/misc.h
new file mode 100644 (file)
index 0000000..4a57dbb
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
+ *
+ * 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 __MISC_H
+#define __MISC_H
+
+extern void timer_init(void);
+extern int eth_hw_init(void);
+
+void dv_display_clk_infos(void);
+int dvevm_read_mac_address(uint8_t *buf);
+void dv_configure_mac_address(uint8_t *rom_enetaddr);
+
+#endif /* __MISC_H */
diff --git a/board/davinci/common/psc.c b/board/davinci/common/psc.c
new file mode 100644 (file)
index 0000000..00dc07c
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Power and Sleep Controller (PSC) functions.
+ *
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
+ * Copyright (C) 2004 Texas Instruments.
+ *
+ * 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/arch/hardware.h>
+
+/*
+ * The DM6446 includes two separate power domains: "Always On" and "DSP". The
+ * "Always On" power domain is always on when the chip is on. The "Always On"
+ * domain is powered by the VDD pins of the DM6446. The majority of the
+ * DM6446's modules lie within the "Always On" power domain. A separate
+ * domain called the "DSP" domain houses the C64x+ and VICP. The "DSP" domain
+ * is not always on. The "DSP" power domain is powered by the CVDDDSP pins of
+ * the DM6446.
+ */
+
+/* Works on Always On power domain only (no PD argument) */
+void lpsc_on(unsigned int id)
+{
+       dv_reg_p mdstat, mdctl;
+
+       if (id >= DAVINCI_LPSC_GEM)
+               return;                 /* Don't work on DSP Power Domain */
+
+       mdstat = REG_P(PSC_MDSTAT_BASE + (id * 4));
+       mdctl = REG_P(PSC_MDCTL_BASE + (id * 4));
+
+       while (REG(PSC_PTSTAT) & 0x01);
+
+       if ((*mdstat & 0x1f) == 0x03)
+               return;                 /* Already on and enabled */
+
+       *mdctl |= 0x03;
+
+       /* Special treatment for some modules as for sprue14 p.7.4.2 */
+       switch (id) {
+       case DAVINCI_LPSC_VPSSSLV:
+       case DAVINCI_LPSC_EMAC:
+       case DAVINCI_LPSC_EMAC_WRAPPER:
+       case DAVINCI_LPSC_MDIO:
+       case DAVINCI_LPSC_USB:
+       case DAVINCI_LPSC_ATA:
+       case DAVINCI_LPSC_VLYNQ:
+       case DAVINCI_LPSC_UHPI:
+       case DAVINCI_LPSC_DDR_EMIF:
+       case DAVINCI_LPSC_AEMIF:
+       case DAVINCI_LPSC_MMC_SD:
+       case DAVINCI_LPSC_MEMSTICK:
+       case DAVINCI_LPSC_McBSP:
+       case DAVINCI_LPSC_GPIO:
+               *mdctl |= 0x200;
+               break;
+       }
+
+       REG(PSC_PTCMD) = 0x01;
+
+       while (REG(PSC_PTSTAT) & 0x03);
+       while ((*mdstat & 0x1f) != 0x03);       /* Probably an overkill... */
+}
+
+/* If DSPLINK is used, we don't want U-Boot to power on the DSP. */
+#if !defined(CFG_USE_DSPLINK)
+void dsp_on(void)
+{
+       int i;
+
+       if (REG(PSC_PDSTAT1) & 0x1f)
+               return;                 /* Already on */
+
+       REG(PSC_GBLCTL) |= 0x01;
+       REG(PSC_PDCTL1) |= 0x01;
+       REG(PSC_PDCTL1) &= ~0x100;
+       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) |= 0x03;
+       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) &= 0xfffffeff;
+       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) |= 0x03;
+       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) &= 0xfffffeff;
+       REG(PSC_PTCMD) = 0x02;
+
+       for (i = 0; i < 100; i++) {
+               if (REG(PSC_EPCPR) & 0x02)
+                       break;
+       }
+
+       REG(PSC_CHP_SHRTSW) = 0x01;
+       REG(PSC_PDCTL1) |= 0x100;
+       REG(PSC_EPCCR) = 0x02;
+
+       for (i = 0; i < 100; i++) {
+               if (!(REG(PSC_PTSTAT) & 0x02))
+                       break;
+       }
+
+       REG(PSC_GBLCTL) &= ~0x1f;
+}
+#endif /* CFG_USE_DSPLINK */
diff --git a/board/davinci/common/psc.h b/board/davinci/common/psc.h
new file mode 100644 (file)
index 0000000..6ab2575
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
+ *
+ * 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 __PSC_H
+#define __PSC_H
+
+void lpsc_on(unsigned int id);
+void dsp_on(void);
+
+#endif /* __PSC_H */
diff --git a/board/davinci/dv-evm/Makefile b/board/davinci/dv-evm/Makefile
deleted file mode 100644 (file)
index 579efe2..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#
-# (C) Copyright 2000, 2001, 2002
-# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-#
-# 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 $(TOPDIR)/config.mk
-
-LIB    = $(obj)lib$(BOARD).a
-
-COBJS  := dv_board.o
-SOBJS  := board_init.o
-
-SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
-OBJS   := $(addprefix $(obj),$(COBJS))
-SOBJS  := $(addprefix $(obj),$(SOBJS))
-
-$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
-       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
-
-clean:
-       rm -f $(SOBJS) $(OBJS)
-
-distclean:     clean
-       rm -f $(LIB) core *.bak $(obj).depend
-
-#########################################################################
-# This is for $(obj).depend target
-include $(SRCTREE)/rules.mk
-
-sinclude $(obj).depend
-
-#########################################################################
diff --git a/board/davinci/dv-evm/board_init.S b/board/davinci/dv-evm/board_init.S
deleted file mode 100644 (file)
index 22d8adc..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
- *
- * Board-specific low level initialization code. Called at the very end
- * of cpu/arm926ejs/davinci/lowlevel_init.S. Just returns if there is no
- * initialization required.
- *
- * 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 dv_board_init
-dv_board_init:
-
-       mov     pc, lr
diff --git a/board/davinci/dv-evm/config.mk b/board/davinci/dv-evm/config.mk
deleted file mode 100644 (file)
index aa89d0e..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# (C) Copyright 2002
-# Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
-# David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
-#
-# (C) Copyright 2003
-# Texas Instruments, <www.ti.com>
-# Swaminathan <swami.iyer@ti.com>
-#
-# Davinci EVM board (ARM925EJS) cpu
-# see http://www.ti.com/ for more information on Texas Instruments
-#
-# Davinci EVM has 1 bank of 256 MB DDR RAM
-# Physical Address:
-# 8000'0000 to 9000'0000
-#
-# Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
-#
-# Visioneering Corp. Sonata board (ARM926EJS) cpu
-#
-# Sonata board has 1 bank of 128 MB DDR RAM
-# Physical Address:
-# 8000'0000 to 8800'0000
-#
-# Razorstream, LLC. SCHMOOGIE board (ARM926EJS) cpu
-#
-# Schmoogie board has 1 bank of 128 MB DDR RAM
-# Physical Address:
-# 8000'0000 to 8800'0000
-#
-# Linux-Kernel is expected to be at 8000'8000, entry 8000'8000
-# (mem base + reserved)
-#
-# we load ourself to 8108 '0000
-#
-#
-
-#Provide at least 16MB spacing between us and the Linux Kernel image
-TEXT_BASE = 0x81080000
diff --git a/board/davinci/dv-evm/dv_board.c b/board/davinci/dv-evm/dv_board.c
deleted file mode 100644 (file)
index 834eb68..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
- *
- * Parts are shamelessly stolen from various TI sources, original copyright
- * follows:
- * -----------------------------------------------------------------
- *
- * Copyright (C) 2004 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.
- * ----------------------------------------------------------------------------
- */
-
-#include <common.h>
-#include <i2c.h>
-#include <asm/arch/hardware.h>
-#include <asm/arch/emac_defs.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-extern void    timer_init(void);
-extern int     eth_hw_init(void);
-
-
-/* Works on Always On power domain only (no PD argument) */
-void lpsc_on(unsigned int id)
-{
-       dv_reg_p        mdstat, mdctl;
-
-       if (id >= DAVINCI_LPSC_GEM)
-               return;                 /* Don't work on DSP Power Domain */
-
-       mdstat = REG_P(PSC_MDSTAT_BASE + (id * 4));
-       mdctl = REG_P(PSC_MDCTL_BASE + (id * 4));
-
-       while (REG(PSC_PTSTAT) & 0x01) {;}
-
-       if ((*mdstat & 0x1f) == 0x03)
-               return;                 /* Already on and enabled */
-
-       *mdctl |= 0x03;
-
-       /* Special treatment for some modules as for sprue14 p.7.4.2 */
-       if (    (id == DAVINCI_LPSC_VPSSSLV) ||
-               (id == DAVINCI_LPSC_EMAC) ||
-               (id == DAVINCI_LPSC_EMAC_WRAPPER) ||
-               (id == DAVINCI_LPSC_MDIO) ||
-               (id == DAVINCI_LPSC_USB) ||
-               (id == DAVINCI_LPSC_ATA) ||
-               (id == DAVINCI_LPSC_VLYNQ) ||
-               (id == DAVINCI_LPSC_UHPI) ||
-               (id == DAVINCI_LPSC_DDR_EMIF) ||
-               (id == DAVINCI_LPSC_AEMIF) ||
-               (id == DAVINCI_LPSC_MMC_SD) ||
-               (id == DAVINCI_LPSC_MEMSTICK) ||
-               (id == DAVINCI_LPSC_McBSP) ||
-               (id == DAVINCI_LPSC_GPIO)
-          )
-               *mdctl |= 0x200;
-
-       REG(PSC_PTCMD) = 0x01;
-
-       while (REG(PSC_PTSTAT) & 0x03) {;}
-       while ((*mdstat & 0x1f) != 0x03) {;}    /* Probably an overkill... */
-}
-
-void dsp_on(void)
-{
-       int     i;
-
-       if (REG(PSC_PDSTAT1) & 0x1f)
-               return;                 /* Already on */
-
-       REG(PSC_GBLCTL) |= 0x01;
-       REG(PSC_PDCTL1) |= 0x01;
-       REG(PSC_PDCTL1) &= ~0x100;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) &= 0xfffffeff;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) &= 0xfffffeff;
-       REG(PSC_PTCMD) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (REG(PSC_EPCPR) & 0x02)
-                       break;
-       }
-
-       REG(PSC_CHP_SHRTSW) = 0x01;
-       REG(PSC_PDCTL1) |= 0x100;
-       REG(PSC_EPCCR) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (!(REG(PSC_PTSTAT) & 0x02))
-                       break;
-       }
-
-       REG(PSC_GBLCTL) &= ~0x1f;
-}
-
-
-int board_init(void)
-{
-       /* arch number of the board */
-       gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_EVM;
-
-       /* address of boot parameters */
-       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
-
-       /* Workaround for TMS320DM6446 errata 1.3.22 */
-       REG(PSC_SILVER_BULLET) = 0;
-
-       /* Power on required peripherals */
-       lpsc_on(DAVINCI_LPSC_EMAC);
-       lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
-       lpsc_on(DAVINCI_LPSC_MDIO);
-       lpsc_on(DAVINCI_LPSC_I2C);
-       lpsc_on(DAVINCI_LPSC_UART0);
-       lpsc_on(DAVINCI_LPSC_TIMER1);
-       lpsc_on(DAVINCI_LPSC_GPIO);
-
-       /* Powerup the DSP */
-       dsp_on();
-
-       /* Bringup UART0 out of reset */
-       REG(UART0_PWREMU_MGMT) = 0x0000e003;
-
-       /* Enable GIO3.3V cells used for EMAC */
-       REG(VDD3P3V_PWDN) = 0;
-
-       /* Enable UART0 MUX lines */
-       REG(PINMUX1) |= 1;
-
-       /* Enable EMAC and AEMIF pins */
-       REG(PINMUX0) = 0x80000c1f;
-
-       /* Enable I2C pin Mux */
-       REG(PINMUX1) |= (1 << 7);
-
-       /* Set the Bus Priority Register to appropriate value */
-       REG(VBPR) = 0x20;
-
-       timer_init();
-
-       return(0);
-}
-
-int misc_init_r (void)
-{
-       u_int8_t        tmp[20], buf[10];
-       int             i = 0;
-       int             clk = 0;
-
-       clk = ((REG(PLL2_PLLM) + 1) * 27) / ((REG(PLL2_DIV2) & 0x1f) + 1);
-
-       printf ("ARM Clock : %dMHz\n", ((REG(PLL1_PLLM) + 1) * 27 ) / 2);
-       printf ("DDR Clock : %dMHz\n", (clk / 2));
-
-       /* Set Ethernet MAC address from EEPROM */
-       if (i2c_read(CFG_I2C_EEPROM_ADDR, 0x7f00, CFG_I2C_EEPROM_ADDR_LEN, buf, 6)) {
-               printf("\nEEPROM @ 0x%02x read FAILED!!!\n", CFG_I2C_EEPROM_ADDR);
-       } else {
-               tmp[0] = 0xff;
-               for (i = 0; i < 6; i++)
-                       tmp[0] &= buf[i];
-
-               if ((tmp[0] != 0xff) && (getenv("ethaddr") == NULL)) {
-                       sprintf((char *)&tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x",
-                               buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
-                       setenv("ethaddr", (char *)&tmp[0]);
-               }
-       }
-
-       if (!eth_hw_init())
-               printf("ethernet init failed!\n");
-
-       i2c_read (0x39, 0x00, 1, (u_int8_t *)&i, 1);
-
-       setenv ("videostd", ((i  & 0x80) ? "pal" : "ntsc"));
-
-       return(0);
-}
-
-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/davinci/dv-evm/u-boot.lds b/board/davinci/dv-evm/u-boot.lds
deleted file mode 100644 (file)
index a4fcd1a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <gj@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
- */
-
-OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
-OUTPUT_ARCH(arm)
-ENTRY(_start)
-SECTIONS
-{
-       . = 0x00000000;
-       . = ALIGN(4);
-       .text   :
-       {
-         cpu/arm926ejs/start.o (.text)
-         *(.text)
-       }
-       . = ALIGN(4);
-       .rodata : { *(.rodata) }
-       . = ALIGN(4);
-       .data : { *(.data) }
-       . = ALIGN(4);
-       .got : { *(.got) }
-
-       . = .;
-       __u_boot_cmd_start = .;
-       .u_boot_cmd : { *(.u_boot_cmd) }
-       __u_boot_cmd_end = .;
-
-       . = ALIGN(4);
-       __bss_start = .;
-       .bss (NOLOAD) : { *(.bss) }
-       _end = .;
-}
diff --git a/board/davinci/dvevm/Makefile b/board/davinci/dvevm/Makefile
new file mode 100644 (file)
index 0000000..fb31ee4
--- /dev/null
@@ -0,0 +1,52 @@
+#
+# (C) Copyright 2000, 2001, 2002
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  := $(BOARD).o
+SOBJS  := board_init.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak $(obj).depend
+
+#########################################################################
+# This is for $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/davinci/dvevm/board_init.S b/board/davinci/dvevm/board_init.S
new file mode 100644 (file)
index 0000000..22d8adc
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ *
+ * Board-specific low level initialization code. Called at the very end
+ * of cpu/arm926ejs/davinci/lowlevel_init.S. Just returns if there is no
+ * initialization required.
+ *
+ * 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 dv_board_init
+dv_board_init:
+
+       mov     pc, lr
diff --git a/board/davinci/dvevm/config.mk b/board/davinci/dvevm/config.mk
new file mode 100644 (file)
index 0000000..aa89d0e
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# (C) Copyright 2002
+# Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+# David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+#
+# (C) Copyright 2003
+# Texas Instruments, <www.ti.com>
+# Swaminathan <swami.iyer@ti.com>
+#
+# Davinci EVM board (ARM925EJS) cpu
+# see http://www.ti.com/ for more information on Texas Instruments
+#
+# Davinci EVM has 1 bank of 256 MB DDR RAM
+# Physical Address:
+# 8000'0000 to 9000'0000
+#
+# Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+#
+# Visioneering Corp. Sonata board (ARM926EJS) cpu
+#
+# Sonata board has 1 bank of 128 MB DDR RAM
+# Physical Address:
+# 8000'0000 to 8800'0000
+#
+# Razorstream, LLC. SCHMOOGIE board (ARM926EJS) cpu
+#
+# Schmoogie board has 1 bank of 128 MB DDR RAM
+# Physical Address:
+# 8000'0000 to 8800'0000
+#
+# Linux-Kernel is expected to be at 8000'8000, entry 8000'8000
+# (mem base + reserved)
+#
+# we load ourself to 8108 '0000
+#
+#
+
+#Provide at least 16MB spacing between us and the Linux Kernel image
+TEXT_BASE = 0x81080000
diff --git a/board/davinci/dvevm/dvevm.c b/board/davinci/dvevm/dvevm.c
new file mode 100644 (file)
index 0000000..151f8a9
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ *
+ * Parts are shamelessly stolen from various TI sources, original copyright
+ * follows:
+ * -----------------------------------------------------------------
+ *
+ * Copyright (C) 2004 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.
+ * ----------------------------------------------------------------------------
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/emac_defs.h>
+#include "../common/psc.h"
+#include "../common/misc.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_init(void)
+{
+       /* arch number of the board */
+       gd->bd->bi_arch_number = MACH_TYPE_DAVINCI_EVM;
+
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
+
+       /* Workaround for TMS320DM6446 errata 1.3.22 */
+       REG(PSC_SILVER_BULLET) = 0;
+
+       /* Power on required peripherals */
+       lpsc_on(DAVINCI_LPSC_EMAC);
+       lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
+       lpsc_on(DAVINCI_LPSC_MDIO);
+       lpsc_on(DAVINCI_LPSC_I2C);
+       lpsc_on(DAVINCI_LPSC_UART0);
+       lpsc_on(DAVINCI_LPSC_TIMER1);
+       lpsc_on(DAVINCI_LPSC_GPIO);
+
+#if !defined(CFG_USE_DSPLINK)
+       /* Powerup the DSP */
+       dsp_on();
+#endif /* CFG_USE_DSPLINK */
+
+       /* Bringup UART0 out of reset */
+       REG(UART0_PWREMU_MGMT) = 0x0000e003;
+
+       /* Enable GIO3.3V cells used for EMAC */
+       REG(VDD3P3V_PWDN) = 0;
+
+       /* Enable UART0 MUX lines */
+       REG(PINMUX1) |= 1;
+
+       /* Enable EMAC and AEMIF pins */
+       REG(PINMUX0) = 0x80000c1f;
+
+       /* Enable I2C pin Mux */
+       REG(PINMUX1) |= (1 << 7);
+
+       /* Set the Bus Priority Register to appropriate value */
+       REG(VBPR) = 0x20;
+
+       timer_init();
+
+       return(0);
+}
+
+int misc_init_r(void)
+{
+       uint8_t video_mode;
+       uint8_t eeprom_enetaddr[6];
+
+       dv_display_clk_infos();
+
+       /* Read Ethernet MAC address from EEPROM if available. */
+       if (dvevm_read_mac_address(eeprom_enetaddr))
+               dv_configure_mac_address(eeprom_enetaddr);
+
+       if (!eth_hw_init())
+               printf("ethernet init failed!\n");
+
+       i2c_read(0x39, 0x00, 1, &video_mode, 1);
+
+       setenv("videostd", ((video_mode & 0x80) ? "pal" : "ntsc"));
+
+       return(0);
+}
diff --git a/board/davinci/dvevm/u-boot.lds b/board/davinci/dvevm/u-boot.lds
new file mode 100644 (file)
index 0000000..a4fcd1a
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+       . = ALIGN(4);
+       .text   :
+       {
+         cpu/arm926ejs/start.o (.text)
+         *(.text)
+       }
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+       . = ALIGN(4);
+       .data : { *(.data) }
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       . = .;
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss (NOLOAD) : { *(.bss) }
+       _end = .;
+}
index 579efe2623004a91a5397ab72cbef8538775417b..fb31ee42b2575520dbd707efd90a0fb9241d8ff9 100644 (file)
@@ -27,7 +27,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  := dv_board.o
+COBJS  := $(BOARD).o
 SOBJS  := board_init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/board/davinci/schmoogie/dv_board.c b/board/davinci/schmoogie/dv_board.c
deleted file mode 100644 (file)
index 3017546..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
- *
- * Parts are shamelessly stolen from various TI sources, original copyright
- * follows:
- * -----------------------------------------------------------------
- *
- * Copyright (C) 2004 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.
- * ----------------------------------------------------------------------------
- */
-
-#include <common.h>
-#include <i2c.h>
-#include <asm/arch/hardware.h>
-#include <asm/arch/emac_defs.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-extern void    timer_init(void);
-extern int     eth_hw_init(void);
-
-
-/* Works on Always On power domain only (no PD argument) */
-void lpsc_on(unsigned int id)
-{
-       dv_reg_p        mdstat, mdctl;
-
-       if (id >= DAVINCI_LPSC_GEM)
-               return;                 /* Don't work on DSP Power Domain */
-
-       mdstat = REG_P(PSC_MDSTAT_BASE + (id * 4));
-       mdctl = REG_P(PSC_MDCTL_BASE + (id * 4));
-
-       while (REG(PSC_PTSTAT) & 0x01) {;}
-
-       if ((*mdstat & 0x1f) == 0x03)
-               return;                 /* Already on and enabled */
-
-       *mdctl |= 0x03;
-
-       /* Special treatment for some modules as for sprue14 p.7.4.2 */
-       if (    (id == DAVINCI_LPSC_VPSSSLV) ||
-               (id == DAVINCI_LPSC_EMAC) ||
-               (id == DAVINCI_LPSC_EMAC_WRAPPER) ||
-               (id == DAVINCI_LPSC_MDIO) ||
-               (id == DAVINCI_LPSC_USB) ||
-               (id == DAVINCI_LPSC_ATA) ||
-               (id == DAVINCI_LPSC_VLYNQ) ||
-               (id == DAVINCI_LPSC_UHPI) ||
-               (id == DAVINCI_LPSC_DDR_EMIF) ||
-               (id == DAVINCI_LPSC_AEMIF) ||
-               (id == DAVINCI_LPSC_MMC_SD) ||
-               (id == DAVINCI_LPSC_MEMSTICK) ||
-               (id == DAVINCI_LPSC_McBSP) ||
-               (id == DAVINCI_LPSC_GPIO)
-          )
-               *mdctl |= 0x200;
-
-       REG(PSC_PTCMD) = 0x01;
-
-       while (REG(PSC_PTSTAT) & 0x03) {;}
-       while ((*mdstat & 0x1f) != 0x03) {;}    /* Probably an overkill... */
-}
-
-void dsp_on(void)
-{
-       int     i;
-
-       if (REG(PSC_PDSTAT1) & 0x1f)
-               return;                 /* Already on */
-
-       REG(PSC_GBLCTL) |= 0x01;
-       REG(PSC_PDCTL1) |= 0x01;
-       REG(PSC_PDCTL1) &= ~0x100;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) &= 0xfffffeff;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) &= 0xfffffeff;
-       REG(PSC_PTCMD) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (REG(PSC_EPCPR) & 0x02)
-                       break;
-       }
-
-       REG(PSC_CHP_SHRTSW) = 0x01;
-       REG(PSC_PDCTL1) |= 0x100;
-       REG(PSC_EPCCR) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (!(REG(PSC_PTSTAT) & 0x02))
-                       break;
-       }
-
-       REG(PSC_GBLCTL) &= ~0x1f;
-}
-
-
-int board_init(void)
-{
-       /* arch number of the board */
-       gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
-
-       /* address of boot parameters */
-       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
-
-       /* Workaround for TMS320DM6446 errata 1.3.22 */
-       REG(PSC_SILVER_BULLET) = 0;
-
-       /* Power on required peripherals */
-       lpsc_on(DAVINCI_LPSC_EMAC);
-       lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
-       lpsc_on(DAVINCI_LPSC_MDIO);
-       lpsc_on(DAVINCI_LPSC_I2C);
-       lpsc_on(DAVINCI_LPSC_UART0);
-       lpsc_on(DAVINCI_LPSC_TIMER1);
-       lpsc_on(DAVINCI_LPSC_GPIO);
-
-       /* Powerup the DSP */
-       dsp_on();
-
-       /* Bringup UART0 out of reset */
-       REG(UART0_PWREMU_MGMT) = 0x0000e003;
-
-       /* Enable GIO3.3V cells used for EMAC */
-       REG(VDD3P3V_PWDN) = 0;
-
-       /* Enable UART0 MUX lines */
-       REG(PINMUX1) |= 1;
-
-       /* Enable EMAC and AEMIF pins */
-       REG(PINMUX0) = 0x80000c1f;
-
-       /* Enable I2C pin Mux */
-       REG(PINMUX1) |= (1 << 7);
-
-       /* Set the Bus Priority Register to appropriate value */
-       REG(VBPR) = 0x20;
-
-       timer_init();
-
-       return(0);
-}
-
-int misc_init_r (void)
-{
-       u_int8_t        tmp[20], buf[10];
-       int             i = 0;
-       int             clk = 0;
-
-       /* Set serial number from UID chip */
-       u_int8_t        crc_tbl[256] = {
-                       0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
-                       0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
-                       0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
-                       0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
-                       0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
-                       0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
-                       0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
-                       0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
-                       0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
-                       0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
-                       0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
-                       0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
-                       0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
-                       0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
-                       0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
-                       0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
-                       0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
-                       0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
-                       0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
-                       0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
-                       0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
-                       0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
-                       0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
-                       0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
-                       0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
-                       0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
-                       0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
-                       0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
-                       0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
-                       0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
-                       0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
-                       0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
-               };
-
-       clk = ((REG(PLL2_PLLM) + 1) * 27) / ((REG(PLL2_DIV2) & 0x1f) + 1);
-
-       printf ("ARM Clock : %dMHz\n", ((REG(PLL1_PLLM) + 1) * 27 ) / 2);
-       printf ("DDR Clock : %dMHz\n", (clk / 2));
-
-       /* Set serial number from UID chip */
-       if (i2c_read(CFG_UID_ADDR, 0, 1, buf, 8)) {
-               printf("\nUID @ 0x%02x read FAILED!!!\n", CFG_UID_ADDR);
-               forceenv("serial#", "FAILED");
-       } else {
-               if (buf[0] != 0x70) {   /* Device Family Code */
-                       printf("\nUID @ 0x%02x read FAILED!!!\n", CFG_UID_ADDR);
-                       forceenv("serial#", "FAILED");
-               }
-       }
-       /* Now check CRC */
-       tmp[0] = 0;
-       for (i = 0; i < 8; i++)
-               tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
-
-       if (tmp[0] != 0) {
-               printf("\nUID @ 0x%02x - BAD CRC!!!\n", CFG_UID_ADDR);
-               forceenv("serial#", "FAILED");
-       } else {
-               /* CRC OK, set "serial" env variable */
-               sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
-                       buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
-               forceenv("serial#", (char *)&tmp[0]);
-       }
-
-       if (!eth_hw_init())
-               printf("ethernet init failed!\n");
-
-       return(0);
-}
-
-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/davinci/schmoogie/schmoogie.c b/board/davinci/schmoogie/schmoogie.c
new file mode 100644 (file)
index 0000000..99fd326
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ *
+ * Parts are shamelessly stolen from various TI sources, original copyright
+ * follows:
+ * -----------------------------------------------------------------
+ *
+ * Copyright (C) 2004 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.
+ * ----------------------------------------------------------------------------
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/emac_defs.h>
+#include "../common/psc.h"
+#include "../common/misc.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_init(void)
+{
+       /* arch number of the board */
+       gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
+
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
+
+       /* Workaround for TMS320DM6446 errata 1.3.22 */
+       REG(PSC_SILVER_BULLET) = 0;
+
+       /* Power on required peripherals */
+       lpsc_on(DAVINCI_LPSC_EMAC);
+       lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
+       lpsc_on(DAVINCI_LPSC_MDIO);
+       lpsc_on(DAVINCI_LPSC_I2C);
+       lpsc_on(DAVINCI_LPSC_UART0);
+       lpsc_on(DAVINCI_LPSC_TIMER1);
+       lpsc_on(DAVINCI_LPSC_GPIO);
+
+#if !defined(CFG_USE_DSPLINK)
+       /* Powerup the DSP */
+       dsp_on();
+#endif /* CFG_USE_DSPLINK */
+
+       /* Bringup UART0 out of reset */
+       REG(UART0_PWREMU_MGMT) = 0x0000e003;
+
+       /* Enable GIO3.3V cells used for EMAC */
+       REG(VDD3P3V_PWDN) = 0;
+
+       /* Enable UART0 MUX lines */
+       REG(PINMUX1) |= 1;
+
+       /* Enable EMAC and AEMIF pins */
+       REG(PINMUX0) = 0x80000c1f;
+
+       /* Enable I2C pin Mux */
+       REG(PINMUX1) |= (1 << 7);
+
+       /* Set the Bus Priority Register to appropriate value */
+       REG(VBPR) = 0x20;
+
+       timer_init();
+
+       return(0);
+}
+
+int misc_init_r(void)
+{
+       u_int8_t        tmp[20], buf[10];
+       int             i = 0;
+
+       /* Set serial number from UID chip */
+       u_int8_t        crc_tbl[256] = {
+                       0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
+                       0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
+                       0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
+                       0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
+                       0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
+                       0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
+                       0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
+                       0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
+                       0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
+                       0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
+                       0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
+                       0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
+                       0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
+                       0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
+                       0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
+                       0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
+                       0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
+                       0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
+                       0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
+                       0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
+                       0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
+                       0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
+                       0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
+                       0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
+                       0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
+                       0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
+                       0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
+                       0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
+                       0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
+                       0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
+                       0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
+                       0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
+               };
+
+       dv_display_clk_infos();
+
+       /* Set serial number from UID chip */
+       if (i2c_read(CFG_UID_ADDR, 0, 1, buf, 8)) {
+               printf("\nUID @ 0x%02x read FAILED!!!\n", CFG_UID_ADDR);
+               forceenv("serial#", "FAILED");
+       } else {
+               if (buf[0] != 0x70) {
+                       /* Device Family Code */
+                       printf("\nUID @ 0x%02x read FAILED!!!\n", CFG_UID_ADDR);
+                       forceenv("serial#", "FAILED");
+               }
+       }
+       /* Now check CRC */
+       tmp[0] = 0;
+       for (i = 0; i < 8; i++)
+               tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
+
+       if (tmp[0] != 0) {
+               printf("\nUID @ 0x%02x - BAD CRC!!!\n", CFG_UID_ADDR);
+               forceenv("serial#", "FAILED");
+       } else {
+               /* CRC OK, set "serial" env variable */
+               sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
+                       buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
+               forceenv("serial#", (char *)&tmp[0]);
+       }
+
+       if (!eth_hw_init())
+               printf("ethernet init failed!\n");
+
+       return(0);
+}
index f41081fd113e0f4a1b4ff05ed1d67fb4147a0d15..f47ba0f3bd42535a2d65f2950d173ed924d5c363 100644 (file)
@@ -31,6 +31,8 @@
 #include <i2c.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/emac_defs.h>
+#include "../common/psc.h"
+#include "../common/misc.h"
 
 #define DAVINCI_A3CR     (0x01E00014)  /* EMIF-A CS3 config register. */
 #define DAVINCI_A3CR_VAL (0x3FFFFFFD)  /* EMIF-A CS3 value for FPGA. */
 
 DECLARE_GLOBAL_DATA_PTR;
 
-extern void timer_init(void);
-extern int eth_hw_init(void);
-
-
-/* Works on Always On power domain only (no PD argument) */
-void lpsc_on(unsigned int id)
-{
-       dv_reg_p mdstat, mdctl;
-
-       if (id >= DAVINCI_LPSC_GEM)
-               return;                 /* Don't work on DSP Power Domain */
-
-       mdstat = REG_P(PSC_MDSTAT_BASE + (id * 4));
-       mdctl = REG_P(PSC_MDCTL_BASE + (id * 4));
-
-       while (REG(PSC_PTSTAT) & 0x01);
-
-       if ((*mdstat & 0x1f) == 0x03)
-               return;                 /* Already on and enabled */
-
-       *mdctl |= 0x03;
-
-       /* Special treatment for some modules as for sprue14 p.7.4.2 */
-       switch (id) {
-       case DAVINCI_LPSC_VPSSSLV:
-       case DAVINCI_LPSC_EMAC:
-       case DAVINCI_LPSC_EMAC_WRAPPER:
-       case DAVINCI_LPSC_MDIO:
-       case DAVINCI_LPSC_USB:
-       case DAVINCI_LPSC_ATA:
-       case DAVINCI_LPSC_VLYNQ:
-       case DAVINCI_LPSC_UHPI:
-       case DAVINCI_LPSC_DDR_EMIF:
-       case DAVINCI_LPSC_AEMIF:
-       case DAVINCI_LPSC_MMC_SD:
-       case DAVINCI_LPSC_MEMSTICK:
-       case DAVINCI_LPSC_McBSP:
-       case DAVINCI_LPSC_GPIO:
-               *mdctl |= 0x200;
-               break;
-       }
-
-       REG(PSC_PTCMD) = 0x01;
-
-       while (REG(PSC_PTSTAT) & 0x03);
-       while ((*mdstat & 0x1f) != 0x03);       /* Probably an overkill... */
-}
-
-#if !defined(CFG_USE_DSPLINK)
-void dsp_on(void)
-{
-       int i;
-
-       if (REG(PSC_PDSTAT1) & 0x1f)
-               return;                 /* Already on */
-
-       REG(PSC_GBLCTL) |= 0x01;
-       REG(PSC_PDCTL1) |= 0x01;
-       REG(PSC_PDCTL1) &= ~0x100;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) &= 0xfffffeff;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) &= 0xfffffeff;
-       REG(PSC_PTCMD) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (REG(PSC_EPCPR) & 0x02)
-                       break;
-       }
-
-       REG(PSC_CHP_SHRTSW) = 0x01;
-       REG(PSC_PDCTL1) |= 0x100;
-       REG(PSC_EPCCR) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (!(REG(PSC_PTSTAT) & 0x02))
-                       break;
-       }
-
-       REG(PSC_GBLCTL) &= ~0x1f;
-}
-#endif /* CFG_USE_DSPLINK */
-
 int board_init(void)
 {
        /* arch number of the board */
@@ -172,8 +91,10 @@ int board_init(void)
        return(0);
 }
 
-/* Read ethernet MAC address from Integrity data structure inside EEPROM. */
-int read_mac_address(uint8_t *buf)
+/* Read ethernet MAC address from Integrity data structure inside EEPROM.
+ * Returns 1 if found, 0 otherwise.
+ */
+static int sffsdr_read_mac_address(uint8_t *buf)
 {
        u_int32_t value, mac[2], address;
 
@@ -182,7 +103,7 @@ int read_mac_address(uint8_t *buf)
                     CFG_I2C_EEPROM_ADDR_LEN, (uint8_t *) &value, 4))
                goto err;
        if (value != INTEGRITY_CHECKWORD_VALUE)
-               return 1;
+               return 0;
 
        /* Read SYSCFG structure offset. */
        if (i2c_read(CFG_I2C_EEPROM_ADDR, INTEGRITY_SYSCFG_OFFSET,
@@ -216,30 +137,23 @@ int read_mac_address(uint8_t *buf)
        buf[4] = mac[1] >> 24;
        buf[5] = mac[1] >> 16;
 
-       return 0;
+       return 1; /* Found */
 
 err:
        printf("Read from EEPROM @ 0x%02x failed\n", CFG_I2C_EEPROM_ADDR);
-       return 1;
+       return 0;
 }
 
 /* Platform dependent initialisation. */
 int misc_init_r(void)
 {
-       int i;
-       u_int8_t i2cbuf;
-       u_int8_t env_enetaddr[6], eeprom_enetaddr[6];
-       char *tmp = getenv("ethaddr");
-       char *end;
-       int clk;
+       uint8_t i2cbuf;
+       uint8_t eeprom_enetaddr[6];
 
        /* EMIF-A CS3 configuration for FPGA. */
        REG(DAVINCI_A3CR) = DAVINCI_A3CR_VAL;
 
-       clk = ((REG(PLL2_PLLM) + 1) * 27) / ((REG(PLL2_DIV2) & 0x1f) + 1);
-
-       printf("ARM Clock: %dMHz\n", ((REG(PLL1_PLLM) + 1) * 27) / 2);
-       printf("DDR Clock: %dMHz\n", (clk / 2));
+       dv_display_clk_infos();
 
        /* Configure I2C switch (PCA9543) to enable channel 0. */
        i2cbuf = CFG_I2C_PCA9543_ENABLE_CH0;
@@ -249,43 +163,9 @@ int misc_init_r(void)
                return 1;
        }
 
-       /* Read Ethernet MAC address from the U-Boot environment. */
-       for (i = 0; i < 6; i++) {
-               env_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
-               if (tmp)
-                       tmp = (*end) ? end+1 : end;
-       }
-
-       /* Read Ethernet MAC address from EEPROM. */
-       if (read_mac_address(eeprom_enetaddr) == 0) {
-               if (memcmp(env_enetaddr, "\0\0\0\0\0\0", 6) != 0 &&
-                   memcmp(env_enetaddr, eeprom_enetaddr, 6) != 0) {
-                       printf("\nWarning: MAC addresses don't match:\n");
-                       printf("\tHW MAC address:  "
-                              "%02X:%02X:%02X:%02X:%02X:%02X\n",
-                              eeprom_enetaddr[0], eeprom_enetaddr[1],
-                              eeprom_enetaddr[2], eeprom_enetaddr[3],
-                              eeprom_enetaddr[4], eeprom_enetaddr[5]);
-                       printf("\t\"ethaddr\" value: "
-                              "%02X:%02X:%02X:%02X:%02X:%02X\n",
-                              env_enetaddr[0], env_enetaddr[1],
-                              env_enetaddr[2], env_enetaddr[3],
-                              env_enetaddr[4], env_enetaddr[5]) ;
-                       debug("### Set MAC addr from environment\n");
-                       memcpy(eeprom_enetaddr, env_enetaddr, 6);
-               }
-               if (!tmp) {
-                       char ethaddr[20];
-
-                       sprintf(ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
-                               eeprom_enetaddr[0], eeprom_enetaddr[1],
-                               eeprom_enetaddr[2], eeprom_enetaddr[3],
-                               eeprom_enetaddr[4], eeprom_enetaddr[5]) ;
-                       debug("### Set environment from HW MAC addr = \"%s\"\n",
-                             ethaddr);
-                       setenv("ethaddr", ethaddr);
-               }
-       }
+       /* Read Ethernet MAC address from EEPROM if available. */
+       if (sffsdr_read_mac_address(eeprom_enetaddr))
+               dv_configure_mac_address(eeprom_enetaddr);
 
        if (!eth_hw_init())
                printf("Ethernet init failed\n");
@@ -296,11 +176,3 @@ int misc_init_r(void)
 
        return(0);
 }
-
-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);
-}
index 579efe2623004a91a5397ab72cbef8538775417b..fb31ee42b2575520dbd707efd90a0fb9241d8ff9 100644 (file)
@@ -27,7 +27,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  := dv_board.o
+COBJS  := $(BOARD).o
 SOBJS  := board_init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/board/davinci/sonata/dv_board.c b/board/davinci/sonata/dv_board.c
deleted file mode 100644 (file)
index a6f9bc7..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
- *
- * Parts are shamelessly stolen from various TI sources, original copyright
- * follows:
- * -----------------------------------------------------------------
- *
- * Copyright (C) 2004 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.
- * ----------------------------------------------------------------------------
- */
-
-#include <common.h>
-#include <i2c.h>
-#include <asm/arch/hardware.h>
-#include <asm/arch/emac_defs.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-extern void    timer_init(void);
-extern int     eth_hw_init(void);
-
-
-/* Works on Always On power domain only (no PD argument) */
-void lpsc_on(unsigned int id)
-{
-       dv_reg_p        mdstat, mdctl;
-
-       if (id >= DAVINCI_LPSC_GEM)
-               return;                 /* Don't work on DSP Power Domain */
-
-       mdstat = REG_P(PSC_MDSTAT_BASE + (id * 4));
-       mdctl = REG_P(PSC_MDCTL_BASE + (id * 4));
-
-       while (REG(PSC_PTSTAT) & 0x01) {;}
-
-       if ((*mdstat & 0x1f) == 0x03)
-               return;                 /* Already on and enabled */
-
-       *mdctl |= 0x03;
-
-       /* Special treatment for some modules as for sprue14 p.7.4.2 */
-       if (    (id == DAVINCI_LPSC_VPSSSLV) ||
-               (id == DAVINCI_LPSC_EMAC) ||
-               (id == DAVINCI_LPSC_EMAC_WRAPPER) ||
-               (id == DAVINCI_LPSC_MDIO) ||
-               (id == DAVINCI_LPSC_USB) ||
-               (id == DAVINCI_LPSC_ATA) ||
-               (id == DAVINCI_LPSC_VLYNQ) ||
-               (id == DAVINCI_LPSC_UHPI) ||
-               (id == DAVINCI_LPSC_DDR_EMIF) ||
-               (id == DAVINCI_LPSC_AEMIF) ||
-               (id == DAVINCI_LPSC_MMC_SD) ||
-               (id == DAVINCI_LPSC_MEMSTICK) ||
-               (id == DAVINCI_LPSC_McBSP) ||
-               (id == DAVINCI_LPSC_GPIO)
-          )
-               *mdctl |= 0x200;
-
-       REG(PSC_PTCMD) = 0x01;
-
-       while (REG(PSC_PTSTAT) & 0x03) {;}
-       while ((*mdstat & 0x1f) != 0x03) {;}    /* Probably an overkill... */
-}
-
-void dsp_on(void)
-{
-       int     i;
-
-       if (REG(PSC_PDSTAT1) & 0x1f)
-               return;                 /* Already on */
-
-       REG(PSC_GBLCTL) |= 0x01;
-       REG(PSC_PDCTL1) |= 0x01;
-       REG(PSC_PDCTL1) &= ~0x100;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_GEM * 4)) &= 0xfffffeff;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) |= 0x03;
-       REG(PSC_MDCTL_BASE + (DAVINCI_LPSC_IMCOP * 4)) &= 0xfffffeff;
-       REG(PSC_PTCMD) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (REG(PSC_EPCPR) & 0x02)
-                       break;
-       }
-
-       REG(PSC_CHP_SHRTSW) = 0x01;
-       REG(PSC_PDCTL1) |= 0x100;
-       REG(PSC_EPCCR) = 0x02;
-
-       for (i = 0; i < 100; i++) {
-               if (!(REG(PSC_PTSTAT) & 0x02))
-                       break;
-       }
-
-       REG(PSC_GBLCTL) &= ~0x1f;
-}
-
-
-int board_init(void)
-{
-       /* arch number of the board */
-       gd->bd->bi_arch_number = MACH_TYPE_SONATA;
-
-       /* address of boot parameters */
-       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
-
-       /* Workaround for TMS320DM6446 errata 1.3.22 */
-       REG(PSC_SILVER_BULLET) = 0;
-
-       /* Power on required peripherals */
-       lpsc_on(DAVINCI_LPSC_EMAC);
-       lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
-       lpsc_on(DAVINCI_LPSC_MDIO);
-       lpsc_on(DAVINCI_LPSC_I2C);
-       lpsc_on(DAVINCI_LPSC_UART0);
-       lpsc_on(DAVINCI_LPSC_TIMER1);
-       lpsc_on(DAVINCI_LPSC_GPIO);
-
-       /* Powerup the DSP */
-       dsp_on();
-
-       /* Bringup UART0 out of reset */
-       REG(UART0_PWREMU_MGMT) = 0x0000e003;
-
-       /* Enable GIO3.3V cells used for EMAC */
-       REG(VDD3P3V_PWDN) = 0;
-
-       /* Enable UART0 MUX lines */
-       REG(PINMUX1) |= 1;
-
-       /* Enable EMAC and AEMIF pins */
-       REG(PINMUX0) = 0x80000c1f;
-
-       /* Enable I2C pin Mux */
-       REG(PINMUX1) |= (1 << 7);
-
-       /* Set the Bus Priority Register to appropriate value */
-       REG(VBPR) = 0x20;
-
-       timer_init();
-
-       return(0);
-}
-
-int misc_init_r (void)
-{
-       u_int8_t        tmp[20], buf[10];
-       int             i = 0;
-       int             clk = 0;
-
-
-       clk = ((REG(PLL2_PLLM) + 1) * 27) / ((REG(PLL2_DIV2) & 0x1f) + 1);
-
-       printf ("ARM Clock : %dMHz\n", ((REG(PLL1_PLLM) + 1) * 27 ) / 2);
-       printf ("DDR Clock : %dMHz\n", (clk / 2));
-
-       /* Set Ethernet MAC address from EEPROM */
-       if (i2c_read(CFG_I2C_EEPROM_ADDR, 0x7f00, CFG_I2C_EEPROM_ADDR_LEN, buf, 6)) {
-               printf("\nEEPROM @ 0x%02x read FAILED!!!\n", CFG_I2C_EEPROM_ADDR);
-       } else {
-               tmp[0] = 0xff;
-               for (i = 0; i < 6; i++)
-                       tmp[0] &= buf[i];
-
-               if ((tmp[0] != 0xff) && (getenv("ethaddr") == NULL)) {
-                       sprintf((char *)&tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x",
-                               buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
-                       setenv("ethaddr", (char *)&tmp[0]);
-               }
-       }
-
-       if (!eth_hw_init())
-               printf("ethernet init failed!\n");
-
-       return(0);
-}
-
-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/davinci/sonata/sonata.c b/board/davinci/sonata/sonata.c
new file mode 100644 (file)
index 0000000..a6fe825
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ *
+ * Parts are shamelessly stolen from various TI sources, original copyright
+ * follows:
+ * -----------------------------------------------------------------
+ *
+ * Copyright (C) 2004 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.
+ * ----------------------------------------------------------------------------
+ */
+
+#include <common.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/emac_defs.h>
+#include "../common/psc.h"
+#include "../common/misc.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_init(void)
+{
+       /* arch number of the board */
+       gd->bd->bi_arch_number = MACH_TYPE_SONATA;
+
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
+
+       /* Workaround for TMS320DM6446 errata 1.3.22 */
+       REG(PSC_SILVER_BULLET) = 0;
+
+       /* Power on required peripherals */
+       lpsc_on(DAVINCI_LPSC_EMAC);
+       lpsc_on(DAVINCI_LPSC_EMAC_WRAPPER);
+       lpsc_on(DAVINCI_LPSC_MDIO);
+       lpsc_on(DAVINCI_LPSC_I2C);
+       lpsc_on(DAVINCI_LPSC_UART0);
+       lpsc_on(DAVINCI_LPSC_TIMER1);
+       lpsc_on(DAVINCI_LPSC_GPIO);
+
+#if !defined(CFG_USE_DSPLINK)
+       /* Powerup the DSP */
+       dsp_on();
+#endif /* CFG_USE_DSPLINK */
+
+       /* Bringup UART0 out of reset */
+       REG(UART0_PWREMU_MGMT) = 0x0000e003;
+
+       /* Enable GIO3.3V cells used for EMAC */
+       REG(VDD3P3V_PWDN) = 0;
+
+       /* Enable UART0 MUX lines */
+       REG(PINMUX1) |= 1;
+
+       /* Enable EMAC and AEMIF pins */
+       REG(PINMUX0) = 0x80000c1f;
+
+       /* Enable I2C pin Mux */
+       REG(PINMUX1) |= (1 << 7);
+
+       /* Set the Bus Priority Register to appropriate value */
+       REG(VBPR) = 0x20;
+
+       timer_init();
+
+       return(0);
+}
+
+int misc_init_r(void)
+{
+       uint8_t eeprom_enetaddr[6];
+
+       dv_display_clk_infos();
+
+       /* Read Ethernet MAC address from EEPROM if available. */
+       if (dvevm_read_mac_address(eeprom_enetaddr))
+               dv_configure_mac_address(eeprom_enetaddr);
+
+       if (!eth_hw_init())
+               printf("ethernet init failed!\n");
+
+       return(0);
+}
index 5b33a8358e9517967b33164c7179b341b43cdfd5..768f40bb0aa83efe9ba1637738c51a0a57cbe95d 100644 (file)
@@ -49,7 +49,7 @@ phys_size_t initdram(int board_type)
         * Serial Boot: The dram is already initialized in start.S
         * only require to return DRAM size
         */
-       dramsize = CFG_SDRAM_SIZE * 0x100000 >> 1;
+       dramsize = CFG_SDRAM_SIZE * 0x100000;
 #else
        volatile sdramc_t *sdram = (volatile sdramc_t *)(MMAP_SDRAM);
        volatile gpio_t *gpio = (volatile gpio_t *)(MMAP_GPIO);
@@ -67,7 +67,7 @@ phys_size_t initdram(int board_type)
        }
        i--;
 
-       gpio->mscr_sdram = 0x44;
+       gpio->mscr_sdram = CFG_SDRAM_DRV_STRENGTH;
 
        sdram->sdcs0 = (CFG_SDRAM_BASE | i);
 
index 4f02121a5def0d3ad3290c6e69571889e6596916..100682a261e0152c9cf1561b7a40dfade211219e 100644 (file)
@@ -171,7 +171,7 @@ void pci_init_board(void)
 }
 #endif                         /* CONFIG_PCI */
 
-#if defined(CFG_FLASH_CFI)
+#if defined(CONFIG_FLASH_CFI_LEGACY)
 #include <flash.h>
 ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t * info)
 {
@@ -189,7 +189,7 @@ ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t * info)
        info->erase_blk_tout    = 16384;
        info->write_tout        = 2;
        info->buffer_write_tout = 5;
-       info->vendor            = 2; /* CFI_CMDSET_AMD_STANDARD */
+       info->vendor            = 0xFFF0; /* CFI_CMDSET_AMD_LEGACY */
        info->cmd_reset         = 0x00F0;
        info->interface         = FLASH_CFI_X8;
        info->legacy_unlock     = 0;
@@ -199,12 +199,11 @@ ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t * info)
 
        info->ext_addr          = 0;
        info->cfi_version       = 0x3133;
-       info->cfi_offset        = 0x0055;
+       info->cfi_offset        = 0x0000;
        info->addr_unlock1      = 0x00000555;
        info->addr_unlock2      = 0x000002AA;
        info->name              = "CFI conformant";
 
-
        info->size              = 0;
        info->sector_count      = CFG_ATMEL_TOTALSECT;
        info->start[0] = base;
index 7a59aa06748b7279af6d1b033fb43b2d2000cfde..0be5439ef9522299eca598bff6b0e396f73bdf30 100644 (file)
@@ -237,6 +237,10 @@ void __mii_init(void)
 
        fecp = (fec_t *) info->miibase;
 
+       fecpin_setclear(dev, 1);
+
+       mii_reset(info);
+
        /* We use strictly polling mode only */
        fecp->eimr = 0;
 
index f78de3a1001be8561e9e23dab640b6eb7ee38710..79f501a3ec37b1e611f7e8934b4fa3f30f4f0b59 100644 (file)
@@ -30,7 +30,7 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(BOARD).a
 
 COBJS  := integratorap.o flash.o
-SOBJS  := lowlevel_init.o memsetup.o
+SOBJS  := lowlevel_init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
diff --git a/board/integratorap/memsetup.S b/board/integratorap/memsetup.S
deleted file mode 100644 (file)
index da43cb6..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Memory setup for integratorAP
- *
- * 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
- */
-/*
- *     Memory setup
- *      - the reset defaults are assumed sufficient
- */
-
-.globl memsetup
-memsetup:
-       mov     pc,lr
index 9201accb266c54fe3940b59485d3e5f135b87d50..92a1a07b03b7b3f70cc1a719e2eafecba979d52e 100644 (file)
@@ -26,7 +26,7 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(BOARD).a
 
 COBJS  := integratorcp.o flash.o
-SOBJS  := lowlevel_init.o memsetup.o
+SOBJS  := lowlevel_init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
diff --git a/board/integratorcp/memsetup.S b/board/integratorcp/memsetup.S
deleted file mode 100644 (file)
index da43cb6..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Memory setup for integratorAP
- *
- * 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
- */
-/*
- *     Memory setup
- *      - the reset defaults are assumed sufficient
- */
-
-.globl memsetup
-memsetup:
-       mov     pc,lr
diff --git a/board/rsk7203/Makefile b/board/rsk7203/Makefile
new file mode 100644 (file)
index 0000000..7365d19
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# Copyright (C) 2007,2008 Nobuhiro Iwamatsu
+# Copyright (C) 2008 Renesas Solutions Corp.
+#
+# u-boot/board/rsk7203/Makefile
+#
+# 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    = lib$(BOARD).a
+
+OBJS   := rsk7203.o
+SOBJS  := lowlevel_init.o
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+clean:
+       rm -f $(SOBJS) $(OBJS)
+
+distclean:     clean
+       rm -f $(LIB) core *.bak .depend
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/rsk7203/config.mk b/board/rsk7203/config.mk
new file mode 100644 (file)
index 0000000..61aa51f
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# Copyright (C) 2007,2008 Nobuhiro Iwamatsu
+# Copyright (C) 2008 Renesas Solutions Corp.
+#
+# u-boot/board/rsk7203/config.mk
+#
+# 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
+
+#
+# TEXT_BASE refers to image _after_ relocation.
+#
+# NOTE: Must match value used in u-boot.lds (in this directory).
+#
+
+TEXT_BASE = 0x0C7C0000
diff --git a/board/rsk7203/lowlevel_init.S b/board/rsk7203/lowlevel_init.S
new file mode 100644 (file)
index 0000000..e4d6f9e
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2008 Nobuhiro Iwamatsu
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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/processor.h>
+
+       .global lowlevel_init
+
+       .text
+       .align  2
+
+lowlevel_init:
+       /* Cache setting */
+       mov.l CCR1_A ,r1
+       mov.l CCR1_D ,r0
+       mov.l r0,@r1
+
+       /* ConfigurePortPins */
+       mov.l PECRL3_A, r1
+       mov.l PECRL3_D, r0
+       mov.w r0,@r1
+
+       mov.l PCCRL4_A, r1
+       mov.l PCCRL4_D0, r0
+       mov.w r0,@r1
+
+       mov.l PECRL4_A, r1
+       mov.l PECRL4_D0, r0
+       mov.w r0,@r1
+
+       mov.l PEIORL_A, r1
+       mov.l PEIORL_D0, r0
+       mov.w r0,@r1
+
+       mov.l PCIORL_A, r1
+       mov.l PCIORL_D, r0
+       mov.w r0,@r1
+
+       mov.l PFCRH2_A, r1
+       mov.l PFCRH2_D, r0
+       mov.w r0,@r1
+
+       mov.l PFCRH3_A, r1
+       mov.l PFCRH3_D, r0
+       mov.w r0,@r1
+
+       mov.l PFCRH1_A, r1
+       mov.l PFCRH1_D, r0
+       mov.w r0,@r1
+
+       mov.l PFIORH_A, r1
+       mov.l PFIORH_D, r0
+       mov.w r0,@r1
+
+       mov.l PECRL1_A, r1
+       mov.l PECRL1_D0, r0
+       mov.w r0,@r1
+
+       mov.l PEIORL_A, r1
+       mov.l PEIORL_D1, r0
+       mov.w r0,@r1
+
+       /* Configure Operating Frequency */
+       mov.l WTCSR_A ,r1
+       mov.l WTCSR_D0 ,r0
+       mov.w r0,@r1
+
+       mov.l WTCSR_A ,r1
+       mov.l WTCSR_D1 ,r0
+       mov.w r0,@r1
+
+       mov.l WTCNT_A ,r1
+       mov.l WTCNT_D ,r0
+       mov.w r0,@r1
+
+       /* Set clock mode*/
+       mov.l FRQCR_A,r1
+       mov.l FRQCR_D,r0
+       mov.w r0,@r1
+
+       /* Configure Bus And Memory */
+init_bsc_cs0:
+       mov.l   PCCRL4_A,r1
+       mov.l   PCCRL4_D1,r0
+       mov.w   r0,@r1
+
+       mov.l   PECRL1_A,r1
+       mov.l   PECRL1_D1,r0
+       mov.w   r0,@r1
+
+       mov.l CMNCR_A,r1
+       mov.l CMNCR_D,r0
+       mov.l r0,@r1
+
+       mov.l SC0BCR_A,r1
+       mov.l SC0BCR_D,r0
+       mov.l r0,@r1
+
+       mov.l CS0WCR_A,r1
+       mov.l CS0WCR_D,r0
+       mov.l r0,@r1
+
+init_bsc_cs1:
+       mov.l   PECRL4_A,r1
+       mov.l   PECRL4_D1,r0
+       mov.w   r0,@r1
+
+       mov.l CS1WCR_A,r1
+       mov.l CS1WCR_D,r0
+       mov.l r0,@r1
+
+init_sdram:
+       mov.l   PCCRL2_A,r1
+       mov.l   PCCRL2_D,r0
+       mov.w   r0,@r1
+
+       mov.l   PCCRL4_A,r1
+       mov.l   PCCRL4_D2,r0
+       mov.w   r0,@r1
+
+       mov.l   PCCRL1_A,r1
+       mov.l   PCCRL1_D,r0
+       mov.w   r0,@r1
+
+       mov.l   PCCRL3_A,r1
+       mov.l   PCCRL3_D,r0
+       mov.w   r0,@r1
+
+       mov.l CS3BCR_A,r1
+       mov.l CS3BCR_D,r0
+       mov.l r0,@r1
+
+       mov.l CS3WCR_A,r1
+       mov.l CS3WCR_D,r0
+       mov.l r0,@r1
+
+       mov.l SDCR_A,r1
+       mov.l SDCR_D,r0
+       mov.l r0,@r1
+
+       mov.l RTCOR_A,r1
+       mov.l RTCOR_D,r0
+       mov.l r0,@r1
+
+       mov.l RTCSR_A,r1
+       mov.l RTCSR_D,r0
+       mov.l r0,@r1
+
+       /* wait 200us */
+       mov.l   REPEAT_D,r3
+       mov     #0,r2
+repeat0:
+       add     #1,r2
+       cmp/hs  r3,r2
+       bf      repeat0
+       nop
+
+       mov.l SDRAM_MODE, r1
+       mov   #0,r0
+       mov.l r0, @r1
+
+       nop
+       rts
+
+       .align 4
+
+CCR1_A:                .long CCR1
+CCR1_D:                .long 0x0000090B
+PCCRL4_A:      .long 0xFFFE3910
+PCCRL4_D0:     .long 0x00000000
+PECRL4_A:      .long 0xFFFE3A10
+PECRL4_D0:     .long 0x00000000
+PECRL3_A:      .long 0xFFFE3A12
+PECRL3_D:      .long 0x00000000
+PEIORL_A:      .long 0xFFFE3A06
+PEIORL_D0:     .long 0x00001C00
+PEIORL_D1:     .long 0x00001C02
+PCIORL_A:      .long 0xFFFE3906
+PCIORL_D:      .long 0x00004000
+PFCRH2_A:      .long 0xFFFE3A8C
+PFCRH2_D:      .long 0x00000000
+PFCRH3_A:      .long 0xFFFE3A8A
+PFCRH3_D:      .long 0x00000000
+PFCRH1_A:      .long 0xFFFE3A8E
+PFCRH1_D:      .long 0x00000000
+PFIORH_A:      .long 0xFFFE3A84
+PFIORH_D:      .long 0x00000729
+PECRL1_A:      .long 0xFFFE3A16
+PECRL1_D0:     .long 0x00000033
+
+
+WTCSR_A:       .long 0xFFFE0000
+WTCSR_D0:      .long 0x0000A518
+WTCSR_D1:      .long 0x0000A51D
+WTCNT_A:       .long 0xFFFE0002
+WTCNT_D:       .long 0x00005A84
+FRQCR_A:       .long 0xFFFE0010
+FRQCR_D:       .long 0x00000104
+
+PCCRL4_D1:     .long 0x00000010
+PECRL1_D1:     .long 0x00000133
+
+CMNCR_A:       .long 0xFFFC0000
+CMNCR_D:       .long 0x00001810
+SC0BCR_A:      .long 0xFFFC0004
+SC0BCR_D:      .long 0x10000400
+CS0WCR_A:      .long 0xFFFC0028
+CS0WCR_D:      .long 0x00000B41
+PECRL4_D1:     .long 0x00000100
+CS1WCR_A:      .long 0xFFFC002C
+CS1WCR_D:      .long 0x00000B01
+PCCRL4_D2:     .long 0x00000011
+PCCRL3_A:      .long 0xFFFE3912
+PCCRL3_D:      .long 0x00000011
+PCCRL2_A:      .long 0xFFFE3914
+PCCRL2_D:      .long 0x00001111
+PCCRL1_A:      .long 0xFFFE3916
+PCCRL1_D:      .long 0x00001010
+PDCRL4_A:      .long 0xFFFE3990
+PDCRL4_D:      .long 0x00000011
+PDCRL3_A:      .long 0xFFFE3992
+PDCRL3_D:      .long 0x00000011
+PDCRL2_A:      .long 0xFFFE3994
+PDCRL2_D:      .long 0x00001111
+PDCRL1_A:      .long 0xFFFE3996
+PDCRL1_D:      .long 0x00001000
+CS3BCR_A:      .long 0xFFFC0010
+CS3BCR_D:      .long 0x00004400
+CS3WCR_A:      .long 0xFFFC0034
+CS3WCR_D:      .long 0x00002892
+SDCR_A:                .long 0xFFFC004C
+SDCR_D:                .long 0x00000809
+RTCOR_A:       .long 0xFFFC0058
+RTCOR_D:       .long 0xA55A0041
+RTCSR_A:       .long 0xFFFC0050
+RTCSR_D:       .long 0xa55a0010
+
+STBCR3_A:      .long 0xFFFE0408
+STBCR3_D:      .long 0x00000000
+STBCR4_A:      .long 0xFFFE040C
+STBCR4_D:      .long 0x00000008
+STBCR5_A:      .long 0xFFFE0410
+STBCR5_D:      .long 0x00000000
+STBCR6_A:      .long 0xFFFE0414
+STBCR6_D:      .long 0x00000002
+SDRAM_MODE:    .long 0xFFFC5040
+REPEAT_D:      .long 0x00009C40
diff --git a/board/rsk7203/rsk7203.c b/board/rsk7203/rsk7203.c
new file mode 100644 (file)
index 0000000..beb943e
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2008 Nobuhiro Iwamatsu
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * u-boot/board/rsk7203/rsk7203.c
+ *
+ * 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/processor.h>
+
+int checkboard(void)
+{
+       puts("BOARD: Renesas Technology RSK7203\n");
+       return 0;
+}
+
+int board_init(void)
+{
+       return 0;
+}
+
+int dram_init(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       gd->bd->bi_memstart = CFG_SDRAM_BASE;
+       gd->bd->bi_memsize = CFG_SDRAM_SIZE;
+       printf("DRAM:  %dMB\n", CFG_SDRAM_SIZE / (1024 * 1024));
+       return 0;
+}
+
+void led_set_state(unsigned short value)
+{
+}
diff --git a/board/rsk7203/u-boot.lds b/board/rsk7203/u-boot.lds
new file mode 100644 (file)
index 0000000..bf4433a
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2008 Nobuhiro Iwamatsu
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-sh-linux", "elf32-sh-linux", "elf32-sh-linux")
+OUTPUT_ARCH(sh)
+ENTRY(_start)
+
+SECTIONS
+{
+       /*
+        * Base address of internal SDRAM is 0x0C000000.
+        *
+        * NOTE: This address must match with the definition of
+        *TEXT_BASE in config.mk (in this directory).
+        */
+
+       . = 0x0C000000 + (8*1024*1024) - (256*1024);
+
+       PROVIDE (reloc_dst = .);
+
+       PROVIDE (_ftext = .);
+       PROVIDE (_fcode = .);
+       PROVIDE (_start = .);
+
+       .text :
+       {
+               cpu/sh2/start.o         (.text)
+               . = ALIGN(8192);
+               common/environment.o    (.ppcenv)
+               . = ALIGN(8192);
+               common/environment.o    (.ppcenvr)
+               . = ALIGN(8192);
+               *(.text)
+               . = ALIGN(4);
+       } =0xFF
+       PROVIDE (_ecode = .);
+       .rodata :
+       {
+               *(.rodata)
+               . = ALIGN(4);
+       }
+       PROVIDE (_etext = .);
+
+
+       PROVIDE (_fdata = .);
+       .data :
+       {
+               *(.data)
+               . = ALIGN(4);
+       }
+       PROVIDE (_edata = .);
+
+       PROVIDE (_fgot = .);
+       .got :
+       {
+               *(.got)
+               . = ALIGN(4);
+       }
+       PROVIDE (_egot = .);
+
+       PROVIDE (__u_boot_cmd_start = .);
+       .u_boot_cmd :
+       {
+               *(.u_boot_cmd)
+               . = ALIGN(4);
+       }
+       PROVIDE (__u_boot_cmd_end = .);
+
+       PROVIDE (reloc_dst_end = .);
+
+       PROVIDE (bss_start = .);
+       PROVIDE (__bss_start = .);
+       .bss :
+       {
+               *(.bss)
+               . = ALIGN(4);
+       }
+       PROVIDE (bss_end = .);
+
+       PROVIDE (_end = .);
+}
diff --git a/board/samsung/smdk6400/.gitignore b/board/samsung/smdk6400/.gitignore
new file mode 100644 (file)
index 0000000..25ab492
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Generated files
+#
+
+/config.tmp
diff --git a/board/samsung/smdk6400/Makefile b/board/samsung/smdk6400/Makefile
new file mode 100644 (file)
index 0000000..7130220
--- /dev/null
@@ -0,0 +1,54 @@
+#
+# (C) Copyright 2000, 2001, 2002
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2008
+# Guennadi Liakhovetki, DENX Software Engineering, <lg@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-y        := smdk6400.o
+SOBJS  := lowlevel_init.o
+
+SRCS    := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS-y))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(SOBJS) $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(SOBJS) $(OBJS)
+
+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/samsung/smdk6400/config.mk b/board/samsung/smdk6400/config.mk
new file mode 100644 (file)
index 0000000..298d387
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# (C) Copyright 2002
+# Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+# David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+#
+# (C) Copyright 2008
+# Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
+#
+# SAMSUNG SMDK6400 board with mDirac3 (ARM1176) cpu
+#
+# see http://www.samsung.com/ for more information on SAMSUNG
+
+# On SMDK6400 we use the 64 MB SDRAM bank at
+#
+# 0x50000000 to 0x58000000
+#
+# Linux-Kernel is expected to be at 0x50008000, entry 0x50008000
+#
+# we load ourselves to 0x57e00000 without MMU
+# with MMU, load address is changed to 0xc7e00000
+#
+# download area is 0x5000c000
+
+sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
+
+ifndef CONFIG_NAND_SPL
+TEXT_BASE = $(RAM_TEXT)
+else
+TEXT_BASE = 0
+endif
diff --git a/board/samsung/smdk6400/lowlevel_init.S b/board/samsung/smdk6400/lowlevel_init.S
new file mode 100644 (file)
index 0000000..034c810
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * Memory Setup stuff - taken from blob memsetup.S
+ *
+ * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and
+ *                     Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl)
+ *
+ * Modified for the Samsung SMDK2410 by
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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 <config.h>
+#include <version.h>
+
+#include <s3c6400.h>
+
+#ifdef CONFIG_SERIAL1
+#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART0_OFFSET)
+#elif defined(CONFIG_SERIAL2)
+#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART1_OFFSET)
+#else
+#define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART2_OFFSET)
+#endif
+
+_TEXT_BASE:
+       .word   TEXT_BASE
+
+       .globl lowlevel_init
+lowlevel_init:
+       mov     r12, lr
+
+       /* LED on only #8 */
+       ldr     r0, =ELFIN_GPIO_BASE
+       ldr     r1, =0x55540000
+       str     r1, [r0, #GPNCON_OFFSET]
+
+       ldr     r1, =0x55555555
+       str     r1, [r0, #GPNPUD_OFFSET]
+
+       ldr     r1, =0xf000
+       str     r1, [r0, #GPNDAT_OFFSET]
+
+       /* Disable Watchdog */
+       ldr     r0, =0x7e000000         @0x7e004000
+       orr     r0, r0, #0x4000
+       mov     r1, #0
+       str     r1, [r0]
+
+       /* External interrupt pending clear */
+       ldr     r0, =(ELFIN_GPIO_BASE+EINTPEND_OFFSET)  /*EINTPEND*/
+       ldr     r1, [r0]
+       str     r1, [r0]
+
+       ldr     r0, =ELFIN_VIC0_BASE_ADDR       @0x71200000
+       ldr     r1, =ELFIN_VIC1_BASE_ADDR       @0x71300000
+
+       /* Disable all interrupts (VIC0 and VIC1) */
+       mvn     r3, #0x0
+       str     r3, [r0, #oINTMSK]
+       str     r3, [r1, #oINTMSK]
+
+       /* Set all interrupts as IRQ */
+       mov     r3, #0x0
+       str     r3, [r0, #oINTMOD]
+       str     r3, [r1, #oINTMOD]
+
+       /* Pending Interrupt Clear */
+       mov     r3, #0x0
+       str     r3, [r0, #oVECTADDR]
+       str     r3, [r1, #oVECTADDR]
+
+       /* init system clock */
+       bl system_clock_init
+
+#ifndef CONFIG_NAND_SPL
+       /* for UART */
+       bl uart_asm_init
+#endif
+
+#ifdef CONFIG_BOOT_NAND
+       /* simple init for NAND */
+       bl nand_asm_init
+#endif
+
+       bl      mem_ctrl_asm_init
+
+/* Wakeup support. Don't know if it's going to be used, untested. */
+        ldr     r0, =(ELFIN_CLOCK_POWER_BASE + RST_STAT_OFFSET)
+        ldr     r1, [r0]
+        bic     r1, r1, #0xfffffff7
+        cmp     r1, #0x8
+        beq     wakeup_reset
+
+1:
+       mov     lr, r12
+       mov     pc, lr
+
+wakeup_reset:
+
+       /* Clear wakeup status register */
+       ldr     r0, =(ELFIN_CLOCK_POWER_BASE + WAKEUP_STAT_OFFSET)
+       ldr     r1, [r0]
+       str     r1, [r0]
+
+        /* LED test */
+        ldr     r0, =ELFIN_GPIO_BASE
+        ldr     r1, =0x3000
+        str     r1, [r0, #GPNDAT_OFFSET]
+
+       /* Load return address and jump to kernel */
+       ldr     r0, =(ELFIN_CLOCK_POWER_BASE + INF_REG0_OFFSET)
+       /* r1 = physical address of s3c6400_cpu_resume function */
+       ldr     r1, [r0]
+       /* Jump to kernel (sleep-s3c6400.S) */
+       mov     pc, r1
+       nop
+       nop
+/*
+ * system_clock_init: Initialize core clock and bus clock.
+ * void system_clock_init(void)
+ */
+system_clock_init:
+       ldr     r0, =ELFIN_CLOCK_POWER_BASE     /* 0x7e00f000 */
+
+#ifdef CONFIG_SYNC_MODE
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       mov     r2, #0x40
+       orr     r1, r1, r2
+       str     r1, [r0, #OTHERS_OFFSET]
+
+       nop
+       nop
+       nop
+       nop
+       nop
+
+       ldr     r2, =0x80
+       orr     r1, r1, r2
+       str     r1, [r0, #OTHERS_OFFSET]
+
+check_syncack:
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       ldr     r2, =0xf00
+       and     r1, r1, r2
+       cmp     r1, #0xf00
+       bne     check_syncack
+#else  /* ASYNC Mode */
+       nop
+       nop
+       nop
+       nop
+       nop
+
+       /*
+        * This was unconditional in original Samsung sources, but it doesn't
+        * seem to make much sense on S3C6400.
+        */
+#ifndef CONFIG_S3C6400
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       bic     r1, r1, #0xC0
+       orr     r1, r1, #0x40
+       str     r1, [r0, #OTHERS_OFFSET]
+
+wait_for_async:
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       and     r1, r1, #0xf00
+       cmp     r1, #0x0
+       bne     wait_for_async
+#endif
+
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       bic     r1, r1, #0x40
+       str     r1, [r0, #OTHERS_OFFSET]
+#endif
+
+       mov     r1, #0xff00
+       orr     r1, r1, #0xff
+       str     r1, [r0, #APLL_LOCK_OFFSET]
+       str     r1, [r0, #MPLL_LOCK_OFFSET]
+
+       /* Set Clock Divider */
+       ldr     r1, [r0, #CLK_DIV0_OFFSET]
+       bic     r1, r1, #0x30000
+       bic     r1, r1, #0xff00
+       bic     r1, r1, #0xff
+       ldr     r2, =CLK_DIV_VAL
+       orr     r1, r1, r2
+       str     r1, [r0, #CLK_DIV0_OFFSET]
+
+       ldr     r1, =APLL_VAL
+       str     r1, [r0, #APLL_CON_OFFSET]
+       ldr     r1, =MPLL_VAL
+       str     r1, [r0, #MPLL_CON_OFFSET]
+
+       /* FOUT of EPLL is 96MHz */
+       ldr     r1, =0x200203
+       str     r1, [r0, #EPLL_CON0_OFFSET]
+       ldr     r1, =0x0
+       str     r1, [r0, #EPLL_CON1_OFFSET]
+
+       /* APLL, MPLL, EPLL select to Fout */
+       ldr     r1, [r0, #CLK_SRC_OFFSET]
+       orr     r1, r1, #0x7
+       str     r1, [r0, #CLK_SRC_OFFSET]
+
+       /* wait at least 200us to stablize all clock */
+       mov     r1, #0x10000
+1:     subs    r1, r1, #1
+       bne     1b
+
+       /* Synchronization for VIC port */
+#if defined(CONFIG_SYNC_MODE)
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       orr     r1, r1, #0x20
+       str     r1, [r0, #OTHERS_OFFSET]
+#elif !defined(CONFIG_S3C6400)
+       /* According to 661558um_S3C6400X_rev10.pdf 0x20 is reserved */
+       ldr     r1, [r0, #OTHERS_OFFSET]
+       bic     r1, r1, #0x20
+       str     r1, [r0, #OTHERS_OFFSET]
+#endif
+       mov     pc, lr
+
+
+#ifndef CONFIG_NAND_SPL
+/*
+ * uart_asm_init: Initialize UART's pins
+ */
+uart_asm_init:
+       /* set GPIO to enable UART */
+       ldr     r0, =ELFIN_GPIO_BASE
+       ldr     r1, =0x220022
+       str     r1, [r0, #GPACON_OFFSET]
+       mov     pc, lr
+#endif
+
+#ifdef CONFIG_BOOT_NAND
+/*
+ * NAND Interface init for SMDK6400
+ */
+nand_asm_init:
+       ldr     r0, =ELFIN_NAND_BASE
+       ldr     r1, [r0, #NFCONF_OFFSET]
+       orr     r1, r1, #0x70
+       orr     r1, r1, #0x7700
+       str     r1, [r0, #NFCONF_OFFSET]
+
+       ldr     r1, [r0, #NFCONT_OFFSET]
+       orr     r1, r1, #0x07
+       str     r1, [r0, #NFCONT_OFFSET]
+
+       mov     pc, lr
+#endif
+
+#ifdef CONFIG_ENABLE_MMU
+/*
+ * MMU Table for SMDK6400
+ */
+
+       /* form a first-level section entry */
+.macro FL_SECTION_ENTRY base,ap,d,c,b
+       .word (\base << 20) | (\ap << 10) | \
+             (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
+.endm
+
+.section .mmudata, "a"
+       .align 14
+       /* the following alignment creates the mmu table at address 0x4000. */
+       .globl mmu_table
+mmu_table:
+       .set __base, 0
+       /* 1:1 mapping for debugging */
+       .rept 0xA00
+       FL_SECTION_ENTRY __base, 3, 0, 0, 0
+       .set __base, __base + 1
+       .endr
+
+       /* access is not allowed. */
+       .rept 0xC00 - 0xA00
+       .word 0x00000000
+       .endr
+
+       /* 128MB for SDRAM 0xC0000000 -> 0x50000000 */
+       .set __base, 0x500
+       .rept 0xC80 - 0xC00
+       FL_SECTION_ENTRY __base, 3, 0, 1, 1
+       .set __base, __base + 1
+       .endr
+
+       /* access is not allowed. */
+       .rept 0x1000 - 0xc80
+       .word 0x00000000
+       .endr
+#endif
diff --git a/board/samsung/smdk6400/smdk6400.c b/board/samsung/smdk6400/smdk6400.c
new file mode 100644 (file)
index 0000000..77fd2c8
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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 <common.h>
+#include <s3c6400.h>
+
+/* ------------------------------------------------------------------------- */
+#define CS8900_Tacs    0x0     /* 0clk         address set-up          */
+#define CS8900_Tcos    0x4     /* 4clk         chip selection set-up   */
+#define CS8900_Tacc    0xE     /* 14clk        access cycle            */
+#define CS8900_Tcoh    0x1     /* 1clk         chip selection hold     */
+#define CS8900_Tah     0x4     /* 4clk         address holding time    */
+#define CS8900_Tacp    0x6     /* 6clk         page mode access cycle  */
+#define CS8900_PMC     0x0     /* normal(1data)page mode configuration */
+
+static inline void delay(unsigned long loops)
+{
+       __asm__ volatile ("1:\n" "subs %0, %1, #1\n"
+                         "bne 1b"
+                         : "=r" (loops) : "0" (loops));
+}
+
+/*
+ * Miscellaneous platform dependent initialisations
+ */
+
+static void cs8900_pre_init(void)
+{
+       SROM_BW_REG &= ~(0xf << 4);
+       SROM_BW_REG |= (1 << 7) | (1 << 6) | (1 << 4);
+       SROM_BC1_REG = ((CS8900_Tacs << 28) + (CS8900_Tcos << 24) +
+                       (CS8900_Tacc << 16) + (CS8900_Tcoh << 12) +
+                       (CS8900_Tah << 8) + (CS8900_Tacp << 4) + CS8900_PMC);
+}
+
+int board_init(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       cs8900_pre_init();
+
+       /* NOR-flash in SROM0 */
+
+       /* Enable WAIT */
+       SROM_BW_REG |= 4 | 8 | 1;
+
+       gd->bd->bi_arch_number = MACH_TYPE;
+       gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+       return 0;
+}
+
+#ifdef CONFIG_DISPLAY_BOARDINFO
+int checkboard(void)
+{
+       printf("Board:   SMDK6400\n");
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_ENABLE_MMU
+ulong virt_to_phy_smdk6400(ulong addr)
+{
+       if ((0xc0000000 <= addr) && (addr < 0xc8000000))
+               return addr - 0xc0000000 + 0x50000000;
+       else
+               printf("do not support this address : %08lx\n", addr);
+
+       return addr;
+}
+#endif
+
+#if defined(CONFIG_CMD_NAND) && defined(CFG_NAND_LEGACY)
+#include <linux/mtd/nand.h>
+extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
+void nand_init(void)
+{
+       nand_probe(CFG_NAND_BASE);
+       if (nand_dev_desc[0].ChipID != NAND_ChipID_UNKNOWN)
+               print_size(nand_dev_desc[0].totlen, "\n");
+}
+#endif
+
+ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t *info)
+{
+       if (banknum == 0) {     /* non-CFI boot flash */
+               info->portwidth = FLASH_CFI_16BIT;
+               info->chipwidth = FLASH_CFI_BY16;
+               info->interface = FLASH_CFI_X16;
+               return 1;
+       } else
+               return 0;
+}
diff --git a/board/samsung/smdk6400/u-boot-nand.lds b/board/samsung/smdk6400/u-boot-nand.lds
new file mode 100644 (file)
index 0000000..132ab21
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         cpu/arm1176/start.o   (.text)
+         cpu/arm1176/s3c64xx/cpu_init.o        (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       .mmudata : { *(.mmudata) }
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss : { *(.bss) }
+       _end = .;
+}
diff --git a/board/sh7785lcr/Makefile b/board/sh7785lcr/Makefile
new file mode 100644 (file)
index 0000000..b1b538c
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# Copyright (C) 2008  Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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 $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+COBJS  := sh7785lcr.o selfcheck.o rtl8169_mac.o
+SOBJS  := lowlevel_init.o
+
+$(LIB):        $(obj).depend $(COBJS) $(SOBJS)
+       $(AR) $(ARFLAGS) $@ $(COBJS) $(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/sh7785lcr/config.mk b/board/sh7785lcr/config.mk
new file mode 100644 (file)
index 0000000..93761ee
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2007
+# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+#
+# 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
+
+#
+# TEXT_BASE refers to image _after_ relocation.
+#
+# NOTE: Must match value used in u-boot.lds (in this directory).
+#
+TEXT_BASE = 0x0ff80000
+
diff --git a/board/sh7785lcr/lowlevel_init.S b/board/sh7785lcr/lowlevel_init.S
new file mode 100644 (file)
index 0000000..8126296
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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/processor.h>
+
+.macro write32, addr, data
+       mov.l \addr ,r1
+       mov.l \data ,r0
+       mov.l r0, @r1
+.endm
+
+.macro write16, addr, data
+       mov.l \addr ,r1
+       mov.l \data ,r0
+       mov.w r0, @r1
+.endm
+
+.macro write8, addr, data
+       mov.l \addr ,r1
+       mov.l \data ,r0
+       mov.b r0, @r1
+.endm
+
+.macro wait_timer, time
+       mov.l   \time ,r3
+1:
+       nop
+       tst     r3, r3
+       bf/s    1b
+       dt      r3
+.endm
+
+#include <asm/processor.h>
+
+       .global lowlevel_init
+
+       .text
+       .align  2
+
+lowlevel_init:
+       wait_timer      WAIT_200US
+       wait_timer      WAIT_200US
+
+       /*------- LBSC -------*/
+       write32 MMSELR_A,       MMSELR_D
+
+       /*------- DBSC2 -------*/
+       write32 DBSC2_DBCONF_A, DBSC2_DBCONF_D
+       write32 DBSC2_DBTR0_A,  DBSC2_DBTR0_D
+       write32 DBSC2_DBTR1_A,  DBSC2_DBTR1_D
+       write32 DBSC2_DBTR2_A,  DBSC2_DBTR2_D
+       write32 DBSC2_DBFREQ_A, DBSC2_DBFREQ_D1
+       write32 DBSC2_DBFREQ_A, DBSC2_DBFREQ_D2
+       wait_timer      WAIT_200US
+
+       write32 DBSC2_DBDICODTOCD_A,    DBSC2_DBDICODTOCD_D
+       write32 DBSC2_DBCMDCNT_A,       DBSC2_DBCMDCNT_D_CKE_H
+       wait_timer      WAIT_200US
+       write32 DBSC2_DBCMDCNT_A,       DBSC2_DBCMDCNT_D_PALL
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_EMRS2
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_EMRS3
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_EMRS1_1
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_MRS_1
+       write32 DBSC2_DBCMDCNT_A,       DBSC2_DBCMDCNT_D_PALL
+       write32 DBSC2_DBCMDCNT_A,       DBSC2_DBCMDCNT_D_REF
+       write32 DBSC2_DBCMDCNT_A,       DBSC2_DBCMDCNT_D_REF
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_MRS_2
+       wait_timer      WAIT_200US
+
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_EMRS1_2
+       write32 DBSC2_DBMRCNT_A,        DBSC2_DBMRCNT_D_EMRS1_1
+
+       write32 DBSC2_DBEN_A,           DBSC2_DBEN_D
+       write32 DBSC2_DBRFCNT1_A,       DBSC2_DBRFCNT1_D
+       write32 DBSC2_DBRFCNT2_A,       DBSC2_DBRFCNT2_D
+       write32 DBSC2_DBRFCNT0_A,       DBSC2_DBRFCNT0_D
+       wait_timer      WAIT_200US
+
+       /*------- GPIO -------*/
+       write16 PACR_A, PACR_D
+       write16 PBCR_A, PBCR_D
+       write16 PCCR_A, PCCR_D
+       write16 PDCR_A, PDCR_D
+       write16 PECR_A, PECR_D
+       write16 PFCR_A, PFCR_D
+       write16 PGCR_A, PGCR_D
+       write16 PHCR_A, PHCR_D
+       write16 PJCR_A, PJCR_D
+       write16 PKCR_A, PKCR_D
+       write16 PLCR_A, PLCR_D
+       write16 PMCR_A, PMCR_D
+       write16 PNCR_A, PNCR_D
+       write16 PPCR_A, PPCR_D
+       write16 PQCR_A, PQCR_D
+       write16 PRCR_A, PRCR_D
+
+       write8  PEPUPR_A,       PEPUPR_D
+       write8  PHPUPR_A,       PHPUPR_D
+       write8  PJPUPR_A,       PJPUPR_D
+       write8  PKPUPR_A,       PKPUPR_D
+       write8  PLPUPR_A,       PLPUPR_D
+       write8  PMPUPR_A,       PMPUPR_D
+       write8  PNPUPR_A,       PNPUPR_D
+       write16 PPUPR1_A,       PPUPR1_D
+       write16 PPUPR2_A,       PPUPR2_D
+       write16 P1MSELR_A,      P1MSELR_D
+       write16 P2MSELR_A,      P2MSELR_D
+
+       /*------- LBSC -------*/
+       write32 BCR_A,          BCR_D
+       write32 CS0BCR_A,       CS0BCR_D
+       write32 CS0WCR_A,       CS0WCR_D
+       write32 CS1BCR_A,       CS1BCR_D
+       write32 CS1WCR_A,       CS1WCR_D
+       write32 CS4BCR_A,       CS4BCR_D
+       write32 CS4WCR_A,       CS4WCR_D
+
+       mov.l   PASCR_A, r0
+       mov.l   @r0, r2
+       mov.l   PASCR_32BIT_MODE, r1
+       tst     r1, r2
+       bt      lbsc_29bit
+
+       write32 CS2BCR_A,       CS_USB_BCR_D
+       write32 CS2WCR_A,       CS_USB_WCR_D
+       write32 CS3BCR_A,       CS_SD_BCR_D
+       write32 CS3WCR_A,       CS_SD_WCR_D
+       write32 CS5BCR_A,       CS_I2C_BCR_D
+       write32 CS5WCR_A,       CS_I2C_WCR_D
+       write32 CS6BCR_A,       CS0BCR_D
+       write32 CS6WCR_A,       CS0WCR_D
+       bra     lbsc_end
+        nop
+
+lbsc_29bit:
+       write32 CS5BCR_A,       CS_USB_BCR_D
+       write32 CS5WCR_A,       CS_USB_WCR_D
+       write32 CS6BCR_A,       CS_SD_BCR_D
+       write32 CS6WCR_A,       CS_SD_WCR_D
+
+lbsc_end:
+
+       write32 CCR_A,  CCR_D
+
+       rts
+       nop
+
+       .align 4
+
+/*------- LBSC -------*/
+MMSELR_A:      .long   0xfc400020
+MMSELR_D:      .long   0xa5a50002
+
+/*------- DBSC2 -------*/
+#define DBSC2_BASE     0xfe800000
+DBSC2_DBSTATE_A:       .long   DBSC2_BASE + 0x0c
+DBSC2_DBEN_A:          .long   DBSC2_BASE + 0x10
+DBSC2_DBCMDCNT_A:      .long   DBSC2_BASE + 0x14
+DBSC2_DBCONF_A:                .long   DBSC2_BASE + 0x20
+DBSC2_DBTR0_A:         .long   DBSC2_BASE + 0x30
+DBSC2_DBTR1_A:         .long   DBSC2_BASE + 0x34
+DBSC2_DBTR2_A:         .long   DBSC2_BASE + 0x38
+DBSC2_DBRFCNT0_A:      .long   DBSC2_BASE + 0x40
+DBSC2_DBRFCNT1_A:      .long   DBSC2_BASE + 0x44
+DBSC2_DBRFCNT2_A:      .long   DBSC2_BASE + 0x48
+DBSC2_DBRFSTS_A:       .long   DBSC2_BASE + 0x4c
+DBSC2_DBFREQ_A:                .long   DBSC2_BASE + 0x50
+DBSC2_DBDICODTOCD_A:   .long   DBSC2_BASE + 0x54
+DBSC2_DBMRCNT_A:       .long   DBSC2_BASE + 0x60
+DDR_DUMMY_ACCESS_A:    .long   0x40000000
+
+DBSC2_DBCONF_D:                .long   0x00630002
+DBSC2_DBTR0_D:         .long   0x050b1f04
+DBSC2_DBTR1_D:         .long   0x00040204
+DBSC2_DBTR2_D:         .long   0x02100308
+DBSC2_DBFREQ_D1:       .long   0x00000000
+DBSC2_DBFREQ_D2:       .long   0x00000100
+DBSC2_DBDICODTOCD_D:   .long   0x000f0907
+
+DBSC2_DBCMDCNT_D_CKE_H:        .long   0x00000003
+DBSC2_DBCMDCNT_D_PALL: .long   0x00000002
+DBSC2_DBCMDCNT_D_REF:  .long   0x00000004
+
+DBSC2_DBMRCNT_D_EMRS2: .long   0x00020000
+DBSC2_DBMRCNT_D_EMRS3: .long   0x00030000
+DBSC2_DBMRCNT_D_EMRS1_1:       .long   0x00010006
+DBSC2_DBMRCNT_D_EMRS1_2:       .long   0x00010386
+DBSC2_DBMRCNT_D_MRS_1: .long   0x00000952
+DBSC2_DBMRCNT_D_MRS_2: .long   0x00000852
+
+DBSC2_DBEN_D:          .long   0x00000001
+
+DBSC2_DBPDCNT0_D3:     .long   0x00000080
+DBSC2_DBRFCNT1_D:      .long   0x00000926
+DBSC2_DBRFCNT2_D:      .long   0x00fe00fe
+DBSC2_DBRFCNT0_D:      .long   0x00010000
+
+WAIT_200US:    .long   33333
+
+/*------- GPIO -------*/
+#define GPIO_BASE      0xffe70000
+PACR_A:                .long   GPIO_BASE + 0x00
+PBCR_A:                .long   GPIO_BASE + 0x02
+PCCR_A:                .long   GPIO_BASE + 0x04
+PDCR_A:                .long   GPIO_BASE + 0x06
+PECR_A:                .long   GPIO_BASE + 0x08
+PFCR_A:                .long   GPIO_BASE + 0x0a
+PGCR_A:                .long   GPIO_BASE + 0x0c
+PHCR_A:                .long   GPIO_BASE + 0x0e
+PJCR_A:                .long   GPIO_BASE + 0x10
+PKCR_A:                .long   GPIO_BASE + 0x12
+PLCR_A:                .long   GPIO_BASE + 0x14
+PMCR_A:                .long   GPIO_BASE + 0x16
+PNCR_A:                .long   GPIO_BASE + 0x18
+PPCR_A:                .long   GPIO_BASE + 0x1a
+PQCR_A:                .long   GPIO_BASE + 0x1c
+PRCR_A:                .long   GPIO_BASE + 0x1e
+PEPUPR_A:      .long   GPIO_BASE + 0x48
+PHPUPR_A:      .long   GPIO_BASE + 0x4e
+PJPUPR_A:      .long   GPIO_BASE + 0x50
+PKPUPR_A:      .long   GPIO_BASE + 0x52
+PLPUPR_A:      .long   GPIO_BASE + 0x54
+PMPUPR_A:      .long   GPIO_BASE + 0x56
+PNPUPR_A:      .long   GPIO_BASE + 0x58
+PPUPR1_A:      .long   GPIO_BASE + 0x60
+PPUPR2_A:      .long   GPIO_BASE + 0x62
+P1MSELR_A:     .long   GPIO_BASE + 0x80
+P2MSELR_A:     .long   GPIO_BASE + 0x82
+
+PACR_D:                .long   0x0000
+PBCR_D:                .long   0x0000
+PCCR_D:                .long   0x0000
+PDCR_D:                .long   0x0000
+PECR_D:                .long   0x0000
+PFCR_D:                .long   0x0000
+PGCR_D:                .long   0x0000
+PHCR_D:                .long   0x00c0
+PJCR_D:                .long   0xc3fc
+PKCR_D:                .long   0x03ff
+PLCR_D:                .long   0x0000
+PMCR_D:                .long   0xffff
+PNCR_D:                .long   0xf0c3
+PPCR_D:                .long   0x0000
+PQCR_D:                .long   0x0000
+PRCR_D:                .long   0x0000
+
+PEPUPR_D:      .long   0xff
+PHPUPR_D:      .long   0x00
+PJPUPR_D:      .long   0x00
+PKPUPR_D:      .long   0x00
+PLPUPR_D:      .long   0x00
+PMPUPR_D:      .long   0xfc
+PNPUPR_D:      .long   0x00
+PPUPR1_D:      .long   0xffbf
+PPUPR2_D:      .long   0xff00
+P1MSELR_D:     .long   0x3780
+P2MSELR_D:     .long   0x0000
+
+/*------- LBSC -------*/
+PASCR_A:               .long   0xff000070
+PASCR_32BIT_MODE:      .long   0x80000000      /* check booting mode */
+
+BCR_A:         .long   BCR
+CS0BCR_A:      .long   CS0BCR
+CS0WCR_A:      .long   CS0WCR
+CS1BCR_A:      .long   CS1BCR
+CS1WCR_A:      .long   CS1WCR
+CS2BCR_A:      .long   CS2BCR
+CS2WCR_A:      .long   CS2WCR
+CS3BCR_A:      .long   CS3BCR
+CS3WCR_A:      .long   CS3WCR
+CS4BCR_A:      .long   CS4BCR
+CS4WCR_A:      .long   CS4WCR
+CS5BCR_A:      .long   CS5BCR
+CS5WCR_A:      .long   CS5WCR
+CS6BCR_A:      .long   CS6BCR
+CS6WCR_A:      .long   CS6WCR
+
+BCR_D:         .long   0x80000003
+CS0BCR_D:      .long   0x22222340
+CS0WCR_D:      .long   0x00111118
+CS1BCR_D:      .long   0x11111100
+CS1WCR_D:      .long   0x33333303
+CS4BCR_D:      .long   0x11111300
+CS4WCR_D:      .long   0x00101012
+
+/* USB setting : 32bit mode = CS2, 29bit mode = CS5 */
+CS_USB_BCR_D:  .long   0x11111200
+CS_USB_WCR_D:  .long   0x00020004
+
+/* SD setting  : 32bit mode = CS3, 29bit mode = CS6 */
+CS_SD_BCR_D:   .long   0x00000300
+CS_SD_WCR_D:   .long   0x00030108
+
+/* I2C setting : 32bit mode = CS5, 29bit mode = CS1(already setting) */
+CS_I2C_BCR_D:  .long   0x11111100
+CS_I2C_WCR_D:  .long   0x00000003
+
+CCR_A:         .long   0xff00001c
+CCR_D:         .long   0x0000090b
+
diff --git a/board/sh7785lcr/rtl8169.h b/board/sh7785lcr/rtl8169.h
new file mode 100644 (file)
index 0000000..d1c0d64
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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
+ */
+
+#define PCIREG_8(_adr) (*(volatile unsigned char *)(_adr))
+#define PCIREG_32(_adr)        (*(volatile unsigned long *)(_adr))
+#define PCI_PAR                PCIREG_32(0xfe0401c0)
+#define PCI_PDR                PCIREG_32(0xfe040220)
+#define PCI_CR         PCIREG_32(0xfe040100)
+#define PCI_CONF1      PCIREG_32(0xfe040004)
+
+#define HIGH           1
+#define LOW            0
+
+#define PCI_PROG               0x80
+#define PCI_EEP_ADDRESS                (unsigned short)0x0007
+#define PCI_MAC_ADDRESS_SIZE   3
+
+#define TIME1  100
+#define TIME2  20000
+
+#define BIT_DUMMY      0
+#define MAC_EEP_READ   1
+#define MAC_EEP_WRITE  2
+#define MAC_EEP_ERACE  3
+#define MAC_EEP_EWEN   4
+#define MAC_EEP_EWDS   5
+
+/* RTL8169 */
+const unsigned short EEPROM_W_Data_8169_A[] = {
+       0x8129, 0x10ec, 0x8169, 0x1154, 0x032b,
+       0x4020, 0xa101
+};
+const unsigned short EEPROM_W_Data_8169_B[] = {
+       0x4d15, 0xf7c2, 0x8000, 0x0000, 0x0000, 0x1300,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
diff --git a/board/sh7785lcr/rtl8169_mac.c b/board/sh7785lcr/rtl8169_mac.c
new file mode 100644 (file)
index 0000000..2bc873b
--- /dev/null
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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 <common.h>
+#include "rtl8169.h"
+
+static unsigned char *PCI_MEMR;
+
+static void mac_delay(unsigned int cnt)
+{
+       udelay(cnt);
+}
+
+static void mac_pci_setup(void)
+{
+       unsigned long pci_data;
+
+       PCI_PAR = 0x00000010;
+       PCI_PDR = 0x00001000;
+       PCI_PAR = 0x00000004;
+       pci_data = PCI_PDR;
+       PCI_PDR = pci_data | 0x00000007;
+       PCI_PAR = 0x00000010;
+
+       PCI_MEMR = (unsigned char *)((PCI_PDR | 0xFE240050) & 0xFFFFFFF0);
+}
+
+static void EECS(int level)
+{
+       unsigned char data = *PCI_MEMR;
+
+       if (level)
+               *PCI_MEMR = data | 0x08;
+       else
+               *PCI_MEMR = data & 0xf7;
+}
+
+static void EECLK(int level)
+{
+       unsigned char data = *PCI_MEMR;
+
+       if (level)
+               *PCI_MEMR = data | 0x04;
+       else
+               *PCI_MEMR = data & 0xfb;
+}
+
+static void EEDI(int level)
+{
+       unsigned char data = *PCI_MEMR;
+
+       if (level)
+               *PCI_MEMR = data | 0x02;
+       else
+               *PCI_MEMR = data & 0xfd;
+}
+
+static inline void sh7785lcr_bitset(unsigned short bit)
+{
+       if (bit)
+               EEDI(HIGH);
+       else
+               EEDI(LOW);
+
+       EECLK(LOW);
+       mac_delay(TIME1);
+       EECLK(HIGH);
+       mac_delay(TIME1);
+       EEDI(LOW);
+}
+
+static inline unsigned char sh7785lcr_bitget(void)
+{
+       unsigned char bit;
+
+       EECLK(LOW);
+       mac_delay(TIME1);
+       bit = *PCI_MEMR & 0x01;
+       EECLK(HIGH);
+       mac_delay(TIME1);
+
+       return bit;
+}
+
+static inline void sh7785lcr_setcmd(unsigned char command)
+{
+       sh7785lcr_bitset(BIT_DUMMY);
+       switch (command) {
+       case MAC_EEP_READ:
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(0);
+               break;
+       case MAC_EEP_WRITE:
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(0);
+               sh7785lcr_bitset(1);
+               break;
+       case MAC_EEP_ERACE:
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(1);
+               break;
+       case MAC_EEP_EWEN:
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(0);
+               sh7785lcr_bitset(0);
+               break;
+       case MAC_EEP_EWDS:
+               sh7785lcr_bitset(1);
+               sh7785lcr_bitset(0);
+               sh7785lcr_bitset(0);
+               break;
+       default:
+               break;
+       }
+}
+
+static inline unsigned short sh7785lcr_getdt(void)
+{
+       unsigned short data = 0;
+       int i;
+
+       sh7785lcr_bitget();                     /* DUMMY */
+       for (i = 0 ; i < 16 ; i++) {
+               data <<= 1;
+               data |= sh7785lcr_bitget();
+       }
+       return data;
+}
+
+static inline void sh7785lcr_setadd(unsigned short address)
+{
+       sh7785lcr_bitset(address & 0x0020);     /* A5 */
+       sh7785lcr_bitset(address & 0x0010);     /* A4 */
+       sh7785lcr_bitset(address & 0x0008);     /* A3 */
+       sh7785lcr_bitset(address & 0x0004);     /* A2 */
+       sh7785lcr_bitset(address & 0x0002);     /* A1 */
+       sh7785lcr_bitset(address & 0x0001);     /* A0 */
+}
+
+static inline void sh7785lcr_setdata(unsigned short data)
+{
+       sh7785lcr_bitset(data & 0x8000);
+       sh7785lcr_bitset(data & 0x4000);
+       sh7785lcr_bitset(data & 0x2000);
+       sh7785lcr_bitset(data & 0x1000);
+       sh7785lcr_bitset(data & 0x0800);
+       sh7785lcr_bitset(data & 0x0400);
+       sh7785lcr_bitset(data & 0x0200);
+       sh7785lcr_bitset(data & 0x0100);
+       sh7785lcr_bitset(data & 0x0080);
+       sh7785lcr_bitset(data & 0x0040);
+       sh7785lcr_bitset(data & 0x0020);
+       sh7785lcr_bitset(data & 0x0010);
+       sh7785lcr_bitset(data & 0x0008);
+       sh7785lcr_bitset(data & 0x0004);
+       sh7785lcr_bitset(data & 0x0002);
+       sh7785lcr_bitset(data & 0x0001);
+}
+
+static void sh7785lcr_datawrite(const unsigned short *data, unsigned short address,
+                        unsigned int count)
+{
+       unsigned int i;
+
+       for (i = 0; i < count; i++) {
+               EECS(HIGH);
+               EEDI(LOW);
+               mac_delay(TIME1);
+
+               sh7785lcr_setcmd(MAC_EEP_WRITE);
+               sh7785lcr_setadd(address++);
+               sh7785lcr_setdata(*(data + i));
+
+               EECLK(LOW);
+               EEDI(LOW);
+               EECS(LOW);
+               mac_delay(TIME2);
+       }
+}
+
+static void sh7785lcr_macerase(void)
+{
+       unsigned int i;
+       unsigned short pci_address = 7;
+
+       for (i = 0; i < 3; i++) {
+               EECS(HIGH);
+               EEDI(LOW);
+               mac_delay(TIME1);
+               sh7785lcr_setcmd(MAC_EEP_ERACE);
+               sh7785lcr_setadd(pci_address++);
+               mac_delay(TIME1);
+               EECLK(LOW);
+               EEDI(LOW);
+               EECS(LOW);
+       }
+
+       mac_delay(TIME2);
+
+       printf("\n\nErace End\n");
+       for (i = 0; i < 10; i++)
+               mac_delay(TIME2);
+}
+
+static void sh7785lcr_macwrite(unsigned short *data)
+{
+       sh7785lcr_macerase();
+
+       sh7785lcr_datawrite(EEPROM_W_Data_8169_A, 0x0000, 7);
+       sh7785lcr_datawrite(data, PCI_EEP_ADDRESS, PCI_MAC_ADDRESS_SIZE);
+       sh7785lcr_datawrite(EEPROM_W_Data_8169_B, 0x000a, 54);
+}
+
+void sh7785lcr_macdtrd(unsigned char *buf, unsigned short address, unsigned int count)
+{
+       unsigned int i;
+       unsigned short wk;
+
+       for (i = 0 ; i < count; i++) {
+               EECS(HIGH);
+               EEDI(LOW);
+               mac_delay(TIME1);
+               sh7785lcr_setcmd(MAC_EEP_READ);
+               sh7785lcr_setadd(address++);
+               wk = sh7785lcr_getdt();
+
+               *buf++ = (unsigned char)(wk & 0xff);
+               *buf++ = (unsigned char)((wk >> 8) & 0xff);
+               EECLK(LOW);
+               EEDI(LOW);
+               EECS(LOW);
+       }
+}
+
+static void sh7785lcr_macadrd(unsigned char *buf)
+{
+       *PCI_MEMR = PCI_PROG;
+
+       sh7785lcr_macdtrd(buf, PCI_EEP_ADDRESS, PCI_MAC_ADDRESS_SIZE);
+}
+
+static void sh7785lcr_eepewen(void)
+{
+       *PCI_MEMR = PCI_PROG;
+       mac_delay(TIME1);
+       EECS(LOW);
+       EECLK(LOW);
+       EEDI(LOW);
+       EECS(HIGH);
+       mac_delay(TIME1);
+
+       sh7785lcr_setcmd(MAC_EEP_EWEN);
+       sh7785lcr_bitset(1);
+       sh7785lcr_bitset(1);
+       sh7785lcr_bitset(BIT_DUMMY);
+       sh7785lcr_bitset(BIT_DUMMY);
+       sh7785lcr_bitset(BIT_DUMMY);
+       sh7785lcr_bitset(BIT_DUMMY);
+
+       EECLK(LOW);
+       EEDI(LOW);
+       EECS(LOW);
+       mac_delay(TIME1);
+}
+
+void mac_write(unsigned short *data)
+{
+       mac_pci_setup();
+       sh7785lcr_eepewen();
+       sh7785lcr_macwrite(data);
+}
+
+void mac_read(void)
+{
+       unsigned char data[6];
+
+       mac_pci_setup();
+       sh7785lcr_macadrd(data);
+       printf("Mac = %02x:%02x:%02x:%02x:%02x:%02x\n",
+               data[0], data[1], data[2], data[3], data[4], data[5]);
+}
+
+int do_set_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       int i;
+       unsigned char mac[6];
+       char *s, *e;
+
+       if (argc != 2) {
+               printf("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       s = argv[1];
+
+       for (i = 0; i < 6; i++) {
+               mac[i] = s ? simple_strtoul(s, &e, 16) : 0;
+               if (s)
+                       s = (*e) ? e + 1 : e;
+       }
+       mac_write((unsigned short *)mac);
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       setmac, 2,      1,      do_set_mac,
+       "setmac - write MAC address for RTL8110SCL\n",
+       "\n"
+       "setmac <mac address> - write MAC address for RTL8110SCL\n"
+);
+
+int do_print_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       if (argc != 1) {
+               printf("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       mac_read();
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       printmac,       1,      1,      do_print_mac,
+       "printmac - print MAC address for RTL8110\n",
+       "\n"
+       "    - print MAC address for RTL8110\n"
+);
+
diff --git a/board/sh7785lcr/selfcheck.c b/board/sh7785lcr/selfcheck.c
new file mode 100644 (file)
index 0000000..9c228e5
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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 <common.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+#include <asm/pci.h>
+
+#if defined(CONFIG_CPU_32BIT)
+#define NOCACHE_OFFSET         0x00000000
+#else
+#define NOCACHE_OFFSET         0xa0000000
+#endif
+#define PLD_LEDCR              (0x04000008 + NOCACHE_OFFSET)
+#define PLD_SWSR               (0x0400000a + NOCACHE_OFFSET)
+#define PLD_VERSR              (0x0400000c + NOCACHE_OFFSET)
+
+#define SM107_DEVICEID         (0x13e00060 + NOCACHE_OFFSET)
+
+static void wait_ms(unsigned long time)
+{
+       while (time--)
+               udelay(1000);
+}
+
+static void test_pld(void)
+{
+       printf("PLD version = %04x\n", readb(PLD_VERSR));
+}
+
+static void test_sm107(void)
+{
+       printf("SM107 device ID = %04x\n", readl(SM107_DEVICEID));
+}
+
+static void test_led(void)
+{
+       printf("turn on LEDs 3, 5, 7, 9\n");
+       writeb(0x55, PLD_LEDCR);
+       wait_ms(2000);
+       printf("turn on LEDs 4, 6, 8, 10\n");
+       writeb(0xaa, PLD_LEDCR);
+       wait_ms(2000);
+       writeb(0x00, PLD_LEDCR);
+}
+
+static void test_dipsw(void)
+{
+       printf("Please DIPSW set = B'0101\n");
+       while (readb(PLD_SWSR) != 0x05) {
+               if (ctrlc())
+                       return;
+       }
+       printf("Please DIPSW set = B'1010\n");
+       while (readb(PLD_SWSR) != 0x0A) {
+               if (ctrlc())
+                       return;
+       }
+       printf("DIPSW OK\n");
+}
+
+static void test_net(void)
+{
+       unsigned long data;
+
+       writel(0x80000000, 0xfe0401c0);
+       data = readl(0xfe040220);
+       if (data == 0x816910ec)
+               printf("Ethernet OK\n");
+       else
+               printf("Ethernet NG, data = %08x\n", data);
+}
+
+static void test_sata(void)
+{
+       unsigned long data;
+
+       writel(0x80000800, 0xfe0401c0);
+       data = readl(0xfe040220);
+       if (data == 0x35121095)
+               printf("SATA OK\n");
+       else
+               printf("SATA NG, data = %08x\n", data);
+}
+
+static void test_pci(void)
+{
+       writel(0x80001800, 0xfe0401c0);
+       printf("PCI CN1 ID = %08x\n", readl(0xfe040220));
+
+       writel(0x80001000, 0xfe0401c0);
+       printf("PCI CN2 ID = %08x\n", readl(0xfe040220));
+}
+
+int do_hw_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       char *cmd;
+
+       if (argc != 2) {
+               printf("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       cmd = argv[1];
+       switch (cmd[0]) {
+       case 'a':       /* all */
+               test_pld();
+               test_led();
+               test_dipsw();
+               test_sm107();
+               test_net();
+               test_sata();
+               test_pci();
+               break;
+       case 'p':       /* pld or pci */
+               if (cmd[1] == 'l')
+                       test_pld();
+               else
+                       test_pci();
+               break;
+       case 'l':       /* led */
+               test_led();
+               break;
+       case 'd':       /* dipsw */
+               test_dipsw();
+               break;
+       case 's':       /* sm107 or sata */
+               if (cmd[1] == 'm')
+                       test_sm107();
+               else
+                       test_sata();
+               break;
+       case 'n':       /* net */
+               test_net();
+               break;
+       default:
+               printf("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       hwtest, 2,      1,      do_hw_test,
+       "hwtest - hardware test for R0P7785LC0011RL board\n",
+       "\n"
+       "hwtest all   - test all hardware\n"
+       "hwtest pld   - output PLD version\n"
+       "hwtest led   - turn on LEDs\n"
+       "hwtest dipsw - test DIP switch\n"
+       "hwtest sm107 - output SM107 version\n"
+       "hwtest net   - check RTL8110 ID\n"
+       "hwtest sata  - check SiI3512 ID\n"
+       "hwtest pci   - output PCI slot device ID\n"
+);
+
diff --git a/board/sh7785lcr/sh7785lcr.c b/board/sh7785lcr/sh7785lcr.c
new file mode 100644 (file)
index 0000000..5b9c403
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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 <common.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+#include <asm/pci.h>
+
+int checkboard(void)
+{
+       puts("BOARD: Renesas Technology Corp. R0P7785LC0011RL\n");
+       return 0;
+}
+
+int board_init(void)
+{
+       return 0;
+}
+
+int dram_init(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       gd->bd->bi_memstart = CFG_SDRAM_BASE;
+       gd->bd->bi_memsize = CFG_SDRAM_SIZE;
+       printf("DRAM:  %dMB\n", CFG_SDRAM_SIZE / (1024 * 1024));
+       return 0;
+}
+
+static struct pci_controller hose;
+void pci_init_board(void)
+{
+       pci_sh7780_init(&hose);
+}
+
diff --git a/board/sh7785lcr/u-boot.lds b/board/sh7785lcr/u-boot.lds
new file mode 100644 (file)
index 0000000..f0109eb
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyrigth (c) 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyrigth (c) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-sh-linux", "elf32-sh-linux", "elf32-sh-linux")
+OUTPUT_ARCH(sh)
+ENTRY(_start)
+
+SECTIONS
+{
+       . = 0x08000000 + (128 * 1024 * 1024) - (512 * 1024);
+
+       PROVIDE (reloc_dst = .);
+
+       PROVIDE (_ftext = .);
+       PROVIDE (_fcode = .);
+       PROVIDE (_start = .);
+
+       .text :
+       {
+               cpu/sh4/start.o         (.text)
+               . = ALIGN(8192);
+               common/environment.o    (.ppcenv)
+               . = ALIGN(8192);
+               common/environment.o    (.ppcenvr)
+               . = ALIGN(8192);
+               *(.text)
+               . = ALIGN(4);
+       } =0xFF
+       PROVIDE (_ecode = .);
+       .rodata :
+       {
+               *(.rodata)
+               . = ALIGN(4);
+       }
+       PROVIDE (_etext = .);
+
+
+       PROVIDE (_fdata = .);
+       .data :
+       {
+               *(.data)
+               . = ALIGN(4);
+       }
+       PROVIDE (_edata = .);
+
+       PROVIDE (_fgot = .);
+       .got :
+       {
+               *(.got)
+               . = ALIGN(4);
+       }
+       PROVIDE (_egot = .);
+
+       PROVIDE (__u_boot_cmd_start = .);
+       .u_boot_cmd :
+       {
+               *(.u_boot_cmd)
+               . = ALIGN(4);
+       }
+       PROVIDE (__u_boot_cmd_end = .);
+
+       PROVIDE (reloc_dst_end = .);
+       /* _reloc_dst_end = .; */
+
+       PROVIDE (bss_start = .);
+       PROVIDE (__bss_start = .);
+       .bss :
+       {
+               *(.bss)
+               . = ALIGN(4);
+       }
+       PROVIDE (bss_end = .);
+
+       PROVIDE (_end = .);
+}
+
diff --git a/cpu/arm1176/Makefile b/cpu/arm1176/Makefile
new file mode 100644 (file)
index 0000000..1ca9199
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2008
+# Guennadi Liakhovetki, DENX Software Engineering, <lg@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$(CPU).a
+
+START  = start.o
+COBJS  = cpu.o
+
+SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS) $(SOBJS))
+START  := $(addprefix $(obj),$(START))
+
+all:   $(obj).depend $(START) $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/arm1176/config.mk b/cpu/arm1176/config.mk
new file mode 100644 (file)
index 0000000..5083594
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# (C) Copyright 2002
+# Gary Jennejohn, DENX Software Engineering, <gj@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
+#
+PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8 \
+       -msoft-float
+
+# Make ARMv5 to allow more compilers to work, even though its v6.
+PLATFORM_CPPFLAGS += -march=armv5t
+# =========================================================================
+#
+# Supply options according to compiler version
+#
+# =========================================================================
+PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
+PLATFORM_CPPFLAGS +=$(call cc-option,-mno-thumb-interwork,)
+PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
diff --git a/cpu/arm1176/cpu.c b/cpu/arm1176/cpu.c
new file mode 100644 (file)
index 0000000..1e94f7d
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+ * (C) Copyright 2004 Texas Insturments
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@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
+ */
+
+/*
+ * CPU specific code
+ */
+
+#include <common.h>
+#include <command.h>
+#include <s3c6400.h>
+
+static void cache_flush (void);
+
+/* read co-processor 15, register #1 (control register) */
+static unsigned long read_p15_c1 (void)
+{
+       unsigned long value;
+
+       __asm__ __volatile__(
+               "mrc    p15, 0, %0, c1, c0, 0   @ read control reg\n"
+               : "=r" (value)
+               :
+               : "memory");
+       return value;
+}
+
+/* write to co-processor 15, register #1 (control register) */
+static void write_p15_c1 (unsigned long value)
+{
+       __asm__ __volatile__(
+               "mcr    p15, 0, %0, c1, c0, 0   @ write it back\n"
+               :
+               : "r" (value)
+               : "memory");
+
+       read_p15_c1();
+}
+
+static void cp_delay (void)
+{
+       volatile int i;
+
+       /* Many OMAP regs need at least 2 nops  */
+       for (i = 0; i < 100; i++)
+               __asm__ __volatile__("nop\n");
+}
+
+/* See also ARM Ref. Man. */
+#define C1_MMU         (1 << 0)        /* mmu off/on */
+#define C1_ALIGN       (1 << 1)        /* alignment faults off/on */
+#define C1_DC          (1 << 2)        /* dcache off/on */
+#define C1_WB          (1 << 3)        /* merging write buffer on/off */
+#define C1_BIG_ENDIAN  (1 << 7)        /* big endian off/on */
+#define C1_SYS_PROT    (1 << 8)        /* system protection */
+#define C1_ROM_PROT    (1 << 9)        /* ROM protection */
+#define C1_IC          (1 << 12)       /* icache off/on */
+#define C1_HIGH_VECTORS        (1 << 13)       /* location of vectors: low/high */
+#define RESERVED_1     (0xf << 3)      /* must be 111b for R/W */
+
+int cpu_init (void)
+{
+       return 0;
+}
+
+int cleanup_before_linux (void)
+{
+       /*
+        * this function is called just before we call linux
+        * it prepares the processor for linux
+        *
+        * we turn off caches etc ...
+        */
+
+       disable_interrupts ();
+
+       /* turn off I/D-cache */
+       icache_disable();
+       dcache_disable();
+       cache_flush();
+
+       return 0;
+}
+
+
+/* * reset the cpu by setting up the watchdog timer and let him time out */
+void reset_cpu (ulong ignored)
+{
+       printf("reset... \n\n\n");
+       SW_RST_REG = 0x6400;
+       /* loop forever and wait for reset to happen */
+       while (1) {
+               if (serial_tstc()) {
+                       serial_getc();
+                       break;
+               }
+       }
+       /*NOTREACHED*/
+}
+
+int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       disable_interrupts ();
+       reset_cpu (0);
+       /*NOTREACHED*/
+       return 0;
+}
+
+void icache_enable (void)
+{
+       ulong reg;
+
+       reg = read_p15_c1 ();   /* get control reg. */
+       cp_delay ();
+       write_p15_c1 (reg | C1_IC);
+}
+
+void icache_disable (void)
+{
+       ulong reg;
+
+       reg = read_p15_c1 ();
+       cp_delay ();
+       write_p15_c1 (reg & ~C1_IC);
+}
+
+int icache_status (void)
+{
+       return (read_p15_c1 () & C1_IC) != 0;
+}
+
+/* It makes no sense to use the dcache if the MMU is not enabled */
+void dcache_enable (void)
+{
+       ulong reg;
+
+       reg = read_p15_c1 ();
+       cp_delay ();
+       write_p15_c1 (reg | C1_DC);
+}
+
+void dcache_disable (void)
+{
+       ulong reg;
+
+       reg = read_p15_c1 ();
+       cp_delay ();
+       write_p15_c1 (reg & ~C1_DC);
+}
+
+int dcache_status (void)
+{
+       return (read_p15_c1 () & C1_DC) != 0;
+}
+
+/* flush I/D-cache */
+static void cache_flush (void)
+{
+       /* invalidate both caches and flush btb */
+       asm ("mcr p15, 0, %0, c7, c7, 0": :"r" (0));
+       /* mem barrier to sync things */
+       asm ("mcr p15, 0, %0, c7, c10, 4": :"r" (0));
+}
diff --git a/cpu/arm1176/s3c64xx/Makefile b/cpu/arm1176/s3c64xx/Makefile
new file mode 100644 (file)
index 0000000..4ab1811
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# (C) Copyright 2000-2003
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2008
+# Guennadi Liakhovetki, DENX Software Engineering, <lg@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-y        = interrupts.o
+COBJS-$(CONFIG_S3C6400)        += cpu_init.o speed.o
+COBJS-$(CONFIG_USB_OHCI_NEW) += usb.o
+
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
+
+all:   $(obj).depend $(START) $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/arm1176/s3c64xx/config.mk b/cpu/arm1176/s3c64xx/config.mk
new file mode 100644 (file)
index 0000000..204e880
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# (C) Copyright 2002
+# Gary Jennejohn, DENX Software Engineering, <gj@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
+#
+PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8 \
+       -msoft-float
+
+# Make ARMv5 to allow more compilers to work, even though its v6.
+PLATFORM_CPPFLAGS += -march=armv5t
+# =========================================================================
+#
+# Supply options according to compiler version
+#
+# =========================================================================
+#PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
+PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
diff --git a/cpu/arm1176/s3c64xx/cpu_init.S b/cpu/arm1176/s3c64xx/cpu_init.S
new file mode 100644 (file)
index 0000000..08bda99
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Originates from Samsung's u-boot 1.1.6 port to S3C6400 / SMDK6400
+ *
+ * Copyright (C) 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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 <config.h>
+#include <s3c6400.h>
+
+       .globl mem_ctrl_asm_init
+mem_ctrl_asm_init:
+       /* Memory subsystem address 0x7e00f120 */
+       ldr     r0, =ELFIN_MEM_SYS_CFG
+
+       /* Xm0CSn2 = NFCON CS0, Xm0CSn3 = NFCON CS1 */
+       mov     r1, #0xd
+       str     r1, [r0]
+
+       /* DMC1 base address 0x7e001000 */
+       ldr     r0, =ELFIN_DMC1_BASE
+
+       ldr     r1, =0x4
+       str     r1, [r0, #INDEX_DMC_MEMC_CMD]
+
+       ldr     r1, =DMC_DDR_REFRESH_PRD
+       str     r1, [r0, #INDEX_DMC_REFRESH_PRD]
+
+       ldr     r1, =DMC_DDR_CAS_LATENCY
+       str     r1, [r0, #INDEX_DMC_CAS_LATENCY]
+
+       ldr     r1, =DMC_DDR_t_DQSS
+       str     r1, [r0, #INDEX_DMC_T_DQSS]
+
+       ldr     r1, =DMC_DDR_t_MRD
+       str     r1, [r0, #INDEX_DMC_T_MRD]
+
+       ldr     r1, =DMC_DDR_t_RAS
+       str     r1, [r0, #INDEX_DMC_T_RAS]
+
+       ldr     r1, =DMC_DDR_t_RC
+       str     r1, [r0, #INDEX_DMC_T_RC]
+
+       ldr     r1, =DMC_DDR_t_RCD
+       ldr     r2, =DMC_DDR_schedule_RCD
+       orr     r1, r1, r2
+       str     r1, [r0, #INDEX_DMC_T_RCD]
+
+       ldr     r1, =DMC_DDR_t_RFC
+       ldr     r2, =DMC_DDR_schedule_RFC
+       orr     r1, r1, r2
+       str     r1, [r0, #INDEX_DMC_T_RFC]
+
+       ldr     r1, =DMC_DDR_t_RP
+       ldr     r2, =DMC_DDR_schedule_RP
+       orr     r1, r1, r2
+       str     r1, [r0, #INDEX_DMC_T_RP]
+
+       ldr     r1, =DMC_DDR_t_RRD
+       str     r1, [r0, #INDEX_DMC_T_RRD]
+
+       ldr     r1, =DMC_DDR_t_WR
+       str     r1, [r0, #INDEX_DMC_T_WR]
+
+       ldr     r1, =DMC_DDR_t_WTR
+       str     r1, [r0, #INDEX_DMC_T_WTR]
+
+       ldr     r1, =DMC_DDR_t_XP
+       str     r1, [r0, #INDEX_DMC_T_XP]
+
+       ldr     r1, =DMC_DDR_t_XSR
+       str     r1, [r0, #INDEX_DMC_T_XSR]
+
+       ldr     r1, =DMC_DDR_t_ESR
+       str     r1, [r0, #INDEX_DMC_T_ESR]
+
+       ldr     r1, =DMC1_MEM_CFG
+       str     r1, [r0, #INDEX_DMC_MEMORY_CFG]
+
+       ldr     r1, =DMC1_MEM_CFG2
+       str     r1, [r0, #INDEX_DMC_MEMORY_CFG2]
+
+       ldr     r1, =DMC1_CHIP0_CFG
+       str     r1, [r0, #INDEX_DMC_CHIP_0_CFG]
+
+       ldr     r1, =DMC_DDR_32_CFG
+       str     r1, [r0, #INDEX_DMC_USER_CONFIG]
+
+       /* DMC0 DDR Chip 0 configuration direct command reg */
+       ldr     r1, =DMC_NOP0
+       str     r1, [r0, #INDEX_DMC_DIRECT_CMD]
+
+       /* Precharge All */
+       ldr     r1, =DMC_PA0
+       str     r1, [r0, #INDEX_DMC_DIRECT_CMD]
+
+       /* Auto Refresh 2 time */
+       ldr     r1, =DMC_AR0
+       str     r1, [r0, #INDEX_DMC_DIRECT_CMD]
+       str     r1, [r0, #INDEX_DMC_DIRECT_CMD]
+
+       /* MRS */
+       ldr     r1, =DMC_mDDR_EMR0
+       str     r1, [r0, #INDEX_DMC_DIRECT_CMD]
+
+       /* Mode Reg */
+       ldr     r1, =DMC_mDDR_MR0
+       str     r1, [r0, #INDEX_DMC_DIRECT_CMD]
+
+       /* Enable DMC1 */
+       mov     r1, #0x0
+       str     r1, [r0, #INDEX_DMC_MEMC_CMD]
+
+check_dmc1_ready:
+       ldr     r1, [r0, #INDEX_DMC_MEMC_STATUS]
+       mov     r2, #0x3
+       and     r1, r1, r2
+       cmp     r1, #0x1
+       bne     check_dmc1_ready
+       nop
+
+       mov     pc, lr
+
+       .ltorg
diff --git a/cpu/arm1176/s3c64xx/interrupts.c b/cpu/arm1176/s3c64xx/interrupts.c
new file mode 100644 (file)
index 0000000..8356ae4
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * (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>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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 <common.h>
+#include <asm/proc-armv/ptrace.h>
+#include <s3c6400.h>
+
+static ulong timer_load_val;
+
+#define PRESCALER      167
+
+static s3c64xx_timers *s3c64xx_get_base_timers(void)
+{
+       return (s3c64xx_timers *)ELFIN_TIMER_BASE;
+}
+
+/* macro to read the 16 bit timer */
+static inline ulong read_timer(void)
+{
+       s3c64xx_timers *const timers = s3c64xx_get_base_timers();
+
+       return timers->TCNTO4;
+}
+
+/* Internal tick units */
+/* Last decremneter snapshot */
+static unsigned long lastdec;
+/* Monotonic incrementing timer */
+static unsigned long long timestamp;
+
+int interrupt_init(void)
+{
+       s3c64xx_timers *const timers = s3c64xx_get_base_timers();
+
+       /* use PWM Timer 4 because it has no output */
+       /*
+        * We use the following scheme for the timer:
+        * Prescaler is hard fixed at 167, divider at 1/4.
+        * This gives at PCLK frequency 66MHz approx. 10us ticks
+        * The timer is set to wrap after 100s, at 66MHz this obviously
+        * happens after 10,000,000 ticks. A long variable can thus
+        * keep values up to 40,000s, i.e., 11 hours. This should be
+        * enough for most uses:-) Possible optimizations: select a
+        * binary-friendly frequency, e.g., 1ms / 128. Also calculate
+        * the prescaler automatically for other PCLK frequencies.
+        */
+       timers->TCFG0 = PRESCALER << 8;
+       if (timer_load_val == 0) {
+               timer_load_val = get_PCLK() / PRESCALER * (100 / 4); /* 100s */
+               timers->TCFG1 = (timers->TCFG1 & ~0xf0000) | 0x20000;
+       }
+
+       /* load value for 10 ms timeout */
+       lastdec = timers->TCNTB4 = timer_load_val;
+       /* auto load, manual update of Timer 4 */
+       timers->TCON = (timers->TCON & ~0x00700000) | TCON_4_AUTO |
+               TCON_4_UPDATE;
+
+       /* auto load, start Timer 4 */
+       timers->TCON = (timers->TCON & ~0x00700000) | TCON_4_AUTO | COUNT_4_ON;
+       timestamp = 0;
+
+       return 0;
+}
+
+/*
+ * timer without interrupts
+ */
+
+/*
+ * 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)
+{
+       ulong now = read_timer();
+
+       if (lastdec >= now) {
+               /* normal mode */
+               timestamp += lastdec - now;
+       } else {
+               /* we have an overflow ... */
+               timestamp += lastdec + timer_load_val - now;
+       }
+       lastdec = now;
+
+       return timestamp;
+}
+
+/*
+ * 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)
+{
+       /* We overrun in 100s */
+       return (ulong)(timer_load_val / 100);
+}
+
+void reset_timer_masked(void)
+{
+       /* reset time */
+       lastdec = read_timer();
+       timestamp = 0;
+}
+
+void reset_timer(void)
+{
+       reset_timer_masked();
+}
+
+ulong get_timer_masked(void)
+{
+       return get_ticks() / (timer_load_val / (100 * CFG_HZ));
+}
+
+ulong get_timer(ulong base)
+{
+       return get_timer_masked() - base;
+}
+
+void set_timer(ulong t)
+{
+       timestamp = t * (timer_load_val / (100 * CFG_HZ));
+}
+
+void udelay(unsigned long usec)
+{
+       unsigned long long tmp;
+       ulong tmo;
+
+       tmo = (usec + 9) / 10;
+       tmp = get_ticks() + tmo;        /* get current timestamp */
+
+       while (get_ticks() < tmp)/* loop till event */
+                /*NOP*/;
+}
diff --git a/cpu/arm1176/s3c64xx/speed.c b/cpu/arm1176/s3c64xx/speed.c
new file mode 100644 (file)
index 0000000..5c335a5
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * (C) Copyright 2001-2004
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, d.mueller@elsoft.ch
+ *
+ * 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
+ */
+
+/*
+ * This code should work for both the S3C2400 and the S3C2410
+ * as they seem to have the same PLL and clock machinery inside.
+ * The different address mapping is handled by the s3c24xx.h files below.
+ */
+
+#include <common.h>
+#include <s3c6400.h>
+
+#define APLL 0
+#define MPLL 1
+#define EPLL 2
+
+/* ------------------------------------------------------------------------- */
+/*
+ * NOTE: This describes the proper use of this file.
+ *
+ * CONFIG_SYS_CLK_FREQ should be defined as the input frequency of the PLL.
+ *
+ * get_FCLK(), get_HCLK(), get_PCLK() and get_UCLK() return the clock of
+ * the specified bus in HZ.
+ */
+/* ------------------------------------------------------------------------- */
+
+static ulong get_PLLCLK(int pllreg)
+{
+       ulong r, m, p, s;
+
+       switch (pllreg) {
+       case APLL:
+               r = APLL_CON_REG;
+               break;
+       case MPLL:
+               r = MPLL_CON_REG;
+               break;
+       case EPLL:
+               r = EPLL_CON0_REG;
+               break;
+       default:
+               hang();
+       }
+
+       m = (r >> 16) & 0x3ff;
+       p = (r >> 8) & 0x3f;
+       s = r & 0x7;
+
+       return m * (CONFIG_SYS_CLK_FREQ / (p * (1 << s)));
+}
+
+/* return ARMCORE frequency */
+ulong get_ARMCLK(void)
+{
+       ulong div;
+
+       div = CLK_DIV0_REG;
+
+       return get_PLLCLK(APLL) / ((div & 0x7) + 1);
+}
+
+/* return FCLK frequency */
+ulong get_FCLK(void)
+{
+       return get_PLLCLK(APLL);
+}
+
+/* return HCLK frequency */
+ulong get_HCLK(void)
+{
+       ulong fclk;
+
+       uint hclkx2_div = ((CLK_DIV0_REG >> 9) & 0x7) + 1;
+       uint hclk_div = ((CLK_DIV0_REG >> 8) & 0x1) + 1;
+
+       /*
+        * Bit 7 exists on s3c6410, and not on s3c6400, it is reserved on
+        * s3c6400 and is always 0, and it is indeed running in ASYNC mode
+        */
+       if (OTHERS_REG & 0x80)
+               fclk = get_FCLK();              /* SYNC Mode    */
+       else
+               fclk = get_PLLCLK(MPLL);        /* ASYNC Mode   */
+
+       return fclk / (hclk_div * hclkx2_div);
+}
+
+/* return PCLK frequency */
+ulong get_PCLK(void)
+{
+       ulong fclk;
+       uint hclkx2_div = ((CLK_DIV0_REG >> 9) & 0x7) + 1;
+       uint pre_div = ((CLK_DIV0_REG >> 12) & 0xf) + 1;
+
+       if (OTHERS_REG & 0x80)
+               fclk = get_FCLK();              /* SYNC Mode    */
+       else
+               fclk = get_PLLCLK(MPLL);        /* ASYNC Mode   */
+
+       return fclk / (hclkx2_div * pre_div);
+}
+
+/* return UCLK frequency */
+ulong get_UCLK(void)
+{
+       return get_PLLCLK(EPLL);
+}
+
+int print_cpuinfo(void)
+{
+       printf("\nCPU:     S3C6400@%luMHz\n", get_ARMCLK() / 1000000);
+       printf("         Fclk = %luMHz, Hclk = %luMHz, Pclk = %luMHz ",
+              get_FCLK() / 1000000, get_HCLK() / 1000000,
+              get_PCLK() / 1000000);
+
+       if (OTHERS_REG & 0x80)
+               printf("(SYNC Mode) \n");
+       else
+               printf("(ASYNC Mode) \n");
+       return 0;
+}
diff --git a/cpu/arm1176/s3c64xx/usb.c b/cpu/arm1176/s3c64xx/usb.c
new file mode 100644 (file)
index 0000000..274a4ed
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * URB OHCI HCD (Host Controller Driver) initialization for USB on the S3C64XX.
+ *
+ * Copyright (C) 2008,
+ * Guennadi Liakhovetski, DENX Software Engineering <lg@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 <common.h>
+#include <s3c6400.h>
+
+int usb_cpu_init(void)
+{
+       OTHERS_REG |= 0x10000;
+       return 0;
+}
+
+int usb_cpu_stop(void)
+{
+       OTHERS_REG &= ~0x10000;
+       return 0;
+}
+
+void usb_cpu_init_fail(void)
+{
+       OTHERS_REG &= ~0x10000;
+}
diff --git a/cpu/arm1176/start.S b/cpu/arm1176/start.S
new file mode 100644 (file)
index 0000000..991277f
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+ *  armboot - Startup Code for S3C6400/ARM1176 CPU-core
+ *
+ * Copyright (c) 2007  Samsung Electronics
+ *
+ * Copyright (C) 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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
+ *
+ * 2007-09-21 - Restructured codes by jsgood (jsgood.yang@samsung.com)
+ * 2007-09-21 - Added MoviNAND and OneNAND boot codes by
+ * jsgood (jsgood.yang@samsung.com)
+ * Base codes by scsuh (sc.suh)
+ */
+
+#include <config.h>
+#include <version.h>
+#ifdef CONFIG_ENABLE_MMU
+#include <asm/proc/domain.h>
+#endif
+#include <s3c6400.h>
+
+#if !defined(CONFIG_ENABLE_MMU) && !defined(CFG_PHY_UBOOT_BASE)
+#define CFG_PHY_UBOOT_BASE     CFG_UBOOT_BASE
+#endif
+
+/*
+ *************************************************************************
+ *
+ * Jump vector table as in table 3.1 in [1]
+ *
+ *************************************************************************
+ */
+
+.globl _start
+_start: b      reset
+#ifndef CONFIG_NAND_SPL
+       ldr     pc, _undefined_instruction
+       ldr     pc, _software_interrupt
+       ldr     pc, _prefetch_abort
+       ldr     pc, _data_abort
+       ldr     pc, _not_used
+       ldr     pc, _irq
+       ldr     pc, _fiq
+
+_undefined_instruction:
+       .word undefined_instruction
+_software_interrupt:
+       .word software_interrupt
+_prefetch_abort:
+       .word prefetch_abort
+_data_abort:
+       .word data_abort
+_not_used:
+       .word not_used
+_irq:
+       .word irq
+_fiq:
+       .word fiq
+_pad:
+       .word 0x12345678 /* now 16*4=64 */
+#else
+       . = _start + 64
+#endif
+
+.global _end_vect
+_end_vect:
+       .balignl 16,0xdeadbeef
+/*
+ *************************************************************************
+ *
+ * Startup Code (reset vector)
+ *
+ * do important init only if we don't start from memory!
+ * setup Memory and board specific bits prior to relocation.
+ * relocate armboot to ram
+ * setup stack
+ *
+ *************************************************************************
+ */
+
+_TEXT_BASE:
+       .word   TEXT_BASE
+
+/*
+ * Below variable is very important because we use MMU in U-Boot.
+ * Without it, we cannot run code correctly before MMU is ON.
+ * by scsuh.
+ */
+_TEXT_PHY_BASE:
+       .word   CFG_PHY_UBOOT_BASE
+
+.globl _armboot_start
+_armboot_start:
+       .word _start
+
+/*
+ * These are defined in the board-specific linker script.
+ */
+.globl _bss_start
+_bss_start:
+       .word __bss_start
+
+.globl _bss_end
+_bss_end:
+       .word _end
+
+/*
+ * the actual reset code
+ */
+
+reset:
+       /*
+        * set the cpu to SVC32 mode
+        */
+       mrs     r0, cpsr
+       bic     r0, r0, #0x3f
+       orr     r0, r0, #0xd3
+       msr     cpsr, r0
+
+/*
+ *************************************************************************
+ *
+ * CPU_init_critical registers
+ *
+ * setup important registers
+ * setup memory timing
+ *
+ *************************************************************************
+ */
+       /*
+        * we do sys-critical inits only at reboot,
+        * not when booting from ram!
+        */
+cpu_init_crit:
+       /*
+        * When booting from NAND - it has definitely been a reset, so, no need
+        * to flush caches and disable the MMU
+        */
+#ifndef CONFIG_NAND_SPL
+       /*
+        * flush v4 I/D caches
+        */
+       mov     r0, #0
+       mcr     p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */
+       mcr     p15, 0, r0, c8, c7, 0   /* flush v4 TLB */
+
+       /*
+        * disable MMU stuff and caches
+        */
+       mrc     p15, 0, r0, c1, c0, 0
+       bic     r0, r0, #0x00002300     @ clear bits 13, 9:8 (--V- --RS)
+       bic     r0, r0, #0x00000087     @ clear bits 7, 2:0 (B--- -CAM)
+       orr     r0, r0, #0x00000002     @ set bit 2 (A) Align
+       orr     r0, r0, #0x00001000     @ set bit 12 (I) I-Cache
+       /* Prepare to disable the MMU */
+       adr     r1, mmu_disable_phys
+       /* We presume we're within the first 1024 bytes */
+       and     r1, r1, #0x3fc
+       ldr     r2, _TEXT_PHY_BASE
+       ldr     r3, =0xfff00000
+       and     r2, r2, r3
+       orr     r2, r2, r1
+       b       mmu_disable
+
+       .align 5
+       /* Run in a single cache-line */
+mmu_disable:
+       mcr     p15, 0, r0, c1, c0, 0
+       nop
+       nop
+       mov     pc, r2
+#endif
+
+mmu_disable_phys:
+       /* Peri port setup */
+       ldr     r0, =0x70000000
+       orr     r0, r0, #0x13
+       mcr     p15,0,r0,c15,c2,4       @ 256M (0x70000000 - 0x7fffffff)
+
+       /*
+        * Go setup Memory and board specific bits prior to relocation.
+        */
+       bl      lowlevel_init           /* go setup pll,mux,memory */
+
+after_copy:
+#ifdef CONFIG_ENABLE_MMU
+enable_mmu:
+       /* enable domain access */
+       ldr     r5, =0x0000ffff
+       mcr     p15, 0, r5, c3, c0, 0   /* load domain access register */
+
+       /* Set the TTB register */
+       ldr     r0, _mmu_table_base
+       ldr     r1, =CFG_PHY_UBOOT_BASE
+       ldr     r2, =0xfff00000
+       bic     r0, r0, r2
+       orr     r1, r0, r1
+       mcr     p15, 0, r1, c2, c0, 0
+
+       /* Enable the MMU */
+       mrc     p15, 0, r0, c1, c0, 0
+       orr     r0, r0, #1              /* Set CR_M to enable MMU */
+
+       /* Prepare to enable the MMU */
+       adr     r1, skip_hw_init
+       and     r1, r1, #0x3fc
+       ldr     r2, _TEXT_BASE
+       ldr     r3, =0xfff00000
+       and     r2, r2, r3
+       orr     r2, r2, r1
+       b       mmu_enable
+
+       .align 5
+       /* Run in a single cache-line */
+mmu_enable:
+
+       mcr     p15, 0, r0, c1, c0, 0
+       nop
+       nop
+       mov     pc, r2
+#endif
+
+skip_hw_init:
+       /* Set up the stack                                                 */
+stack_setup:
+#ifdef CONFIG_MEMORY_UPPER_CODE
+       ldr     sp, =(CFG_UBOOT_BASE + CFG_UBOOT_SIZE - 0xc)
+#else
+       ldr     r0, _TEXT_BASE          /* upper 128 KiB: relocated uboot   */
+       sub     r0, r0, #CFG_MALLOC_LEN /* malloc area                      */
+       sub     r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
+       sub     sp, r0, #12             /* leave 3 words for abort-stack    */
+
+#endif
+
+clear_bss:
+       ldr     r0, _bss_start          /* find start of bss segment        */
+       ldr     r1, _bss_end            /* stop here                        */
+       mov     r2, #0                  /* clear                            */
+
+clbss_l:
+       str     r2, [r0]                /* clear loop...                    */
+       add     r0, r0, #4
+       cmp     r0, r1
+       ble     clbss_l
+
+#ifndef CONFIG_NAND_SPL
+       ldr     pc, _start_armboot
+
+_start_armboot:
+       .word start_armboot
+#else
+       b       nand_boot
+/*     .word nand_boot*/
+#endif
+
+#ifdef CONFIG_ENABLE_MMU
+_mmu_table_base:
+       .word mmu_table
+#endif
+
+#ifndef CONFIG_NAND_SPL
+/*
+ * we assume that cache operation is done before. (eg. cleanup_before_linux())
+ * actually, we don't need to do anything about cache if not use d-cache in
+ * U-Boot. So, in this function we clean only MMU. by scsuh
+ *
+ * void        theLastJump(void *kernel, int arch_num, uint boot_params);
+ */
+#ifdef CONFIG_ENABLE_MMU
+       .globl theLastJump
+theLastJump:
+       mov     r9, r0
+       ldr     r3, =0xfff00000
+       ldr     r4, _TEXT_PHY_BASE
+       adr     r5, phy_last_jump
+       bic     r5, r5, r3
+       orr     r5, r5, r4
+       mov     pc, r5
+phy_last_jump:
+       /*
+        * disable MMU stuff
+        */
+       mrc     p15, 0, r0, c1, c0, 0
+       bic     r0, r0, #0x00002300     /* clear bits 13, 9:8 (--V- --RS) */
+       bic     r0, r0, #0x00000087     /* clear bits 7, 2:0 (B--- -CAM) */
+       orr     r0, r0, #0x00000002     /* set bit 2 (A) Align */
+       orr     r0, r0, #0x00001000     /* set bit 12 (I) I-Cache */
+       mcr     p15, 0, r0, c1, c0, 0
+
+       mcr     p15, 0, r0, c8, c7, 0   /* flush v4 TLB */
+
+       mov     r0, #0
+       mov     pc, r9
+#endif
+/*
+ *************************************************************************
+ *
+ * Interrupt handling
+ *
+ *************************************************************************
+ */
+@
+@ IRQ stack frame.
+@
+#define S_FRAME_SIZE   72
+
+#define S_OLD_R0       68
+#define S_PSR          64
+#define S_PC           60
+#define S_LR           56
+#define S_SP           52
+
+#define S_IP           48
+#define S_FP           44
+#define S_R10          40
+#define S_R9           36
+#define S_R8           32
+#define S_R7           28
+#define S_R6           24
+#define S_R5           20
+#define S_R4           16
+#define S_R3           12
+#define S_R2           8
+#define S_R1           4
+#define S_R0           0
+
+#define MODE_SVC 0x13
+#define I_BIT   0x80
+
+/*
+ * use bad_save_user_regs for abort/prefetch/undef/swi ...
+ */
+
+       .macro  bad_save_user_regs
+       /* carve out a frame on current user stack */
+       sub     sp, sp, #S_FRAME_SIZE
+       /* Save user registers (now in svc mode) r0-r12 */
+       stmia   sp, {r0 - r12}
+
+       ldr     r2, _armboot_start
+       sub     r2, r2, #(CFG_MALLOC_LEN)
+       /* set base 2 words into abort stack */
+       sub     r2, r2, #(CFG_GBL_DATA_SIZE+8)
+       /* get values for "aborted" pc and cpsr (into parm regs) */
+       ldmia   r2, {r2 - r3}
+       /* grab pointer to old stack */
+       add     r0, sp, #S_FRAME_SIZE
+
+       add     r5, sp, #S_SP
+       mov     r1, lr
+       /* save sp_SVC, lr_SVC, pc, cpsr */
+       stmia   r5, {r0 - r3}
+       /* save current stack into r0 (param register) */
+       mov     r0, sp
+       .endm
+
+       .macro get_bad_stack
+       /* setup our mode stack (enter in banked mode) */
+       ldr     r13, _armboot_start
+       /* move past malloc pool */
+       sub     r13, r13, #(CFG_MALLOC_LEN)
+       /* move to reserved a couple spots for abort stack */
+       sub     r13, r13, #(CFG_GBL_DATA_SIZE + 8)
+
+       /* save caller lr in position 0 of saved stack */
+       str     lr, [r13]
+       /* get the spsr */
+       mrs     lr, spsr
+       /* save spsr in position 1 of saved stack */
+       str     lr, [r13, #4]
+
+       /* prepare SVC-Mode */
+       mov     r13, #MODE_SVC
+       @ msr   spsr_c, r13
+       /* switch modes, make sure moves will execute */
+       msr     spsr, r13
+       /* capture return pc */
+       mov     lr, pc
+       /* jump to next instruction & switch modes. */
+       movs    pc, lr
+       .endm
+
+       .macro get_bad_stack_swi
+       /* space on current stack for scratch reg. */
+       sub     r13, r13, #4
+       /* save R0's value. */
+       str     r0, [r13]
+       /* get data regions start */
+       ldr     r0, _armboot_start
+       /* move past malloc pool */
+       sub     r0, r0, #(CFG_MALLOC_LEN)
+       /* move past gbl and a couple spots for abort stack */
+       sub     r0, r0, #(CFG_GBL_DATA_SIZE + 8)
+       /* save caller lr in position 0 of saved stack */
+       str     lr, [r0]
+       /* get the spsr */
+       mrs     r0, spsr
+       /* save spsr in position 1 of saved stack */
+       str     lr, [r0, #4]
+       /* restore r0 */
+       ldr     r0, [r13]
+       /* pop stack entry */
+       add     r13, r13, #4
+       .endm
+
+/*
+ * exception handlers
+ */
+       .align  5
+undefined_instruction:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_undefined_instruction
+
+       .align  5
+software_interrupt:
+       get_bad_stack_swi
+       bad_save_user_regs
+       bl      do_software_interrupt
+
+       .align  5
+prefetch_abort:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_prefetch_abort
+
+       .align  5
+data_abort:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_data_abort
+
+       .align  5
+not_used:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_not_used
+
+       .align  5
+irq:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_irq
+
+       .align  5
+fiq:
+       get_bad_stack
+       bad_save_user_regs
+       bl      do_fiq
+#endif /* CONFIG_NAND_SPL */
index 2aa9ef128b8e14ee79cc053ef4c3a4bab68fbbe6..59f039b7c3b5b2deecedb574ef0f7644a4a1df77 100644 (file)
@@ -38,9 +38,9 @@ int dp83848_is_phy_connected(int phy_addr)
 {
        u_int16_t       id1, id2;
 
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_PHYID1_REG, &id1))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_PHYID1_REG, &id1))
                return(0);
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_PHYID2_REG, &id2))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_PHYID2_REG, &id2))
                return(0);
 
        if ((id1 == DP83848_PHYID1_OUI) && (id2 == DP83848_PHYID2_OUI))
@@ -54,13 +54,13 @@ int dp83848_get_link_speed(int phy_addr)
        u_int16_t               tmp;
        volatile emac_regs*     emac = (emac_regs *)EMAC_BASE_ADDR;
 
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_STAT_REG, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_STAT_REG, &tmp))
                return(0);
 
        if (!(tmp & DP83848_LINK_STATUS))       /* link up? */
                return(0);
 
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_PHY_STAT_REG, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_PHY_STAT_REG, &tmp))
                return(0);
 
        /* Speed doesn't matter, there is no setting for it in EMAC... */
@@ -101,7 +101,7 @@ int dp83848_init_phy(int phy_addr)
        }
 
        /* Disable PHY Interrupts */
-       dm644x_eth_phy_write(phy_addr, DP83848_PHY_INTR_CTRL_REG, 0);
+       davinci_eth_phy_write(phy_addr, DP83848_PHY_INTR_CTRL_REG, 0);
 
        return(ret);
 }
@@ -112,13 +112,13 @@ int dp83848_auto_negotiate(int phy_addr)
        u_int16_t       tmp;
 
 
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_CTL_REG, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_CTL_REG, &tmp))
                return(0);
 
        /* Restart Auto_negotiation  */
        tmp &= ~DP83848_AUTONEG;        /* remove autonegotiation enable */
        tmp |= DP83848_ISOLATE;         /* Electrically isolate PHY */
-       dm644x_eth_phy_write(phy_addr, DP83848_CTL_REG, tmp);
+       davinci_eth_phy_write(phy_addr, DP83848_CTL_REG, tmp);
 
        /* Set the Auto_negotiation Advertisement Register
         * MII advertising for Next page, 100BaseTxFD and HD,
@@ -126,23 +126,23 @@ int dp83848_auto_negotiate(int phy_addr)
         */
        tmp = DP83848_NP | DP83848_TX_FDX | DP83848_TX_HDX |
                DP83848_10_FDX | DP83848_10_HDX | DP83848_AN_IEEE_802_3;
-       dm644x_eth_phy_write(phy_addr, DP83848_ANA_REG, tmp);
+       davinci_eth_phy_write(phy_addr, DP83848_ANA_REG, tmp);
 
 
        /* Read Control Register */
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_CTL_REG, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_CTL_REG, &tmp))
                return(0);
 
        tmp |= DP83848_SPEED_SELECT | DP83848_AUTONEG | DP83848_DUPLEX_MODE;
-       dm644x_eth_phy_write(phy_addr, DP83848_CTL_REG, tmp);
+       davinci_eth_phy_write(phy_addr, DP83848_CTL_REG, tmp);
 
        /* Restart Auto_negotiation  */
        tmp |= DP83848_RESTART_AUTONEG;
-       dm644x_eth_phy_write(phy_addr, DP83848_CTL_REG, tmp);
+       davinci_eth_phy_write(phy_addr, DP83848_CTL_REG, tmp);
 
        /*check AutoNegotiate complete */
        udelay(10000);
-       if (!dm644x_eth_phy_read(phy_addr, DP83848_STAT_REG, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, DP83848_STAT_REG, &tmp))
                return(0);
 
        if (!(tmp & DP83848_AUTONEG_COMP))
index 5ae035b986b492d17c983444f8cfaebdeffb826a..f6f81df6cafa3f70f98956ac7b34c63b6142d163 100644 (file)
@@ -50,12 +50,12 @@ unsigned int        emac_dbg = 0;
 #define debug_emac(fmt,args...)        if (emac_dbg) printf(fmt,##args)
 
 /* Internal static functions */
-static int dm644x_eth_hw_init (void);
-static int dm644x_eth_open (void);
-static int dm644x_eth_close (void);
-static int dm644x_eth_send_packet (volatile void *packet, int length);
-static int dm644x_eth_rcv_packet (void);
-static void dm644x_eth_mdio_enable(void);
+static int davinci_eth_hw_init (void);
+static int davinci_eth_open (void);
+static int davinci_eth_close (void);
+static int davinci_eth_send_packet (volatile void *packet, int length);
+static int davinci_eth_rcv_packet (void);
+static void davinci_eth_mdio_enable(void);
 
 static int gen_init_phy(int phy_addr);
 static int gen_is_phy_connected(int phy_addr);
@@ -65,48 +65,48 @@ static int gen_auto_negotiate(int phy_addr);
 /* Wrappers exported to the U-Boot proper */
 int eth_hw_init(void)
 {
-       return(dm644x_eth_hw_init());
+       return(davinci_eth_hw_init());
 }
 
 int eth_init(bd_t * bd)
 {
-       return(dm644x_eth_open());
+       return(davinci_eth_open());
 }
 
 void eth_halt(void)
 {
-       dm644x_eth_close();
+       davinci_eth_close();
 }
 
 int eth_send(volatile void *packet, int length)
 {
-       return(dm644x_eth_send_packet(packet, length));
+       return(davinci_eth_send_packet(packet, length));
 }
 
 int eth_rx(void)
 {
-       return(dm644x_eth_rcv_packet());
+       return(davinci_eth_rcv_packet());
 }
 
 void eth_mdio_enable(void)
 {
-       dm644x_eth_mdio_enable();
+       davinci_eth_mdio_enable();
 }
 /* End of wrappers */
 
 
-static u_int8_t dm644x_eth_mac_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+static u_int8_t davinci_eth_mac_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
 /*
  * This function must be called before emac_open() if you want to override
  * the default mac address.
  */
-void dm644x_eth_set_mac_addr(const u_int8_t *addr)
+void davinci_eth_set_mac_addr(const u_int8_t *addr)
 {
        int i;
 
-       for (i = 0; i < sizeof (dm644x_eth_mac_addr); i++) {
-               dm644x_eth_mac_addr[i] = addr[i];
+       for (i = 0; i < sizeof (davinci_eth_mac_addr); i++) {
+               davinci_eth_mac_addr[i] = addr[i];
        }
 }
 
@@ -130,7 +130,7 @@ static volatile u_int8_t    active_phy_addr = 0xff;
 
 phy_t                          phy;
 
-static void dm644x_eth_mdio_enable(void)
+static void davinci_eth_mdio_enable(void)
 {
        u_int32_t       clkdiv;
 
@@ -149,7 +149,7 @@ static void dm644x_eth_mdio_enable(void)
  * If no active PHY (or more than one PHY) found returns 0.
  * Sets active_phy_addr variable.
  */
-static int dm644x_eth_phy_detect(void)
+static int davinci_eth_phy_detect(void)
 {
        u_int32_t       phy_act_state;
        int             i;
@@ -159,7 +159,7 @@ static int dm644x_eth_phy_detect(void)
        if ((phy_act_state = adap_mdio->ALIVE) == 0)
                return(0);                              /* No active PHYs */
 
-       debug_emac("dm644x_eth_phy_detect(), ALIVE = 0x%08x\n", phy_act_state);
+       debug_emac("davinci_eth_phy_detect(), ALIVE = 0x%08x\n", phy_act_state);
 
        for (i = 0; i < 32; i++) {
                if (phy_act_state & (1 << i)) {
@@ -177,7 +177,7 @@ static int dm644x_eth_phy_detect(void)
 
 
 /* Read a PHY register via MDIO inteface. Returns 1 on success, 0 otherwise */
-int dm644x_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data)
+int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data)
 {
        int     tmp;
 
@@ -201,7 +201,7 @@ int dm644x_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data)
 }
 
 /* Write to a PHY register via MDIO inteface. Blocks until operation is complete. */
-int dm644x_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data)
+int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data)
 {
 
        while (adap_mdio->USERACCESS0 & MDIO_USERACCESS0_GO) {;}
@@ -235,14 +235,14 @@ static int gen_is_phy_connected(int phy_addr)
 {
        u_int16_t       dummy;
 
-       return(dm644x_eth_phy_read(phy_addr, PHY_PHYIDR1, &dummy));
+       return(davinci_eth_phy_read(phy_addr, PHY_PHYIDR1, &dummy));
 }
 
 static int gen_get_link_speed(int phy_addr)
 {
        u_int16_t       tmp;
 
-       if (dm644x_eth_phy_read(phy_addr, MII_STATUS_REG, &tmp) && (tmp & 0x04))
+       if (davinci_eth_phy_read(phy_addr, MII_STATUS_REG, &tmp) && (tmp & 0x04))
                return(1);
 
        return(0);
@@ -252,16 +252,16 @@ static int gen_auto_negotiate(int phy_addr)
 {
        u_int16_t       tmp;
 
-       if (!dm644x_eth_phy_read(phy_addr, PHY_BMCR, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, PHY_BMCR, &tmp))
                return(0);
 
        /* Restart Auto_negotiation  */
        tmp |= PHY_BMCR_AUTON;
-       dm644x_eth_phy_write(phy_addr, PHY_BMCR, tmp);
+       davinci_eth_phy_write(phy_addr, PHY_BMCR, tmp);
 
        /*check AutoNegotiate complete */
        udelay (10000);
-       if (!dm644x_eth_phy_read(phy_addr, PHY_BMSR, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, PHY_BMSR, &tmp))
                return(0);
 
        if (!(tmp & PHY_BMSR_AUTN_COMP))
@@ -273,19 +273,19 @@ static int gen_auto_negotiate(int phy_addr)
 
 
 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
-static int dm644x_mii_phy_read(char *devname, unsigned char addr, unsigned char reg, unsigned short *value)
+static int davinci_mii_phy_read(char *devname, unsigned char addr, unsigned char reg, unsigned short *value)
 {
-       return(dm644x_eth_phy_read(addr, reg, value) ? 0 : 1);
+       return(davinci_eth_phy_read(addr, reg, value) ? 0 : 1);
 }
 
-static int dm644x_mii_phy_write(char *devname, unsigned char addr, unsigned char reg, unsigned short value)
+static int davinci_mii_phy_write(char *devname, unsigned char addr, unsigned char reg, unsigned short value)
 {
-       return(dm644x_eth_phy_write(addr, reg, value) ? 0 : 1);
+       return(davinci_eth_phy_write(addr, reg, value) ? 0 : 1);
 }
 
-int dm644x_eth_miiphy_initialize(bd_t *bis)
+int davinci_eth_miiphy_initialize(bd_t *bis)
 {
-       miiphy_register(phy.name, dm644x_mii_phy_read, dm644x_mii_phy_write);
+       miiphy_register(phy.name, davinci_mii_phy_read, davinci_mii_phy_write);
 
        return(1);
 }
@@ -296,13 +296,13 @@ int dm644x_eth_miiphy_initialize(bd_t *bis)
  * EMAC modules power or pin multiplexors, that is done by board_init()
  * much earlier in bootup process. Returns 1 on success, 0 otherwise.
  */
-static int dm644x_eth_hw_init(void)
+static int davinci_eth_hw_init(void)
 {
        u_int32_t       phy_id;
        u_int16_t       tmp;
        int             i;
 
-       dm644x_eth_mdio_enable();
+       davinci_eth_mdio_enable();
 
        for (i = 0; i < 256; i++) {
                if (adap_mdio->ALIVE)
@@ -316,18 +316,18 @@ static int dm644x_eth_hw_init(void)
        }
 
        /* Find if a PHY is connected and get it's address */
-       if (!dm644x_eth_phy_detect())
+       if (!davinci_eth_phy_detect())
                return(0);
 
        /* Get PHY ID and initialize phy_ops for a detected PHY */
-       if (!dm644x_eth_phy_read(active_phy_addr, PHY_PHYIDR1, &tmp)) {
+       if (!davinci_eth_phy_read(active_phy_addr, PHY_PHYIDR1, &tmp)) {
                active_phy_addr = 0xff;
                return(0);
        }
 
        phy_id = (tmp << 16) & 0xffff0000;
 
-       if (!dm644x_eth_phy_read(active_phy_addr, PHY_PHYIDR2, &tmp)) {
+       if (!davinci_eth_phy_read(active_phy_addr, PHY_PHYIDR2, &tmp)) {
                active_phy_addr = 0xff;
                return(0);
        }
@@ -364,7 +364,7 @@ static int dm644x_eth_hw_init(void)
 
 
 /* Eth device open */
-static int dm644x_eth_open(void)
+static int davinci_eth_open(void)
 {
        dv_reg_p                addr;
        u_int32_t               clkdiv, cnt;
@@ -389,26 +389,26 @@ static int dm644x_eth_open(void)
        /* Using channel 0 only - other channels are disabled */
        adap_emac->MACINDEX = 0;
        adap_emac->MACADDRHI =
-               (dm644x_eth_mac_addr[3] << 24) |
-               (dm644x_eth_mac_addr[2] << 16) |
-               (dm644x_eth_mac_addr[1] << 8)  |
-               (dm644x_eth_mac_addr[0]);
+               (davinci_eth_mac_addr[3] << 24) |
+               (davinci_eth_mac_addr[2] << 16) |
+               (davinci_eth_mac_addr[1] << 8)  |
+               (davinci_eth_mac_addr[0]);
        adap_emac->MACADDRLO =
-               (dm644x_eth_mac_addr[5] << 8) |
-               (dm644x_eth_mac_addr[4]);
+               (davinci_eth_mac_addr[5] << 8) |
+               (davinci_eth_mac_addr[4]);
 
        adap_emac->MACHASH1 = 0;
        adap_emac->MACHASH2 = 0;
 
        /* Set source MAC address - REQUIRED */
        adap_emac->MACSRCADDRHI =
-               (dm644x_eth_mac_addr[3] << 24) |
-               (dm644x_eth_mac_addr[2] << 16) |
-               (dm644x_eth_mac_addr[1] << 8)  |
-               (dm644x_eth_mac_addr[0]);
+               (davinci_eth_mac_addr[3] << 24) |
+               (davinci_eth_mac_addr[2] << 16) |
+               (davinci_eth_mac_addr[1] << 8)  |
+               (davinci_eth_mac_addr[0]);
        adap_emac->MACSRCADDRLO =
-               (dm644x_eth_mac_addr[4] << 8) |
-               (dm644x_eth_mac_addr[5]);
+               (davinci_eth_mac_addr[4] << 8) |
+               (davinci_eth_mac_addr[5]);
 
        /* Set DMA 8 TX / 8 RX Head pointers to 0 */
        addr = &adap_emac->TX0HDP;
@@ -473,7 +473,7 @@ static int dm644x_eth_open(void)
 }
 
 /* EMAC Channel Teardown */
-static void dm644x_eth_ch_teardown(int ch)
+static void davinci_eth_ch_teardown(int ch)
 {
        dv_reg          dly = 0xff;
        dv_reg          cnt;
@@ -516,12 +516,12 @@ static void dm644x_eth_ch_teardown(int ch)
 }
 
 /* Eth device close */
-static int dm644x_eth_close(void)
+static int davinci_eth_close(void)
 {
        debug_emac("+ emac_close\n");
 
-       dm644x_eth_ch_teardown(EMAC_CH_TX);     /* TX Channel teardown */
-       dm644x_eth_ch_teardown(EMAC_CH_RX);     /* RX Channel teardown */
+       davinci_eth_ch_teardown(EMAC_CH_TX);    /* TX Channel teardown */
+       davinci_eth_ch_teardown(EMAC_CH_RX);    /* RX Channel teardown */
 
        /* Reset EMAC module and disable interrupts in wrapper */
        adap_emac->SOFTRESET = 1;
@@ -537,7 +537,7 @@ static int tx_send_loop = 0;
  * This function sends a single packet on the network and returns
  * positive number (number of bytes transmitted) or negative for error
  */
-static int dm644x_eth_send_packet (volatile void *packet, int length)
+static int davinci_eth_send_packet (volatile void *packet, int length)
 {
        int ret_status = -1;
 
@@ -568,7 +568,7 @@ static int dm644x_eth_send_packet (volatile void *packet, int length)
        /* Wait for packet to complete or link down */
        while (1) {
                if (!phy.get_link_speed (active_phy_addr)) {
-                       dm644x_eth_ch_teardown (EMAC_CH_TX);
+                       davinci_eth_ch_teardown (EMAC_CH_TX);
                        return (ret_status);
                }
                if (adap_emac->TXINTSTATRAW & 0x01) {
@@ -584,7 +584,7 @@ static int dm644x_eth_send_packet (volatile void *packet, int length)
 /*
  * This function handles receipt of a packet from the network
  */
-static int dm644x_eth_rcv_packet (void)
+static int davinci_eth_rcv_packet (void)
 {
        volatile emac_desc *rx_curr_desc;
        volatile emac_desc *curr_desc;
index 8130b48de023af27bdcacaa6ed3d0cf5fb5cbcea..ce3e41c5517f2a94d9b0a993020e2e16ddf491df 100644 (file)
@@ -39,9 +39,9 @@ int lxt972_is_phy_connected(int phy_addr)
 {
        u_int16_t id1, id2;
 
-       if (!dm644x_eth_phy_read(phy_addr, PHY_PHYIDR1, &id1))
+       if (!davinci_eth_phy_read(phy_addr, PHY_PHYIDR1, &id1))
                return(0);
-       if (!dm644x_eth_phy_read(phy_addr, PHY_PHYIDR2, &id2))
+       if (!davinci_eth_phy_read(phy_addr, PHY_PHYIDR2, &id2))
                return(0);
 
        if ((id1 == (0x0013)) && ((id2  & 0xfff0) == 0x78e0))
@@ -55,20 +55,20 @@ 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))
+       if (!davinci_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))
+       if (!davinci_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);
+       davinci_eth_phy_write(phy_addr, PHY_LXT971_DIG_CFG, tmp);
        /* Read back */
-       if (!dm644x_eth_phy_read(phy_addr, PHY_LXT971_DIG_CFG, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, PHY_LXT971_DIG_CFG, &tmp))
                return(0);
 
        /* Speed doesn't matter, there is no setting for it in EMAC... */
@@ -95,7 +95,7 @@ int lxt972_init_phy(int phy_addr)
        }
 
        /* Disable PHY Interrupts */
-       dm644x_eth_phy_write(phy_addr, PHY_LXT971_INT_ENABLE, 0);
+       davinci_eth_phy_write(phy_addr, PHY_LXT971_INT_ENABLE, 0);
 
        return(ret);
 }
@@ -105,16 +105,16 @@ int lxt972_auto_negotiate(int phy_addr)
 {
        u_int16_t tmp;
 
-       if (!dm644x_eth_phy_read(phy_addr, PHY_BMCR, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, PHY_BMCR, &tmp))
                return(0);
 
        /* Restart Auto_negotiation  */
        tmp |= PHY_BMCR_RST_NEG;
-       dm644x_eth_phy_write(phy_addr, PHY_BMCR, tmp);
+       davinci_eth_phy_write(phy_addr, PHY_BMCR, tmp);
 
        /*check AutoNegotiate complete */
        udelay (10000);
-       if (!dm644x_eth_phy_read(phy_addr, PHY_BMSR, &tmp))
+       if (!davinci_eth_phy_read(phy_addr, PHY_BMSR, &tmp))
                return(0);
 
        if (!(tmp & PHY_BMSR_AUTN_COMP))
index 78c946f2583a68cdc196849228a4218c02a33c07..0baf9bcd997d29fee07788cf37b5bb966d736417 100644 (file)
@@ -116,5 +116,9 @@ int get_clocks(void)
                gd->bus_clk = gd->flb_clk;
        }
 
+#ifdef CONFIG_FSL_I2C
+       gd->i2c1_clk = gd->bus_clk;
+#endif
+
        return (0);
 }
index 55c9cd356d1525e3dd4077e6538376d568371993..8ab5b8ed8ba51ad7b8c9d915187a200538a3d64a 100644 (file)
@@ -110,8 +110,8 @@ void cpu_init_f(void)
 #endif
 
 #ifdef CONFIG_FSL_I2C
-       gpio->par_feci2c &= ~(GPIO_PAR_FECI2C_SCL_MASK | GPIO_PAR_FECI2C_SDA_MASK);
-       gpio->par_feci2c |= (GPIO_PAR_FECI2C_SCL_I2CSCL | GPIO_PAR_FECI2C_SDA_I2CSDA);
+       CFG_I2C_PINMUX_REG &= CFG_I2C_PINMUX_CLR;
+       CFG_I2C_PINMUX_REG |= CFG_I2C_PINMUX_SET;
 #endif
 
        icache_enable();
index 247d3188bb200b143d0bd4dccc2043b2d0317f71..1bda2d482e6572695df033dbe33a206276fe9dd7 100644 (file)
@@ -45,5 +45,9 @@ int get_clocks(void)
        gd->bus_clk = CFG_CLK;
        gd->cpu_clk = (gd->bus_clk * 2);
 
+#ifdef CONFIG_FSL_I2C
+       gd->i2c1_clk = gd->bus_clk;
+#endif
+
        return (0);
 }
index 3cacb55f779f69fd05cd9f706ba96c8cfeffc9ec..68aefe9151b3032eaa851caf39875503a75d9e96 100644 (file)
@@ -80,6 +80,15 @@ void cpu_init_f(void)
        mbar_writeShort(MCFSIM_CSCR0, CFG_CSCR0);
        mbar_writeLong(MCFSIM_CSMR0, CFG_CSMR0);
 
+#ifdef CONFIG_FSL_I2C
+       CFG_I2C_PINMUX_REG = CFG_I2C_PINMUX_REG & CFG_I2C_PINMUX_CLR;
+       CFG_I2C_PINMUX_REG |= CFG_I2C_PINMUX_SET;
+#ifdef CFG_I2C2_OFFSET
+       CFG_I2C2_PINMUX_REG &= CFG_I2C2_PINMUX_CLR;
+       CFG_I2C2_PINMUX_REG |= CFG_I2C2_PINMUX_SET;
+#endif
+#endif
+
        /* enable instruction cache now */
        icache_enable();
 }
@@ -322,7 +331,8 @@ void cpu_init_f(void)
 #endif                         /* #ifndef CONFIG_MONITOR_IS_IN_RAM */
 
 #ifdef CONFIG_FSL_I2C
-       gpio_reg->par_feci2c = 0x000F;
+       CFG_I2C_PINMUX_REG &= CFG_I2C_PINMUX_CLR;
+       CFG_I2C_PINMUX_REG |= CFG_I2C_PINMUX_SET;
 #endif
 
        /* enable instruction cache now */
index f6edd5b6fa81fa2bdaa6946bfc34567f91ecb1fc..4cb8f9300d9c8e97435e052cc7762781b9036deb 100644 (file)
@@ -82,5 +82,13 @@ int get_clocks (void)
 #else
        gd->bus_clk = gd->cpu_clk;
 #endif
+
+#ifdef CONFIG_FSL_I2C
+       gd->i2c1_clk = gd->bus_clk;
+#ifdef CFG_I2C2_OFFSET
+       gd->i2c2_clk = gd->bus_clk;
+#endif
+#endif
+
        return (0);
 }
index 001b9f42d64f3bf2e6f8fd03e30d0e914b1ca8f6..a11e425cab982d780dbc61390d68a1c9ce71e62f 100644 (file)
@@ -212,5 +212,10 @@ int get_clocks(void)
 {
        gd->bus_clk = clock_pll(CFG_CLK / 1000, 0) * 1000;
        gd->cpu_clk = (gd->bus_clk * 3);
+
+#ifdef CONFIG_FSL_I2C
+       gd->i2c1_clk = gd->bus_clk;
+#endif
+
        return (0);
 }
index f677f3ced0d007d9cb2deec0ad4407decbf0ede5..6711a1d7c89479b4e5030aea46ad417842c4084e 100644 (file)
@@ -209,5 +209,9 @@ int get_clocks(void)
 #endif
        }
 
+#ifdef CONFIG_FSL_I2C
+       gd->i2c1_clk = gd->bus_clk;
+#endif
+
        return (0);
 }
index 389e7c99f5252f29dcc0f2a2bc5541ab1e26cb48..28fe65729812e36c217c036250ff171fa99fe0ad 100644 (file)
@@ -39,5 +39,10 @@ int get_clocks(void)
 
        gd->bus_clk = CFG_CLK;
        gd->cpu_clk = (gd->bus_clk * 2);
+
+#ifdef CONFIG_FSL_I2C
+       gd->i2c1_clk = gd->bus_clk;
+#endif
+
        return (0);
 }
index 8ba8ae875dd94a0a46b2a7ca0bb82fd3d6950f08..e8f106074850e865e320bc638b8d3dc78613cd2d 100644 (file)
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(CPU).a
 
 START  = start.o
-COBJS  = traps.o cpu.o cpu_init.o speed.o interrupts.o serial.o fec.o i2c.o iopin.o
+COBJS  = traps.o cpu.o cpu_init.o speed.o interrupts.o serial.o i2c.o iopin.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
diff --git a/cpu/mpc512x/fec.c b/cpu/mpc512x/fec.c
deleted file mode 100644 (file)
index e9df7de..0000000
+++ /dev/null
@@ -1,794 +0,0 @@
-/*
- * (C) Copyright 2003-2007
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * Derived from the MPC8xx FEC driver.
- * Adapted for MPC512x by Grzegorz Bernacki <gjb@semihalf.com>
- */
-
-#include <common.h>
-#include <mpc512x.h>
-#include <malloc.h>
-#include <net.h>
-#include <miiphy.h>
-#include "fec.h"
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#define DEBUG 0
-
-#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \
-       defined(CONFIG_MPC512x_FEC)
-
-#if !(defined(CONFIG_MII) || defined(CONFIG_CMD_MII))
-#error "CONFIG_MII has to be defined!"
-#endif
-
-#if (DEBUG & 0x40)
-static uint32 local_crc32(char *string, unsigned int crc_value, int len);
-#endif
-
-int fec512x_miiphy_read(char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal);
-int fec512x_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data);
-int mpc512x_fec_init_phy(struct eth_device *dev, bd_t * bis);
-
-static uchar rx_buff[FEC_BUFFER_SIZE];
-static int rx_buff_idx = 0;
-
-/********************************************************************/
-#if (DEBUG & 0x2)
-static void mpc512x_fec_phydump (char *devname)
-{
-       uint16 phyStatus, i;
-       uint8 phyAddr = CONFIG_PHY_ADDR;
-       uint8 reg_mask[] = {
-               /* regs to print: 0...8, 21,27,31 */
-               1, 1, 1, 1,  1, 1, 1, 1,     1, 0, 0, 0,  0, 0, 0, 0,
-               0, 0, 0, 0,  0, 1, 0, 0,     0, 0, 0, 1,  0, 0, 0, 1,
-       };
-
-       for (i = 0; i < 32; i++) {
-               if (reg_mask[i]) {
-                       miiphy_read (devname, phyAddr, i, &phyStatus);
-                       printf ("Mii reg %d: 0x%04x\n", i, phyStatus);
-               }
-       }
-}
-#endif
-
-/********************************************************************/
-static int mpc512x_fec_bd_init (mpc512x_fec_priv *fec)
-{
-       int ix;
-
-       /*
-        * Receive BDs init
-        */
-       for (ix = 0; ix < FEC_RBD_NUM; ix++) {
-               fec->bdBase->rbd[ix].dataPointer = (uint32)&fec->bdBase->recv_frames[ix];
-               fec->bdBase->rbd[ix].status = FEC_RBD_EMPTY;
-               fec->bdBase->rbd[ix].dataLength = 0;
-       }
-
-       /*
-        * have the last RBD to close the ring
-        */
-       fec->bdBase->rbd[ix - 1].status |= FEC_RBD_WRAP;
-       fec->rbdIndex = 0;
-
-       /*
-        * Trasmit BDs init
-        */
-       for (ix = 0; ix < FEC_TBD_NUM; ix++) {
-               fec->bdBase->tbd[ix].status = 0;
-       }
-
-       /*
-        * Have the last TBD to close the ring
-        */
-       fec->bdBase->tbd[ix - 1].status |= FEC_TBD_WRAP;
-
-       /*
-        * Initialize some indices
-        */
-       fec->tbdIndex = 0;
-       fec->usedTbdIndex = 0;
-       fec->cleanTbdNum = FEC_TBD_NUM;
-
-       return 0;
-}
-
-/********************************************************************/
-static void mpc512x_fec_rbd_clean (mpc512x_fec_priv *fec, volatile FEC_RBD * pRbd)
-{
-       /*
-        * Reset buffer descriptor as empty
-        */
-       if ((fec->rbdIndex) == (FEC_RBD_NUM - 1))
-               pRbd->status = (FEC_RBD_WRAP | FEC_RBD_EMPTY);
-       else
-               pRbd->status = FEC_RBD_EMPTY;
-
-       pRbd->dataLength = 0;
-
-       /*
-        * Increment BD count
-        */
-       fec->rbdIndex = (fec->rbdIndex + 1) % FEC_RBD_NUM;
-
-       /*
-        * Now, we have an empty RxBD, notify FEC
-        */
-       fec->eth->r_des_active = 0x01000000;    /* Descriptor polling active */
-}
-
-/********************************************************************/
-static void mpc512x_fec_tbd_scrub (mpc512x_fec_priv *fec)
-{
-       volatile FEC_TBD *pUsedTbd;
-
-#if (DEBUG & 0x1)
-       printf ("tbd_scrub: fec->cleanTbdNum = %d, fec->usedTbdIndex = %d\n",
-               fec->cleanTbdNum, fec->usedTbdIndex);
-#endif
-
-       /*
-        * process all the consumed TBDs
-        */
-       while (fec->cleanTbdNum < FEC_TBD_NUM) {
-               pUsedTbd = &fec->bdBase->tbd[fec->usedTbdIndex];
-               if (pUsedTbd->status & FEC_TBD_READY) {
-#if (DEBUG & 0x20)
-                       printf ("Cannot clean TBD %d, in use\n", fec->usedTbdIndex);
-#endif
-                       return;
-               }
-
-               /*
-                * clean this buffer descriptor
-                */
-               if (fec->usedTbdIndex == (FEC_TBD_NUM - 1))
-                       pUsedTbd->status = FEC_TBD_WRAP;
-               else
-                       pUsedTbd->status = 0;
-
-               /*
-                * update some indeces for a correct handling of the TBD ring
-                */
-               fec->cleanTbdNum++;
-               fec->usedTbdIndex = (fec->usedTbdIndex + 1) % FEC_TBD_NUM;
-       }
-}
-
-/********************************************************************/
-static void mpc512x_fec_set_hwaddr (mpc512x_fec_priv *fec, char *mac)
-{
-       uint8 currByte;                 /* byte for which to compute the CRC */
-       int byte;                       /* loop - counter */
-       int bit;                        /* loop - counter */
-       uint32 crc = 0xffffffff;        /* initial value */
-
-       /*
-        * The algorithm used is the following:
-        * we loop on each of the six bytes of the provided address,
-        * and we compute the CRC by left-shifting the previous
-        * value by one position, so that each bit in the current
-        * byte of the address may contribute the calculation. If
-        * the latter and the MSB in the CRC are different, then
-        * the CRC value so computed is also ex-ored with the
-        * "polynomium generator". The current byte of the address
-        * is also shifted right by one bit at each iteration.
-        * This is because the CRC generatore in hardware is implemented
-        * as a shift-register with as many ex-ores as the radixes
-        * in the polynomium. This suggests that we represent the
-        * polynomiumm itself as a 32-bit constant.
-        */
-       for (byte = 0; byte < 6; byte++) {
-               currByte = mac[byte];
-               for (bit = 0; bit < 8; bit++) {
-                       if ((currByte & 0x01) ^ (crc & 0x01)) {
-                               crc >>= 1;
-                               crc = crc ^ 0xedb88320;
-                       } else {
-                               crc >>= 1;
-                       }
-                       currByte >>= 1;
-               }
-       }
-
-       crc = crc >> 26;
-
-       /*
-        * Set individual hash table register
-        */
-       if (crc >= 32) {
-               fec->eth->iaddr1 = (1 << (crc - 32));
-               fec->eth->iaddr2 = 0;
-       } else {
-               fec->eth->iaddr1 = 0;
-               fec->eth->iaddr2 = (1 << crc);
-       }
-
-       /*
-        * Set physical address
-        */
-       fec->eth->paddr1 = (mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3];
-       fec->eth->paddr2 = (mac[4] << 24) + (mac[5] << 16) + 0x8808;
-}
-
-/********************************************************************/
-static int mpc512x_fec_init (struct eth_device *dev, bd_t * bis)
-{
-       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
-
-#if (DEBUG & 0x1)
-       printf ("mpc512x_fec_init... Begin\n");
-#endif
-
-       /* Set interrupt mask register */
-       fec->eth->imask = 0x00000000;
-
-       /* Clear FEC-Lite interrupt event register(IEVENT) */
-       fec->eth->ievent = 0xffffffff;
-
-       /* Set transmit fifo watermark register(X_WMRK), default = 64 */
-       fec->eth->x_wmrk = 0x0;
-
-       /* Set Opcode/Pause Duration Register */
-       fec->eth->op_pause = 0x00010020;
-
-       /* Frame length=1522; MII mode */
-       fec->eth->r_cntrl = (FEC_MAX_FRAME_LEN << 16) | 0x24;
-
-       /* Half-duplex, heartbeat disabled */
-       fec->eth->x_cntrl = 0x00000000;
-
-       /* Enable MIB counters */
-       fec->eth->mib_control = 0x0;
-
-       /* Setup recv fifo start and buff size */
-       fec->eth->r_fstart = 0x500;
-       fec->eth->r_buff_size = FEC_BUFFER_SIZE;
-
-       /* Setup BD base addresses */
-       fec->eth->r_des_start = (uint32)fec->bdBase->rbd;
-       fec->eth->x_des_start = (uint32)fec->bdBase->tbd;
-
-       /* DMA Control */
-       fec->eth->dma_control = 0xc0000000;
-
-       /* Enable FEC */
-       fec->eth->ecntrl |= 0x00000006;
-
-       /* Initilize addresses and status words of BDs */
-       mpc512x_fec_bd_init (fec);
-
-        /* Descriptor polling active */
-       fec->eth->r_des_active = 0x01000000;
-
-#if (DEBUG & 0x1)
-       printf("mpc512x_fec_init... Done \n");
-#endif
-       return 1;
-}
-
-/********************************************************************/
-int mpc512x_fec_init_phy (struct eth_device *dev, bd_t * bis)
-{
-       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
-       const uint8 phyAddr = CONFIG_PHY_ADDR;  /* Only one PHY */
-       int timeout = 1;
-       uint16 phyStatus;
-
-#if (DEBUG & 0x1)
-       printf ("mpc512x_fec_init_phy... Begin\n");
-#endif
-
-       /*
-        * Clear FEC-Lite interrupt event register(IEVENT)
-        */
-       fec->eth->ievent = 0xffffffff;
-
-       /*
-        * Set interrupt mask register
-        */
-       fec->eth->imask = 0x00000000;
-
-       if (fec->xcv_type != SEVENWIRE) {
-               /*
-                * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
-                * and do not drop the Preamble.
-                */
-               fec->eth->mii_speed = (((gd->ips_clk / 1000000) / 5) + 1) << 1;
-
-               /*
-                * Reset PHY, then delay 300ns
-                */
-               miiphy_write (dev->name, phyAddr, 0x0, 0x8000);
-               udelay (1000);
-
-               if (fec->xcv_type == MII10) {
-               /*
-                * Force 10Base-T, FDX operation
-                */
-#if (DEBUG & 0x2)
-                       printf ("Forcing 10 Mbps ethernet link... ");
-#endif
-                       miiphy_read (dev->name, phyAddr, 0x1, &phyStatus);
-
-                       miiphy_write (dev->name, phyAddr, 0x0, 0x0180);
-
-                       timeout = 20;
-                       do {    /* wait for link status to go down */
-                               udelay (10000);
-                               if ((timeout--) == 0) {
-#if (DEBUG & 0x2)
-                                       printf ("hmmm, should not have waited...");
-#endif
-                                       break;
-                               }
-                               miiphy_read (dev->name, phyAddr, 0x1, &phyStatus);
-#if (DEBUG & 0x2)
-                               printf ("=");
-#endif
-                       } while ((phyStatus & 0x0004)); /* !link up */
-
-                       timeout = 1000;
-                       do {    /* wait for link status to come back up */
-                               udelay (10000);
-                               if ((timeout--) == 0) {
-                                       printf ("failed. Link is down.\n");
-                                       break;
-                               }
-                               miiphy_read (dev->name, phyAddr, 0x1, &phyStatus);
-#if (DEBUG & 0x2)
-                               printf ("+");
-#endif
-                       } while (!(phyStatus & 0x0004)); /* !link up */
-
-#if (DEBUG & 0x2)
-                       printf ("done.\n");
-#endif
-               } else {        /* MII100 */
-                       /*
-                        * Set the auto-negotiation advertisement register bits
-                        */
-                       miiphy_write (dev->name, phyAddr, 0x4, 0x01e1);
-
-                       /*
-                        * Set MDIO bit 0.12 = 1(&& bit 0.9=1?) to enable auto-negotiation
-                        */
-                       miiphy_write (dev->name, phyAddr, 0x0, 0x1200);
-
-                       /*
-                        * Wait for AN completion
-                        */
-                       timeout = 50000;
-                       do {
-                               udelay (1000);
-
-                               if ((timeout--) == 0) {
-#if (DEBUG & 0x2)
-                                       printf ("PHY auto neg 0 failed...\n");
-#endif
-                                       return -1;
-                               }
-
-                               if (miiphy_read (dev->name, phyAddr, 0x1, &phyStatus) != 0) {
-#if (DEBUG & 0x2)
-                                       printf ("PHY auto neg 1 failed 0x%04x...\n", phyStatus);
-#endif
-                                       return -1;
-                               }
-                       } while (!(phyStatus & 0x0004));
-
-#if (DEBUG & 0x2)
-                       printf ("PHY auto neg complete! \n");
-#endif
-               }
-       }
-
-#if (DEBUG & 0x2)
-       if (fec->xcv_type != SEVENWIRE)
-               mpc512x_fec_phydump (dev->name);
-#endif
-
-#if (DEBUG & 0x1)
-       printf ("mpc512x_fec_init_phy... Done \n");
-#endif
-       return 1;
-}
-
-/********************************************************************/
-static void mpc512x_fec_halt (struct eth_device *dev)
-{
-       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
-       int counter = 0xffff;
-
-#if (DEBUG & 0x2)
-       if (fec->xcv_type != SEVENWIRE)
-               mpc512x_fec_phydump (dev->name);
-#endif
-
-       /*
-        * mask FEC chip interrupts
-        */
-       fec->eth->imask = 0;
-
-       /*
-        * issue graceful stop command to the FEC transmitter if necessary
-        */
-       fec->eth->x_cntrl |= 0x00000001;
-
-       /*
-        * wait for graceful stop to register
-        */
-       while ((counter--) && (!(fec->eth->ievent & 0x10000000))) ;
-
-       /*
-        * Disable the Ethernet Controller
-        */
-       fec->eth->ecntrl &= 0xfffffffd;
-
-       /*
-        * Issue a reset command to the FEC chip
-        */
-       fec->eth->ecntrl |= 0x1;
-
-       /*
-        * wait at least 16 clock cycles
-        */
-       udelay (10);
-#if (DEBUG & 0x3)
-       printf ("Ethernet task stopped\n");
-#endif
-}
-
-/********************************************************************/
-
-static int mpc512x_fec_send (struct eth_device *dev, volatile void *eth_data,
-               int data_length)
-{
-       /*
-        * This routine transmits one frame.  This routine only accepts
-        * 6-byte Ethernet addresses.
-        */
-       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
-       volatile FEC_TBD *pTbd;
-
-#if (DEBUG & 0x20)
-       printf("tbd status: 0x%04x\n", fec->tbdBase[fec->tbdIndex].status);
-#endif
-
-       /*
-        * Clear Tx BD ring at first
-        */
-       mpc512x_fec_tbd_scrub (fec);
-
-       /*
-        * Check for valid length of data.
-        */
-       if ((data_length > 1500) || (data_length <= 0)) {
-               return -1;
-       }
-
-       /*
-        * Check the number of vacant TxBDs.
-        */
-       if (fec->cleanTbdNum < 1) {
-#if (DEBUG & 0x20)
-               printf ("No available TxBDs ...\n");
-#endif
-               return -1;
-       }
-
-       /*
-        * Get the first TxBD to send the mac header
-        */
-       pTbd = &fec->bdBase->tbd[fec->tbdIndex];
-       pTbd->dataLength = data_length;
-       pTbd->dataPointer = (uint32)eth_data;
-       pTbd->status |= FEC_TBD_LAST | FEC_TBD_TC | FEC_TBD_READY;
-       fec->tbdIndex = (fec->tbdIndex + 1) % FEC_TBD_NUM;
-
-       /* Activate transmit Buffer Descriptor polling */
-       fec->eth->x_des_active = 0x01000000;    /* Descriptor polling active    */
-
-#if (DEBUG & 0x8)
-       printf ( "+" );
-#endif
-
-       fec->cleanTbdNum -= 1;
-
-       /*
-        * wait until frame is sent .
-        */
-       while (pTbd->status & FEC_TBD_READY) {
-               udelay (10);
-#if (DEBUG & 0x8)
-               printf ("TDB status = %04x\n", pTbd->status);
-#endif
-       }
-
-       return 0;
-}
-
-
-/********************************************************************/
-static int mpc512x_fec_recv (struct eth_device *dev)
-{
-       /*
-        * This command pulls one frame from the card
-        */
-       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
-       volatile FEC_RBD *pRbd = &fec->bdBase->rbd[fec->rbdIndex];
-       unsigned long ievent;
-       int frame_length = 0;
-
-#if (DEBUG & 0x1)
-       printf ("mpc512x_fec_recv %d Start...\n", fec->rbdIndex);
-#endif
-#if (DEBUG & 0x8)
-       printf( "-" );
-#endif
-
-       /*
-        * Check if any critical events have happened
-        */
-       ievent = fec->eth->ievent;
-       fec->eth->ievent = ievent;
-       if (ievent & 0x20060000) {
-               /* BABT, Rx/Tx FIFO errors */
-               mpc512x_fec_halt (dev);
-               mpc512x_fec_init (dev, NULL);
-               return 0;
-       }
-       if (ievent & 0x80000000) {
-               /* Heartbeat error */
-               fec->eth->x_cntrl |= 0x00000001;
-       }
-       if (ievent & 0x10000000) {
-               /* Graceful stop complete */
-               if (fec->eth->x_cntrl & 0x00000001) {
-                       mpc512x_fec_halt (dev);
-                       fec->eth->x_cntrl &= ~0x00000001;
-                       mpc512x_fec_init (dev, NULL);
-               }
-       }
-
-       if (!(pRbd->status & FEC_RBD_EMPTY)) {
-               if (!(pRbd->status & FEC_RBD_ERR) &&
-                       ((pRbd->dataLength - 4) > 14)) {
-
-                       /*
-                        * Get buffer size
-                        */
-                       if (pRbd->status & FEC_RBD_LAST)
-                               frame_length = pRbd->dataLength - 4;
-                       else
-                               frame_length = pRbd->dataLength;
-#if (DEBUG & 0x20)
-                       {
-                               int i;
-                               printf ("recv data length 0x%08x data hdr: ",
-                                       pRbd->dataLength);
-                               for (i = 0; i < 14; i++)
-                                       printf ("%x ", *((uint8*)pRbd->dataPointer + i));
-                               printf("\n");
-                       }
-#endif
-                       /*
-                        *  Fill the buffer and pass it to upper layers
-                        */
-                       memcpy (&rx_buff[rx_buff_idx], (void*)pRbd->dataPointer,
-                               frame_length - rx_buff_idx);
-                       rx_buff_idx = frame_length;
-
-                       if (pRbd->status & FEC_RBD_LAST) {
-                               NetReceive ((uchar*)rx_buff, frame_length);
-                               rx_buff_idx = 0;
-                       }
-               }
-
-               /*
-                * Reset buffer descriptor as empty
-                */
-               mpc512x_fec_rbd_clean (fec, pRbd);
-       }
-
-       /* Try to fill Buffer Descriptors */
-       fec->eth->r_des_active = 0x01000000;    /* Descriptor polling active */
-       return frame_length;
-}
-
-/********************************************************************/
-int mpc512x_fec_initialize (bd_t * bis)
-{
-       mpc512x_fec_priv *fec;
-       struct eth_device *dev;
-       int i;
-       char *tmp, *end, env_enetaddr[6];
-       void * bd;
-
-       fec = (mpc512x_fec_priv *) malloc (sizeof(*fec));
-       dev = (struct eth_device *) malloc (sizeof(*dev));
-       memset (dev, 0, sizeof *dev);
-
-       fec->eth = (ethernet_regs *) MPC512X_FEC;
-
-# ifndef CONFIG_FEC_10MBIT
-       fec->xcv_type = MII100;
-# else
-       fec->xcv_type = MII10;
-# endif
-       dev->priv = (void *)fec;
-       dev->iobase = MPC512X_FEC;
-       dev->init = mpc512x_fec_init;
-       dev->halt = mpc512x_fec_halt;
-       dev->send = mpc512x_fec_send;
-       dev->recv = mpc512x_fec_recv;
-
-       sprintf (dev->name, "FEC ETHERNET");
-       eth_register (dev);
-
-#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
-       miiphy_register (dev->name,
-                       fec512x_miiphy_read, fec512x_miiphy_write);
-#endif
-
-       /* Clean up space FEC's MIB and FIFO RAM ...*/
-       memset ((void *) MPC512X_FEC + 0x200, 0x00, 0x400);
-
-       /*
-        * Malloc space for BDs  (must be quad word-aligned)
-        * this pointer is lost, so cannot be freed
-        */
-       bd = malloc (sizeof(mpc512x_buff_descs) + 0x1f);
-       fec->bdBase = (mpc512x_buff_descs*)((uint32)bd & 0xfffffff0);
-       memset ((void *) bd, 0x00, sizeof(mpc512x_buff_descs) + 0x1f);
-
-       /*
-        * Set interrupt mask register
-        */
-       fec->eth->imask = 0x00000000;
-
-       /*
-        * Clear FEC-Lite interrupt event register(IEVENT)
-        */
-       fec->eth->ievent = 0xffffffff;
-
-       /*
-        * Try to set the mac address now. The fec mac address is
-        * a garbage after reset. When not using fec for booting
-        * the Linux fec driver will try to work with this garbage.
-        */
-       tmp = getenv ("ethaddr");
-       if (tmp) {
-               for (i=0; i<6; i++) {
-                       env_enetaddr[i] = tmp ? simple_strtoul (tmp, &end, 16) : 0;
-                       if (tmp)
-                               tmp = (*end) ? end+1 : end;
-               }
-               mpc512x_fec_set_hwaddr (fec, env_enetaddr);
-               fec->eth->gaddr1 = 0x00000000;
-               fec->eth->gaddr2 = 0x00000000;
-       }
-
-       mpc512x_fec_init_phy (dev, bis);
-
-       return 1;
-}
-
-/* MII-interface related functions */
-/********************************************************************/
-int fec512x_miiphy_read (char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal)
-{
-       ethernet_regs *eth = (ethernet_regs *) MPC512X_FEC;
-       uint32 reg;             /* convenient holder for the PHY register */
-       uint32 phy;             /* convenient holder for the PHY */
-       int timeout = 0xffff;
-
-       /*
-        * reading from any PHY's register is done by properly
-        * programming the FEC's MII data register.
-        */
-       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
-       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
-
-       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | phy | reg);
-
-       /*
-        * wait for the related interrupt
-        */
-       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
-
-       if (timeout == 0) {
-#if (DEBUG & 0x2)
-               printf ("Read MDIO failed...\n");
-#endif
-               return -1;
-       }
-
-       /*
-        * clear mii interrupt bit
-        */
-       eth->ievent = 0x00800000;
-
-       /*
-        * it's now safe to read the PHY's register
-        */
-       *retVal = (uint16) eth->mii_data;
-
-       return 0;
-}
-
-/********************************************************************/
-int fec512x_miiphy_write (char *devname, uint8 phyAddr, uint8 regAddr, uint16 data)
-{
-       ethernet_regs *eth = (ethernet_regs *) MPC512X_FEC;
-       uint32 reg;             /* convenient holder for the PHY register */
-       uint32 phy;             /* convenient holder for the PHY */
-       int timeout = 0xffff;
-
-       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
-       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
-
-       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
-                       FEC_MII_DATA_TA | phy | reg | data);
-
-       /*
-        * wait for the MII interrupt
-        */
-       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
-
-       if (timeout == 0) {
-#if (DEBUG & 0x2)
-               printf ("Write MDIO failed...\n");
-#endif
-               return -1;
-       }
-
-       /*
-        * clear MII interrupt bit
-        */
-       eth->ievent = 0x00800000;
-
-       return 0;
-}
-
-#if (DEBUG & 0x40)
-static uint32 local_crc32 (char *string, unsigned int crc_value, int len)
-{
-       int i;
-       char c;
-       unsigned int crc, count;
-
-       /*
-        * crc32 algorithm
-        */
-       /*
-        * crc = 0xffffffff; * The initialized value should be 0xffffffff
-        */
-       crc = crc_value;
-
-       for (i = len; --i >= 0;) {
-               c = *string++;
-               for (count = 0; count < 8; count++) {
-                       if ((c & 0x01) ^ (crc & 0x01)) {
-                               crc >>= 1;
-                               crc = crc ^ 0xedb88320;
-                       } else {
-                               crc >>= 1;
-                       }
-                       c >>= 1;
-               }
-       }
-
-       /*
-        * In big endian system, do byte swaping for crc value
-        */
-        /**/ return crc;
-}
-#endif /* DEBUG */
-
-#endif /* CONFIG_MPC512x_FEC */
diff --git a/cpu/mpc512x/fec.h b/cpu/mpc512x/fec.h
deleted file mode 100644 (file)
index 9c38502..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * (C) Copyright 2003 - 2007
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * Derived from the MPC8xx driver's header file.
- */
-
-#ifndef __MPC512X_FEC_H
-#define __MPC512X_FEC_H
-
-#include <common.h>
-#include <mpc512x.h>
-
-typedef unsigned long uint32;
-typedef unsigned short uint16;
-typedef unsigned char uint8;
-
-typedef struct ethernet_register_set {
-
-/* [10:2]addr = 00 */
-
-/*  Control and status Registers (offset 000-1FF) */
-
-       volatile uint32 fec_id;                 /* MBAR_ETH + 0x000 */
-       volatile uint32 ievent;                 /* MBAR_ETH + 0x004 */
-       volatile uint32 imask;                  /* MBAR_ETH + 0x008 */
-
-       volatile uint32 RES0[1];                /* MBAR_ETH + 0x00C */
-       volatile uint32 r_des_active;           /* MBAR_ETH + 0x010 */
-       volatile uint32 x_des_active;           /* MBAR_ETH + 0x014 */
-
-       volatile uint32 RES1[3];                /* MBAR_ETH + 0x018-020 */
-       volatile uint32 ecntrl;                 /* MBAR_ETH + 0x024 */
-
-       volatile uint32 RES2[6];                /* MBAR_ETH + 0x028-03C */
-       volatile uint32 mii_data;               /* MBAR_ETH + 0x040 */
-       volatile uint32 mii_speed;              /* MBAR_ETH + 0x044 */
-
-       volatile uint32 RES3[7];                /* MBAR_ETH + 0x048-060 */
-       volatile uint32 mib_control;            /* MBAR_ETH + 0x064 */
-
-       volatile uint32 RES4[7];                /* MBAR_ETH + 0x068-80 */
-       volatile uint32 r_cntrl;                /* MBAR_ETH + 0x084 */
-       volatile uint32 r_hash;                 /* MBAR_ETH + 0x088 */
-
-       volatile uint32 RES5[14];               /* MBAR_ETH + 0x08c-0C0 */
-       volatile uint32 x_cntrl;                /* MBAR_ETH + 0x0C4 */
-
-       volatile uint32 RES6[7];                /* MBAR_ETH + 0x0C8-0E0 */
-       volatile uint32 paddr1;                 /* MBAR_ETH + 0x0E4 */
-       volatile uint32 paddr2;                 /* MBAR_ETH + 0x0E8 */
-       volatile uint32 op_pause;               /* MBAR_ETH + 0x0EC */
-
-       volatile uint32 RES7[10];               /* MBAR_ETH + 0x0F0-114 */
-       volatile uint32 iaddr1;                 /* MBAR_ETH + 0x118 */
-       volatile uint32 iaddr2;                 /* MBAR_ETH + 0x11C */
-       volatile uint32 gaddr1;                 /* MBAR_ETH + 0x120 */
-       volatile uint32 gaddr2;                 /* MBAR_ETH + 0x124 */
-
-       volatile uint32 RES8[6];                /* MBAR_ETH + 0x128-13C */
-       volatile uint32 fifo_id;                /* MBAR_ETH + 0x140 */
-       volatile uint32 x_wmrk;                 /* MBAR_ETH + 0x144 */
-       volatile uint32 RES9[1];                /* MBAR_ETH + 0x148 */
-       volatile uint32 r_bound;                /* MBAR_ETH + 0x14C */
-       volatile uint32 r_fstart;               /* MBAR_ETH + 0x150 */
-
-       volatile uint32 RES10[11];              /* MBAR_ETH + 0x154-17C */
-       volatile uint32 r_des_start;            /* MBAR_ETH + 0x180 */
-       volatile uint32 x_des_start;            /* MBAR_ETH + 0x184 */
-       volatile uint32 r_buff_size;            /* MBAR_ETH + 0x188 */
-       volatile uint32 RES11[26];              /* MBAR_ETH + 0x18C-1F0 */
-       volatile uint32 dma_control;            /* MBAR_ETH + 0x1F4 */
-       volatile uint32 RES12[2];               /* MBAR_ETH + 0x1F8-1FC */
-
-/*  MIB COUNTERS (Offset 200-2FF) */
-
-       volatile uint32 rmon_t_drop;            /* MBAR_ETH + 0x200 */
-       volatile uint32 rmon_t_packets;         /* MBAR_ETH + 0x204 */
-       volatile uint32 rmon_t_bc_pkt;          /* MBAR_ETH + 0x208 */
-       volatile uint32 rmon_t_mc_pkt;          /* MBAR_ETH + 0x20C */
-       volatile uint32 rmon_t_crc_align;       /* MBAR_ETH + 0x210 */
-       volatile uint32 rmon_t_undersize;       /* MBAR_ETH + 0x214 */
-       volatile uint32 rmon_t_oversize;        /* MBAR_ETH + 0x218 */
-       volatile uint32 rmon_t_frag;            /* MBAR_ETH + 0x21C */
-       volatile uint32 rmon_t_jab;             /* MBAR_ETH + 0x220 */
-       volatile uint32 rmon_t_col;             /* MBAR_ETH + 0x224 */
-       volatile uint32 rmon_t_p64;             /* MBAR_ETH + 0x228 */
-       volatile uint32 rmon_t_p65to127;        /* MBAR_ETH + 0x22C */
-       volatile uint32 rmon_t_p128to255;       /* MBAR_ETH + 0x230 */
-       volatile uint32 rmon_t_p256to511;       /* MBAR_ETH + 0x234 */
-       volatile uint32 rmon_t_p512to1023;      /* MBAR_ETH + 0x238 */
-       volatile uint32 rmon_t_p1024to2047;     /* MBAR_ETH + 0x23C */
-       volatile uint32 rmon_t_p_gte2048;       /* MBAR_ETH + 0x240 */
-       volatile uint32 rmon_t_octets;          /* MBAR_ETH + 0x244 */
-       volatile uint32 ieee_t_drop;            /* MBAR_ETH + 0x248 */
-       volatile uint32 ieee_t_frame_ok;        /* MBAR_ETH + 0x24C */
-       volatile uint32 ieee_t_1col;            /* MBAR_ETH + 0x250 */
-       volatile uint32 ieee_t_mcol;            /* MBAR_ETH + 0x254 */
-       volatile uint32 ieee_t_def;             /* MBAR_ETH + 0x258 */
-       volatile uint32 ieee_t_lcol;            /* MBAR_ETH + 0x25C */
-       volatile uint32 ieee_t_excol;           /* MBAR_ETH + 0x260 */
-       volatile uint32 ieee_t_macerr;          /* MBAR_ETH + 0x264 */
-       volatile uint32 ieee_t_cserr;           /* MBAR_ETH + 0x268 */
-       volatile uint32 ieee_t_sqe;             /* MBAR_ETH + 0x26C */
-       volatile uint32 t_fdxfc;                /* MBAR_ETH + 0x270 */
-       volatile uint32 ieee_t_octets_ok;       /* MBAR_ETH + 0x274 */
-
-       volatile uint32 RES13[2];               /* MBAR_ETH + 0x278-27C */
-       volatile uint32 rmon_r_drop;            /* MBAR_ETH + 0x280 */
-       volatile uint32 rmon_r_packets;         /* MBAR_ETH + 0x284 */
-       volatile uint32 rmon_r_bc_pkt;          /* MBAR_ETH + 0x288 */
-       volatile uint32 rmon_r_mc_pkt;          /* MBAR_ETH + 0x28C */
-       volatile uint32 rmon_r_crc_align;       /* MBAR_ETH + 0x290 */
-       volatile uint32 rmon_r_undersize;       /* MBAR_ETH + 0x294 */
-       volatile uint32 rmon_r_oversize;        /* MBAR_ETH + 0x298 */
-       volatile uint32 rmon_r_frag;            /* MBAR_ETH + 0x29C */
-       volatile uint32 rmon_r_jab;             /* MBAR_ETH + 0x2A0 */
-
-       volatile uint32 rmon_r_resvd_0;         /* MBAR_ETH + 0x2A4 */
-
-       volatile uint32 rmon_r_p64;             /* MBAR_ETH + 0x2A8 */
-       volatile uint32 rmon_r_p65to127;        /* MBAR_ETH + 0x2AC */
-       volatile uint32 rmon_r_p128to255;       /* MBAR_ETH + 0x2B0 */
-       volatile uint32 rmon_r_p256to511;       /* MBAR_ETH + 0x2B4 */
-       volatile uint32 rmon_r_p512to1023;      /* MBAR_ETH + 0x2B8 */
-       volatile uint32 rmon_r_p1024to2047;     /* MBAR_ETH + 0x2BC */
-       volatile uint32 rmon_r_p_gte2048;       /* MBAR_ETH + 0x2C0 */
-       volatile uint32 rmon_r_octets;          /* MBAR_ETH + 0x2C4 */
-       volatile uint32 ieee_r_drop;            /* MBAR_ETH + 0x2C8 */
-       volatile uint32 ieee_r_frame_ok;        /* MBAR_ETH + 0x2CC */
-       volatile uint32 ieee_r_crc;             /* MBAR_ETH + 0x2D0 */
-       volatile uint32 ieee_r_align;           /* MBAR_ETH + 0x2D4 */
-       volatile uint32 r_macerr;               /* MBAR_ETH + 0x2D8 */
-       volatile uint32 r_fdxfc;                /* MBAR_ETH + 0x2DC */
-       volatile uint32 ieee_r_octets_ok;       /* MBAR_ETH + 0x2E0 */
-
-       volatile uint32 RES14[6];               /* MBAR_ETH + 0x2E4-2FC */
-
-       volatile uint32 RES15[64];              /* MBAR_ETH + 0x300-3FF */
-} ethernet_regs;
-
-/* Receive & Transmit Buffer Descriptor definitions */
-typedef struct BufferDescriptor {
-       uint16 status;
-       uint16 dataLength;
-       uint32 dataPointer;
-} FEC_RBD;
-
-typedef struct {
-       uint16 status;
-       uint16 dataLength;
-       uint32 dataPointer;
-} FEC_TBD;
-
-/* private structure */
-typedef enum {
-       SEVENWIRE,                      /* 7-wire       */
-       MII10,                          /* MII 10Mbps   */
-       MII100                          /* MII 100Mbps  */
-} xceiver_type;
-
-/* BD Numer definitions */
-#define FEC_TBD_NUM            48      /* The user can adjust this value */
-#define FEC_RBD_NUM            32      /* The user can adjust this value */
-
-/* packet size limit */
-#define FEC_MAX_FRAME_LEN      1522    /* recommended default value */
-
-/* Buffer size must be evenly divisible by 16 */
-#define FEC_BUFFER_SIZE                ((FEC_MAX_FRAME_LEN + 0x10) & (~0xf))
-
-typedef struct {
-       uint8 frame[FEC_BUFFER_SIZE];
-} mpc512x_frame;
-
-typedef struct {
-       FEC_RBD rbd[FEC_RBD_NUM];                       /* RBD ring */
-       FEC_TBD tbd[FEC_TBD_NUM];                       /* TBD ring */
-       mpc512x_frame recv_frames[FEC_RBD_NUM];         /* receive buff */
-} mpc512x_buff_descs;
-
-typedef struct {
-       ethernet_regs *eth;
-       xceiver_type xcv_type;          /* transceiver type */
-       mpc512x_buff_descs *bdBase;     /* BD rings and recv buffer */
-       uint16 rbdIndex;                /* next receive BD to read */
-       uint16 tbdIndex;                /* next transmit BD to send */
-       uint16 usedTbdIndex;            /* next transmit BD to clean */
-       uint16 cleanTbdNum;             /* the number of available transmit BDs */
-} mpc512x_fec_priv;
-
-/* RBD bits definitions */
-#define FEC_RBD_EMPTY          0x8000  /* Buffer is empty */
-#define FEC_RBD_WRAP           0x2000  /* Last BD in ring */
-#define FEC_RBD_LAST           0x0800  /* Buffer is last in frame(useless) */
-#define FEC_RBD_MISS           0x0100  /* Miss bit for prom mode */
-#define FEC_RBD_BC             0x0080  /* The received frame is broadcast frame */
-#define FEC_RBD_MC             0x0040  /* The received frame is multicast frame */
-#define FEC_RBD_LG             0x0020  /* Frame length violation */
-#define FEC_RBD_NO             0x0010  /* Nonoctet align frame */
-#define FEC_RBD_SH             0x0008  /* Short frame */
-#define FEC_RBD_CR             0x0004  /* CRC error */
-#define FEC_RBD_OV             0x0002  /* Receive FIFO overrun */
-#define FEC_RBD_TR             0x0001  /* Frame is truncated */
-#define FEC_RBD_ERR            (FEC_RBD_LG | FEC_RBD_NO | FEC_RBD_CR | \
-                               FEC_RBD_OV | FEC_RBD_TR)
-
-/* TBD bits definitions */
-#define FEC_TBD_READY          0x8000  /* Buffer is ready */
-#define FEC_TBD_WRAP           0x2000  /* Last BD in ring */
-#define FEC_TBD_LAST           0x0800  /* Buffer is last in frame */
-#define FEC_TBD_TC             0x0400  /* Transmit the CRC */
-#define FEC_TBD_ABC            0x0200  /* Append bad CRC */
-
-/* MII-related definitios */
-#define FEC_MII_DATA_ST                0x40000000      /* Start of frame delimiter */
-#define FEC_MII_DATA_OP_RD     0x20000000      /* Perform a read operation */
-#define FEC_MII_DATA_OP_WR     0x10000000      /* Perform a write operation */
-#define FEC_MII_DATA_PA_MSK    0x0f800000      /* PHY Address field mask */
-#define FEC_MII_DATA_RA_MSK    0x007c0000      /* PHY Register field mask */
-#define FEC_MII_DATA_TA                0x00020000      /* Turnaround */
-#define FEC_MII_DATA_DATAMSK   0x0000ffff      /* PHY data field */
-
-#define FEC_MII_DATA_RA_SHIFT  18      /* MII Register address bits */
-#define FEC_MII_DATA_PA_SHIFT  23      /* MII PHY address bits */
-
-#endif /* __MPC512X_FEC_H */
index 312b0bfc6cc8a64c3dbc5a3d37fe4b2052fb3d32..06fdbcfb7292b6c0149fb36ac8513ace7c25acc9 100644 (file)
@@ -27,7 +27,7 @@ LIB   = $(obj)lib$(CPU).a
 
 START  = start.o
 SOBJS  = io.o firmware_sc_task_bestcomm.impl.o firmware_sc_task.impl.o
-COBJS  = i2c.o traps.o cpu.o cpu_init.o fec.o ide.o interrupts.o \
+COBJS  = i2c.o traps.o cpu.o cpu_init.o ide.o interrupts.o \
          loadtask.o pci_mpc5200.o serial.o speed.o usb_ohci.o usb.o
 
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
diff --git a/cpu/mpc5xxx/fec.c b/cpu/mpc5xxx/fec.c
deleted file mode 100644 (file)
index bf804ee..0000000
+++ /dev/null
@@ -1,1067 +0,0 @@
-/*
- * (C) Copyright 2003-2005
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * This file is based on mpc4200fec.c,
- * (C) Copyright Motorola, Inc., 2000
- */
-
-#include <common.h>
-#include <mpc5xxx.h>
-#include <malloc.h>
-#include <net.h>
-#include <miiphy.h>
-#include "sdma.h"
-#include "fec.h"
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* #define DEBUG       0x28 */
-
-#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \
-       defined(CONFIG_MPC5xxx_FEC)
-
-#if !(defined(CONFIG_MII) || defined(CONFIG_CMD_MII))
-#error "CONFIG_MII has to be defined!"
-#endif
-
-#if (DEBUG & 0x60)
-static void tfifo_print(char *devname, mpc5xxx_fec_priv *fec);
-static void rfifo_print(char *devname, mpc5xxx_fec_priv *fec);
-#endif /* DEBUG */
-
-#if (DEBUG & 0x40)
-static uint32 local_crc32(char *string, unsigned int crc_value, int len);
-#endif
-
-typedef struct {
-    uint8 data[1500];           /* actual data */
-    int length;                 /* actual length */
-    int used;                   /* buffer in use or not */
-    uint8 head[16];             /* MAC header(6 + 6 + 2) + 2(aligned) */
-} NBUF;
-
-int fec5xxx_miiphy_read(char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal);
-int fec5xxx_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data);
-
-/********************************************************************/
-#if (DEBUG & 0x2)
-static void mpc5xxx_fec_phydump (char *devname)
-{
-       uint16 phyStatus, i;
-       uint8 phyAddr = CONFIG_PHY_ADDR;
-       uint8 reg_mask[] = {
-#if CONFIG_PHY_TYPE == 0x79c874        /* AMD Am79C874 */
-               /* regs to print: 0...7, 16...19, 21, 23, 24 */
-               1, 1, 1, 1,  1, 1, 1, 1,     0, 0, 0, 0,  0, 0, 0, 0,
-               1, 1, 1, 1,  0, 1, 0, 1,     1, 0, 0, 0,  0, 0, 0, 0,
-#else
-               /* regs to print: 0...8, 16...20 */
-               1, 1, 1, 1,  1, 1, 1, 1,     1, 0, 0, 0,  0, 0, 0, 0,
-               1, 1, 1, 1,  1, 0, 0, 0,     0, 0, 0, 0,  0, 0, 0, 0,
-#endif
-       };
-
-       for (i = 0; i < 32; i++) {
-               if (reg_mask[i]) {
-                       miiphy_read(devname, phyAddr, i, &phyStatus);
-                       printf("Mii reg %d: 0x%04x\n", i, phyStatus);
-               }
-       }
-}
-#endif
-
-/********************************************************************/
-static int mpc5xxx_fec_rbd_init(mpc5xxx_fec_priv *fec)
-{
-       int ix;
-       char *data;
-       static int once = 0;
-
-       for (ix = 0; ix < FEC_RBD_NUM; ix++) {
-               if (!once) {
-                       data = (char *)malloc(FEC_MAX_PKT_SIZE);
-                       if (data == NULL) {
-                               printf ("RBD INIT FAILED\n");
-                               return -1;
-                       }
-                       fec->rbdBase[ix].dataPointer = (uint32)data;
-               }
-               fec->rbdBase[ix].status = FEC_RBD_EMPTY;
-               fec->rbdBase[ix].dataLength = 0;
-       }
-       once ++;
-
-       /*
-        * have the last RBD to close the ring
-        */
-       fec->rbdBase[ix - 1].status |= FEC_RBD_WRAP;
-       fec->rbdIndex = 0;
-
-       return 0;
-}
-
-/********************************************************************/
-static void mpc5xxx_fec_tbd_init(mpc5xxx_fec_priv *fec)
-{
-       int ix;
-
-       for (ix = 0; ix < FEC_TBD_NUM; ix++) {
-               fec->tbdBase[ix].status = 0;
-       }
-
-       /*
-        * Have the last TBD to close the ring
-        */
-       fec->tbdBase[ix - 1].status |= FEC_TBD_WRAP;
-
-       /*
-        * Initialize some indices
-        */
-       fec->tbdIndex = 0;
-       fec->usedTbdIndex = 0;
-       fec->cleanTbdNum = FEC_TBD_NUM;
-}
-
-/********************************************************************/
-static void mpc5xxx_fec_rbd_clean(mpc5xxx_fec_priv *fec, volatile FEC_RBD * pRbd)
-{
-       /*
-        * Reset buffer descriptor as empty
-        */
-       if ((fec->rbdIndex) == (FEC_RBD_NUM - 1))
-               pRbd->status = (FEC_RBD_WRAP | FEC_RBD_EMPTY);
-       else
-               pRbd->status = FEC_RBD_EMPTY;
-
-       pRbd->dataLength = 0;
-
-       /*
-        * Now, we have an empty RxBD, restart the SmartDMA receive task
-        */
-       SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
-
-       /*
-        * Increment BD count
-        */
-       fec->rbdIndex = (fec->rbdIndex + 1) % FEC_RBD_NUM;
-}
-
-/********************************************************************/
-static void mpc5xxx_fec_tbd_scrub(mpc5xxx_fec_priv *fec)
-{
-       volatile FEC_TBD *pUsedTbd;
-
-#if (DEBUG & 0x1)
-       printf ("tbd_scrub: fec->cleanTbdNum = %d, fec->usedTbdIndex = %d\n",
-               fec->cleanTbdNum, fec->usedTbdIndex);
-#endif
-
-       /*
-        * process all the consumed TBDs
-        */
-       while (fec->cleanTbdNum < FEC_TBD_NUM) {
-               pUsedTbd = &fec->tbdBase[fec->usedTbdIndex];
-               if (pUsedTbd->status & FEC_TBD_READY) {
-#if (DEBUG & 0x20)
-                       printf("Cannot clean TBD %d, in use\n", fec->cleanTbdNum);
-#endif
-                       return;
-               }
-
-               /*
-                * clean this buffer descriptor
-                */
-               if (fec->usedTbdIndex == (FEC_TBD_NUM - 1))
-                       pUsedTbd->status = FEC_TBD_WRAP;
-               else
-                       pUsedTbd->status = 0;
-
-               /*
-                * update some indeces for a correct handling of the TBD ring
-                */
-               fec->cleanTbdNum++;
-               fec->usedTbdIndex = (fec->usedTbdIndex + 1) % FEC_TBD_NUM;
-       }
-}
-
-/********************************************************************/
-static void mpc5xxx_fec_set_hwaddr(mpc5xxx_fec_priv *fec, char *mac)
-{
-       uint8 currByte;                 /* byte for which to compute the CRC */
-       int byte;                       /* loop - counter */
-       int bit;                        /* loop - counter */
-       uint32 crc = 0xffffffff;        /* initial value */
-
-       /*
-        * The algorithm used is the following:
-        * we loop on each of the six bytes of the provided address,
-        * and we compute the CRC by left-shifting the previous
-        * value by one position, so that each bit in the current
-        * byte of the address may contribute the calculation. If
-        * the latter and the MSB in the CRC are different, then
-        * the CRC value so computed is also ex-ored with the
-        * "polynomium generator". The current byte of the address
-        * is also shifted right by one bit at each iteration.
-        * This is because the CRC generatore in hardware is implemented
-        * as a shift-register with as many ex-ores as the radixes
-        * in the polynomium. This suggests that we represent the
-        * polynomiumm itself as a 32-bit constant.
-        */
-       for (byte = 0; byte < 6; byte++) {
-               currByte = mac[byte];
-               for (bit = 0; bit < 8; bit++) {
-                       if ((currByte & 0x01) ^ (crc & 0x01)) {
-                               crc >>= 1;
-                               crc = crc ^ 0xedb88320;
-                       } else {
-                               crc >>= 1;
-                       }
-                       currByte >>= 1;
-               }
-       }
-
-       crc = crc >> 26;
-
-       /*
-        * Set individual hash table register
-        */
-       if (crc >= 32) {
-               fec->eth->iaddr1 = (1 << (crc - 32));
-               fec->eth->iaddr2 = 0;
-       } else {
-               fec->eth->iaddr1 = 0;
-               fec->eth->iaddr2 = (1 << crc);
-       }
-
-       /*
-        * Set physical address
-        */
-       fec->eth->paddr1 = (mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3];
-       fec->eth->paddr2 = (mac[4] << 24) + (mac[5] << 16) + 0x8808;
-}
-
-/********************************************************************/
-static int mpc5xxx_fec_init(struct eth_device *dev, bd_t * bis)
-{
-       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
-       struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA;
-
-#if (DEBUG & 0x1)
-       printf ("mpc5xxx_fec_init... Begin\n");
-#endif
-
-       /*
-        * Initialize RxBD/TxBD rings
-        */
-       mpc5xxx_fec_rbd_init(fec);
-       mpc5xxx_fec_tbd_init(fec);
-
-       /*
-        * Clear FEC-Lite interrupt event register(IEVENT)
-        */
-       fec->eth->ievent = 0xffffffff;
-
-       /*
-        * Set interrupt mask register
-        */
-       fec->eth->imask = 0x00000000;
-
-       /*
-        * Set FEC-Lite receive control register(R_CNTRL):
-        */
-       if (fec->xcv_type == SEVENWIRE) {
-               /*
-                * Frame length=1518; 7-wire mode
-                */
-               fec->eth->r_cntrl = 0x05ee0020; /*0x05ee0000;FIXME */
-       } else {
-               /*
-                * Frame length=1518; MII mode;
-                */
-               fec->eth->r_cntrl = 0x05ee0024; /*0x05ee0004;FIXME */
-       }
-
-       fec->eth->x_cntrl = 0x00000000; /* half-duplex, heartbeat disabled */
-       if (fec->xcv_type != SEVENWIRE) {
-               /*
-                * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
-                * and do not drop the Preamble.
-                */
-               fec->eth->mii_speed = (((gd->ipb_clk >> 20) / 5) << 1); /* No MII for 7-wire mode */
-       }
-
-       /*
-        * Set Opcode/Pause Duration Register
-        */
-       fec->eth->op_pause = 0x00010020;        /*FIXME 0xffff0020; */
-
-       /*
-        * Set Rx FIFO alarm and granularity value
-        */
-       fec->eth->rfifo_cntrl = 0x0c000000
-                               | (fec->eth->rfifo_cntrl & ~0x0f000000);
-       fec->eth->rfifo_alarm = 0x0000030c;
-#if (DEBUG & 0x22)
-       if (fec->eth->rfifo_status & 0x00700000 ) {
-               printf("mpc5xxx_fec_init() RFIFO error\n");
-       }
-#endif
-
-       /*
-        * Set Tx FIFO granularity value
-        */
-       fec->eth->tfifo_cntrl = 0x0c000000
-                               | (fec->eth->tfifo_cntrl & ~0x0f000000);
-#if (DEBUG & 0x2)
-       printf("tfifo_status: 0x%08x\n", fec->eth->tfifo_status);
-       printf("tfifo_alarm: 0x%08x\n", fec->eth->tfifo_alarm);
-#endif
-
-       /*
-        * Set transmit fifo watermark register(X_WMRK), default = 64
-        */
-       fec->eth->tfifo_alarm = 0x00000080;
-       fec->eth->x_wmrk = 0x2;
-
-       /*
-        * Set individual address filter for unicast address
-        * and set physical address registers.
-        */
-       mpc5xxx_fec_set_hwaddr(fec, (char *)dev->enetaddr);
-
-       /*
-        * Set multicast address filter
-        */
-       fec->eth->gaddr1 = 0x00000000;
-       fec->eth->gaddr2 = 0x00000000;
-
-       /*
-        * Turn ON cheater FSM: ????
-        */
-       fec->eth->xmit_fsm = 0x03000000;
-
-#if defined(CONFIG_MPC5200)
-       /*
-        * Turn off COMM bus prefetch in the MGT5200 BestComm. It doesn't
-        * work w/ the current receive task.
-        */
-        sdma->PtdCntrl |= 0x00000001;
-#endif
-
-       /*
-        * Set priority of different initiators
-        */
-       sdma->IPR0 = 7;         /* always */
-       sdma->IPR3 = 6;         /* Eth RX */
-       sdma->IPR4 = 5;         /* Eth Tx */
-
-       /*
-        * Clear SmartDMA task interrupt pending bits
-        */
-       SDMA_CLEAR_IEVENT(FEC_RECV_TASK_NO);
-
-       /*
-        * Initialize SmartDMA parameters stored in SRAM
-        */
-       *(volatile int *)FEC_TBD_BASE = (int)fec->tbdBase;
-       *(volatile int *)FEC_RBD_BASE = (int)fec->rbdBase;
-       *(volatile int *)FEC_TBD_NEXT = (int)fec->tbdBase;
-       *(volatile int *)FEC_RBD_NEXT = (int)fec->rbdBase;
-
-       /*
-        * Enable FEC-Lite controller
-        */
-       fec->eth->ecntrl |= 0x00000006;
-
-#if (DEBUG & 0x2)
-       if (fec->xcv_type != SEVENWIRE)
-               mpc5xxx_fec_phydump (dev->name);
-#endif
-
-       /*
-        * Enable SmartDMA receive task
-        */
-       SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
-
-#if (DEBUG & 0x1)
-       printf("mpc5xxx_fec_init... Done \n");
-#endif
-
-       return 1;
-}
-
-/********************************************************************/
-static int mpc5xxx_fec_init_phy(struct eth_device *dev, bd_t * bis)
-{
-       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
-       const uint8 phyAddr = CONFIG_PHY_ADDR;  /* Only one PHY */
-
-#if (DEBUG & 0x1)
-       printf ("mpc5xxx_fec_init_phy... Begin\n");
-#endif
-
-       /*
-        * Initialize GPIO pins
-        */
-       if (fec->xcv_type == SEVENWIRE) {
-               /*  10MBit with 7-wire operation */
-#if defined(CONFIG_TOTAL5200)
-               /* 7-wire and USB2 on Ethernet */
-               *(vu_long *)MPC5XXX_GPS_PORT_CONFIG |= 0x00030000;
-#else  /* !CONFIG_TOTAL5200 */
-               /* 7-wire only */
-               *(vu_long *)MPC5XXX_GPS_PORT_CONFIG |= 0x00020000;
-#endif /* CONFIG_TOTAL5200 */
-       } else {
-               /* 100MBit with MD operation */
-               *(vu_long *)MPC5XXX_GPS_PORT_CONFIG |= 0x00050000;
-       }
-
-       /*
-        * Clear FEC-Lite interrupt event register(IEVENT)
-        */
-       fec->eth->ievent = 0xffffffff;
-
-       /*
-        * Set interrupt mask register
-        */
-       fec->eth->imask = 0x00000000;
-
-/*
- * In original Promess-provided code PHY initialization is disabled with the
- * following comment: "Phy initialization is DISABLED for now.  There was a
- * problem with running 100 Mbps on PRO board". Thus we temporarily disable
- * PHY initialization for the Motion-PRO board, until a proper fix is found.
- */
-
-       if (fec->xcv_type != SEVENWIRE) {
-               /*
-                * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
-                * and do not drop the Preamble.
-                */
-               fec->eth->mii_speed = (((gd->ipb_clk >> 20) / 5) << 1); /* No MII for 7-wire mode */
-       }
-
-       if (fec->xcv_type != SEVENWIRE) {
-               /*
-                * Initialize PHY(LXT971A):
-                *
-                *   Generally, on power up, the LXT971A reads its configuration
-                *   pins to check for forced operation, If not cofigured for
-                *   forced operation, it uses auto-negotiation/parallel detection
-                *   to automatically determine line operating conditions.
-                *   If the PHY device on the other side of the link supports
-                *   auto-negotiation, the LXT971A auto-negotiates with it
-                *   using Fast Link Pulse(FLP) Bursts. If the PHY partner does not
-                *   support auto-negotiation, the LXT971A automatically detects
-                *   the presence of either link pulses(10Mbps PHY) or Idle
-                *   symbols(100Mbps) and sets its operating conditions accordingly.
-                *
-                *   When auto-negotiation is controlled by software, the following
-                *   steps are recommended.
-                *
-                * Note:
-                *   The physical address is dependent on hardware configuration.
-                *
-                */
-               int timeout = 1;
-               uint16 phyStatus;
-
-               /*
-                * Reset PHY, then delay 300ns
-                */
-               miiphy_write(dev->name, phyAddr, 0x0, 0x8000);
-               udelay(1000);
-
-#if defined(CONFIG_UC101) || defined(CONFIG_MUCMC52)
-               /* Set the LED configuration Register for the UC101
-                  and MUCMC52 Board */
-               miiphy_write(dev->name, phyAddr, 0x14, 0x4122);
-#endif
-               if (fec->xcv_type == MII10) {
-                       /*
-                        * Force 10Base-T, FDX operation
-                        */
-#if (DEBUG & 0x2)
-                       printf("Forcing 10 Mbps ethernet link... ");
-#endif
-                       miiphy_read(dev->name, phyAddr, 0x1, &phyStatus);
-                       /*
-                       miiphy_write(dev->name, fec, phyAddr, 0x0, 0x0100);
-                       */
-                       miiphy_write(dev->name, phyAddr, 0x0, 0x0180);
-
-                       timeout = 20;
-                       do {    /* wait for link status to go down */
-                               udelay(10000);
-                               if ((timeout--) == 0) {
-#if (DEBUG & 0x2)
-                                       printf("hmmm, should not have waited...");
-#endif
-                                       break;
-                               }
-                               miiphy_read(dev->name, phyAddr, 0x1, &phyStatus);
-#if (DEBUG & 0x2)
-                               printf("=");
-#endif
-                       } while ((phyStatus & 0x0004)); /* !link up */
-
-                       timeout = 1000;
-                       do {    /* wait for link status to come back up */
-                               udelay(10000);
-                               if ((timeout--) == 0) {
-                                       printf("failed. Link is down.\n");
-                                       break;
-                               }
-                               miiphy_read(dev->name, phyAddr, 0x1, &phyStatus);
-#if (DEBUG & 0x2)
-                               printf("+");
-#endif
-                       } while (!(phyStatus & 0x0004));        /* !link up */
-
-#if (DEBUG & 0x2)
-                       printf ("done.\n");
-#endif
-               } else {        /* MII100 */
-                       /*
-                        * Set the auto-negotiation advertisement register bits
-                        */
-                       miiphy_write(dev->name, phyAddr, 0x4, 0x01e1);
-
-                       /*
-                        * Set MDIO bit 0.12 = 1(&& bit 0.9=1?) to enable auto-negotiation
-                        */
-                       miiphy_write(dev->name, phyAddr, 0x0, 0x1200);
-
-                       /*
-                        * Wait for AN completion
-                        */
-                       timeout = 5000;
-                       do {
-                               udelay(1000);
-
-                               if ((timeout--) == 0) {
-#if (DEBUG & 0x2)
-                                       printf("PHY auto neg 0 failed...\n");
-#endif
-                                       return -1;
-                               }
-
-                               if (miiphy_read(dev->name, phyAddr, 0x1, &phyStatus) != 0) {
-#if (DEBUG & 0x2)
-                                       printf("PHY auto neg 1 failed 0x%04x...\n", phyStatus);
-#endif
-                                       return -1;
-                               }
-                       } while (!(phyStatus & 0x0004));
-
-#if (DEBUG & 0x2)
-                       printf("PHY auto neg complete! \n");
-#endif
-               }
-
-       }
-
-#if (DEBUG & 0x2)
-       if (fec->xcv_type != SEVENWIRE)
-               mpc5xxx_fec_phydump (dev->name);
-#endif
-
-
-#if (DEBUG & 0x1)
-       printf("mpc5xxx_fec_init_phy... Done \n");
-#endif
-
-       return 1;
-}
-
-/********************************************************************/
-static void mpc5xxx_fec_halt(struct eth_device *dev)
-{
-#if defined(CONFIG_MPC5200)
-       struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA;
-#endif
-       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
-       int counter = 0xffff;
-
-#if (DEBUG & 0x2)
-       if (fec->xcv_type != SEVENWIRE)
-               mpc5xxx_fec_phydump (dev->name);
-#endif
-
-       /*
-        * mask FEC chip interrupts
-        */
-       fec->eth->imask = 0;
-
-       /*
-        * issue graceful stop command to the FEC transmitter if necessary
-        */
-       fec->eth->x_cntrl |= 0x00000001;
-
-       /*
-        * wait for graceful stop to register
-        */
-       while ((counter--) && (!(fec->eth->ievent & 0x10000000))) ;
-
-       /*
-        * Disable SmartDMA tasks
-        */
-       SDMA_TASK_DISABLE (FEC_XMIT_TASK_NO);
-       SDMA_TASK_DISABLE (FEC_RECV_TASK_NO);
-
-#if defined(CONFIG_MPC5200)
-       /*
-        * Turn on COMM bus prefetch in the MGT5200 BestComm after we're
-        * done. It doesn't work w/ the current receive task.
-        */
-        sdma->PtdCntrl &= ~0x00000001;
-#endif
-
-       /*
-        * Disable the Ethernet Controller
-        */
-       fec->eth->ecntrl &= 0xfffffffd;
-
-       /*
-        * Clear FIFO status registers
-        */
-       fec->eth->rfifo_status &= 0x00700000;
-       fec->eth->tfifo_status &= 0x00700000;
-
-       fec->eth->reset_cntrl = 0x01000000;
-
-       /*
-        * Issue a reset command to the FEC chip
-        */
-       fec->eth->ecntrl |= 0x1;
-
-       /*
-        * wait at least 16 clock cycles
-        */
-       udelay(10);
-
-#if (DEBUG & 0x3)
-       printf("Ethernet task stopped\n");
-#endif
-}
-
-#if (DEBUG & 0x60)
-/********************************************************************/
-
-static void tfifo_print(char *devname, mpc5xxx_fec_priv *fec)
-{
-       uint16 phyAddr = CONFIG_PHY_ADDR;
-       uint16 phyStatus;
-
-       if ((fec->eth->tfifo_lrf_ptr != fec->eth->tfifo_lwf_ptr)
-               || (fec->eth->tfifo_rdptr != fec->eth->tfifo_wrptr)) {
-
-               miiphy_read(devname, phyAddr, 0x1, &phyStatus);
-               printf("\nphyStatus: 0x%04x\n", phyStatus);
-               printf("ecntrl:   0x%08x\n", fec->eth->ecntrl);
-               printf("ievent:   0x%08x\n", fec->eth->ievent);
-               printf("x_status: 0x%08x\n", fec->eth->x_status);
-               printf("tfifo: status  0x%08x\n", fec->eth->tfifo_status);
-
-               printf("       control 0x%08x\n", fec->eth->tfifo_cntrl);
-               printf("       lrfp    0x%08x\n", fec->eth->tfifo_lrf_ptr);
-               printf("       lwfp    0x%08x\n", fec->eth->tfifo_lwf_ptr);
-               printf("       alarm   0x%08x\n", fec->eth->tfifo_alarm);
-               printf("       readptr 0x%08x\n", fec->eth->tfifo_rdptr);
-               printf("       writptr 0x%08x\n", fec->eth->tfifo_wrptr);
-       }
-}
-
-static void rfifo_print(char *devname, mpc5xxx_fec_priv *fec)
-{
-       uint16 phyAddr = CONFIG_PHY_ADDR;
-       uint16 phyStatus;
-
-       if ((fec->eth->rfifo_lrf_ptr != fec->eth->rfifo_lwf_ptr)
-               || (fec->eth->rfifo_rdptr != fec->eth->rfifo_wrptr)) {
-
-               miiphy_read(devname, phyAddr, 0x1, &phyStatus);
-               printf("\nphyStatus: 0x%04x\n", phyStatus);
-               printf("ecntrl:   0x%08x\n", fec->eth->ecntrl);
-               printf("ievent:   0x%08x\n", fec->eth->ievent);
-               printf("x_status: 0x%08x\n", fec->eth->x_status);
-               printf("rfifo: status  0x%08x\n", fec->eth->rfifo_status);
-
-               printf("       control 0x%08x\n", fec->eth->rfifo_cntrl);
-               printf("       lrfp    0x%08x\n", fec->eth->rfifo_lrf_ptr);
-               printf("       lwfp    0x%08x\n", fec->eth->rfifo_lwf_ptr);
-               printf("       alarm   0x%08x\n", fec->eth->rfifo_alarm);
-               printf("       readptr 0x%08x\n", fec->eth->rfifo_rdptr);
-               printf("       writptr 0x%08x\n", fec->eth->rfifo_wrptr);
-       }
-}
-#endif /* DEBUG */
-
-/********************************************************************/
-
-static int mpc5xxx_fec_send(struct eth_device *dev, volatile void *eth_data,
-               int data_length)
-{
-       /*
-        * This routine transmits one frame.  This routine only accepts
-        * 6-byte Ethernet addresses.
-        */
-       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
-       volatile FEC_TBD *pTbd;
-
-#if (DEBUG & 0x20)
-       printf("tbd status: 0x%04x\n", fec->tbdBase[0].status);
-       tfifo_print(dev->name, fec);
-#endif
-
-       /*
-        * Clear Tx BD ring at first
-        */
-       mpc5xxx_fec_tbd_scrub(fec);
-
-       /*
-        * Check for valid length of data.
-        */
-       if ((data_length > 1500) || (data_length <= 0)) {
-               return -1;
-       }
-
-       /*
-        * Check the number of vacant TxBDs.
-        */
-       if (fec->cleanTbdNum < 1) {
-#if (DEBUG & 0x20)
-               printf("No available TxBDs ...\n");
-#endif
-               return -1;
-       }
-
-       /*
-        * Get the first TxBD to send the mac header
-        */
-       pTbd = &fec->tbdBase[fec->tbdIndex];
-       pTbd->dataLength = data_length;
-       pTbd->dataPointer = (uint32)eth_data;
-       pTbd->status |= FEC_TBD_LAST | FEC_TBD_TC | FEC_TBD_READY;
-       fec->tbdIndex = (fec->tbdIndex + 1) % FEC_TBD_NUM;
-
-#if (DEBUG & 0x100)
-       printf("SDMA_TASK_ENABLE, fec->tbdIndex = %d \n", fec->tbdIndex);
-#endif
-
-       /*
-        * Kick the MII i/f
-        */
-       if (fec->xcv_type != SEVENWIRE) {
-               uint16 phyStatus;
-               miiphy_read(dev->name, 0, 0x1, &phyStatus);
-       }
-
-       /*
-        * Enable SmartDMA transmit task
-        */
-
-#if (DEBUG & 0x20)
-       tfifo_print(dev->name, fec);
-#endif
-       SDMA_TASK_ENABLE (FEC_XMIT_TASK_NO);
-#if (DEBUG & 0x20)
-       tfifo_print(dev->name, fec);
-#endif
-#if (DEBUG & 0x8)
-       printf( "+" );
-#endif
-
-       fec->cleanTbdNum -= 1;
-
-#if (DEBUG & 0x129) && (DEBUG & 0x80000000)
-       printf ("smartDMA ethernet Tx task enabled\n");
-#endif
-       /*
-        * wait until frame is sent .
-        */
-       while (pTbd->status & FEC_TBD_READY) {
-               udelay(10);
-#if (DEBUG & 0x8)
-               printf ("TDB status = %04x\n", pTbd->status);
-#endif
-       }
-
-       return 0;
-}
-
-
-/********************************************************************/
-static int mpc5xxx_fec_recv(struct eth_device *dev)
-{
-       /*
-        * This command pulls one frame from the card
-        */
-       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
-       volatile FEC_RBD *pRbd = &fec->rbdBase[fec->rbdIndex];
-       unsigned long ievent;
-       int frame_length, len = 0;
-       NBUF *frame;
-       uchar buff[FEC_MAX_PKT_SIZE];
-
-#if (DEBUG & 0x1)
-       printf ("mpc5xxx_fec_recv %d Start...\n", fec->rbdIndex);
-#endif
-#if (DEBUG & 0x8)
-       printf( "-" );
-#endif
-
-       /*
-        * Check if any critical events have happened
-        */
-       ievent = fec->eth->ievent;
-       fec->eth->ievent = ievent;
-       if (ievent & 0x20060000) {
-               /* BABT, Rx/Tx FIFO errors */
-               mpc5xxx_fec_halt(dev);
-               mpc5xxx_fec_init(dev, NULL);
-               return 0;
-       }
-       if (ievent & 0x80000000) {
-               /* Heartbeat error */
-               fec->eth->x_cntrl |= 0x00000001;
-       }
-       if (ievent & 0x10000000) {
-               /* Graceful stop complete */
-               if (fec->eth->x_cntrl & 0x00000001) {
-                       mpc5xxx_fec_halt(dev);
-                       fec->eth->x_cntrl &= ~0x00000001;
-                       mpc5xxx_fec_init(dev, NULL);
-               }
-       }
-
-       if (!(pRbd->status & FEC_RBD_EMPTY)) {
-               if ((pRbd->status & FEC_RBD_LAST) && !(pRbd->status & FEC_RBD_ERR) &&
-                       ((pRbd->dataLength - 4) > 14)) {
-
-                       /*
-                        * Get buffer address and size
-                        */
-                       frame = (NBUF *)pRbd->dataPointer;
-                       frame_length = pRbd->dataLength - 4;
-
-#if (DEBUG & 0x20)
-                       {
-                               int i;
-                               printf("recv data hdr:");
-                               for (i = 0; i < 14; i++)
-                                       printf("%x ", *(frame->head + i));
-                               printf("\n");
-                       }
-#endif
-                       /*
-                        *  Fill the buffer and pass it to upper layers
-                        */
-                       memcpy(buff, frame->head, 14);
-                       memcpy(buff + 14, frame->data, frame_length);
-                       NetReceive(buff, frame_length);
-                       len = frame_length;
-               }
-               /*
-                * Reset buffer descriptor as empty
-                */
-               mpc5xxx_fec_rbd_clean(fec, pRbd);
-       }
-       SDMA_CLEAR_IEVENT (FEC_RECV_TASK_NO);
-       return len;
-}
-
-
-/********************************************************************/
-int mpc5xxx_fec_initialize(bd_t * bis)
-{
-       mpc5xxx_fec_priv *fec;
-       struct eth_device *dev;
-       char *tmp, *end;
-       char env_enetaddr[6];
-       int i;
-
-       fec = (mpc5xxx_fec_priv *)malloc(sizeof(*fec));
-       dev = (struct eth_device *)malloc(sizeof(*dev));
-       memset(dev, 0, sizeof *dev);
-
-       fec->eth = (ethernet_regs *)MPC5XXX_FEC;
-       fec->tbdBase = (FEC_TBD *)FEC_BD_BASE;
-       fec->rbdBase = (FEC_RBD *)(FEC_BD_BASE + FEC_TBD_NUM * sizeof(FEC_TBD));
-#if defined(CONFIG_CANMB)              || \
-       defined(CONFIG_CM5200)          || \
-       defined(CONFIG_HMI1001)         || \
-       defined(CONFIG_ICECUBE)         || \
-       defined(CONFIG_INKA4X0)         || \
-       defined(CONFIG_JUPITER)         || \
-       defined(CONFIG_MCC200)          || \
-       defined(CONFIG_MOTIONPRO)       || \
-       defined(CONFIG_MUCMC52)         || \
-       defined(CONFIG_O2DNT)           || \
-       defined(CONFIG_PM520)           || \
-       defined(CONFIG_TOP5200)         || \
-       defined(CONFIG_TQM5200)         || \
-       defined(CONFIG_UC101)           || \
-       defined(CONFIG_V38B)            || \
-       defined(CONFIG_MUNICES)
-# ifndef CONFIG_FEC_10MBIT
-       fec->xcv_type = MII100;
-# else
-       fec->xcv_type = MII10;
-# endif
-#elif defined(CONFIG_TOTAL5200)
-       fec->xcv_type = SEVENWIRE;
-#else
-#error fec->xcv_type not initialized.
-#endif
-
-       dev->priv = (void *)fec;
-       dev->iobase = MPC5XXX_FEC;
-       dev->init = mpc5xxx_fec_init;
-       dev->halt = mpc5xxx_fec_halt;
-       dev->send = mpc5xxx_fec_send;
-       dev->recv = mpc5xxx_fec_recv;
-
-       sprintf(dev->name, "FEC ETHERNET");
-       eth_register(dev);
-
-#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
-       miiphy_register (dev->name,
-                       fec5xxx_miiphy_read, fec5xxx_miiphy_write);
-#endif
-
-       /*
-        * Try to set the mac address now. The fec mac address is
-        * a garbage after reset. When not using fec for booting
-        * the Linux fec driver will try to work with this garbage.
-        */
-       tmp = getenv("ethaddr");
-       if (tmp) {
-               for (i=0; i<6; i++) {
-                       env_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
-                       if (tmp)
-                               tmp = (*end) ? end+1 : end;
-               }
-               mpc5xxx_fec_set_hwaddr(fec, env_enetaddr);
-       }
-
-       mpc5xxx_fec_init_phy(dev, bis);
-
-       return 1;
-}
-
-/* MII-interface related functions */
-/********************************************************************/
-int fec5xxx_miiphy_read(char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal)
-{
-       ethernet_regs *eth = (ethernet_regs *)MPC5XXX_FEC;
-       uint32 reg;             /* convenient holder for the PHY register */
-       uint32 phy;             /* convenient holder for the PHY */
-       int timeout = 0xffff;
-
-       /*
-        * reading from any PHY's register is done by properly
-        * programming the FEC's MII data register.
-        */
-       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
-       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
-
-       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | phy | reg);
-
-       /*
-        * wait for the related interrupt
-        */
-       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
-
-       if (timeout == 0) {
-#if (DEBUG & 0x2)
-               printf ("Read MDIO failed...\n");
-#endif
-               return -1;
-       }
-
-       /*
-        * clear mii interrupt bit
-        */
-       eth->ievent = 0x00800000;
-
-       /*
-        * it's now safe to read the PHY's register
-        */
-       *retVal = (uint16) eth->mii_data;
-
-       return 0;
-}
-
-/********************************************************************/
-int fec5xxx_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data)
-{
-       ethernet_regs *eth = (ethernet_regs *)MPC5XXX_FEC;
-       uint32 reg;             /* convenient holder for the PHY register */
-       uint32 phy;             /* convenient holder for the PHY */
-       int timeout = 0xffff;
-
-       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
-       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
-
-       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
-                       FEC_MII_DATA_TA | phy | reg | data);
-
-       /*
-        * wait for the MII interrupt
-        */
-       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
-
-       if (timeout == 0) {
-#if (DEBUG & 0x2)
-               printf ("Write MDIO failed...\n");
-#endif
-               return -1;
-       }
-
-       /*
-        * clear MII interrupt bit
-        */
-       eth->ievent = 0x00800000;
-
-       return 0;
-}
-
-#if (DEBUG & 0x40)
-static uint32 local_crc32(char *string, unsigned int crc_value, int len)
-{
-       int i;
-       char c;
-       unsigned int crc, count;
-
-       /*
-        * crc32 algorithm
-        */
-       /*
-        * crc = 0xffffffff; * The initialized value should be 0xffffffff
-        */
-       crc = crc_value;
-
-       for (i = len; --i >= 0;) {
-               c = *string++;
-               for (count = 0; count < 8; count++) {
-                       if ((c & 0x01) ^ (crc & 0x01)) {
-                               crc >>= 1;
-                               crc = crc ^ 0xedb88320;
-                       } else {
-                               crc >>= 1;
-                       }
-                       c >>= 1;
-               }
-       }
-
-       /*
-        * In big endian system, do byte swaping for crc value
-        */
-        /**/ return crc;
-}
-#endif /* DEBUG */
-
-#endif /* CONFIG_MPC5xxx_FEC */
diff --git a/cpu/mpc5xxx/fec.h b/cpu/mpc5xxx/fec.h
deleted file mode 100644 (file)
index 81756a5..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * (C) Copyright 2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * This file is based on mpc4200fec.h
- * (C) Copyright Motorola, Inc., 2000
- *
- * odin ethernet header file
- */
-
-#ifndef __MPC5XXX_FEC_H
-#define __MPC5XXX_FEC_H
-
-#include <common.h>
-#include <mpc5xxx.h>
-#include "sdma.h"
-
-typedef unsigned long uint32;
-typedef unsigned short uint16;
-typedef unsigned char uint8;
-
-typedef struct ethernet_register_set {
-
-/* [10:2]addr = 00 */
-
-/*  Control and status Registers (offset 000-1FF) */
-
-       volatile uint32 fec_id;                 /* MBAR_ETH + 0x000 */
-       volatile uint32 ievent;                 /* MBAR_ETH + 0x004 */
-       volatile uint32 imask;                  /* MBAR_ETH + 0x008 */
-
-       volatile uint32 RES0[1];                /* MBAR_ETH + 0x00C */
-       volatile uint32 r_des_active;           /* MBAR_ETH + 0x010 */
-       volatile uint32 x_des_active;           /* MBAR_ETH + 0x014 */
-       volatile uint32 r_des_active_cl;        /* MBAR_ETH + 0x018 */
-       volatile uint32 x_des_active_cl;        /* MBAR_ETH + 0x01C */
-       volatile uint32 ivent_set;              /* MBAR_ETH + 0x020 */
-       volatile uint32 ecntrl;                 /* MBAR_ETH + 0x024 */
-
-       volatile uint32 RES1[6];                /* MBAR_ETH + 0x028-03C */
-       volatile uint32 mii_data;               /* MBAR_ETH + 0x040 */
-       volatile uint32 mii_speed;              /* MBAR_ETH + 0x044 */
-       volatile uint32 mii_status;             /* MBAR_ETH + 0x048 */
-
-       volatile uint32 RES2[5];                /* MBAR_ETH + 0x04C-05C */
-       volatile uint32 mib_data;               /* MBAR_ETH + 0x060 */
-       volatile uint32 mib_control;            /* MBAR_ETH + 0x064 */
-
-       volatile uint32 RES3[6];                /* MBAR_ETH + 0x068-7C */
-       volatile uint32 r_activate;             /* MBAR_ETH + 0x080 */
-       volatile uint32 r_cntrl;                /* MBAR_ETH + 0x084 */
-       volatile uint32 r_hash;                 /* MBAR_ETH + 0x088 */
-       volatile uint32 r_data;                 /* MBAR_ETH + 0x08C */
-       volatile uint32 ar_done;                /* MBAR_ETH + 0x090 */
-       volatile uint32 r_test;                 /* MBAR_ETH + 0x094 */
-       volatile uint32 r_mib;                  /* MBAR_ETH + 0x098 */
-       volatile uint32 r_da_low;               /* MBAR_ETH + 0x09C */
-       volatile uint32 r_da_high;              /* MBAR_ETH + 0x0A0 */
-
-       volatile uint32 RES4[7];                /* MBAR_ETH + 0x0A4-0BC */
-       volatile uint32 x_activate;             /* MBAR_ETH + 0x0C0 */
-       volatile uint32 x_cntrl;                /* MBAR_ETH + 0x0C4 */
-       volatile uint32 backoff;                /* MBAR_ETH + 0x0C8 */
-       volatile uint32 x_data;                 /* MBAR_ETH + 0x0CC */
-       volatile uint32 x_status;               /* MBAR_ETH + 0x0D0 */
-       volatile uint32 x_mib;                  /* MBAR_ETH + 0x0D4 */
-       volatile uint32 x_test;                 /* MBAR_ETH + 0x0D8 */
-       volatile uint32 fdxfc_da1;              /* MBAR_ETH + 0x0DC */
-       volatile uint32 fdxfc_da2;              /* MBAR_ETH + 0x0E0 */
-       volatile uint32 paddr1;                 /* MBAR_ETH + 0x0E4 */
-       volatile uint32 paddr2;                 /* MBAR_ETH + 0x0E8 */
-       volatile uint32 op_pause;               /* MBAR_ETH + 0x0EC */
-
-       volatile uint32 RES5[4];                /* MBAR_ETH + 0x0F0-0FC */
-       volatile uint32 instr_reg;              /* MBAR_ETH + 0x100 */
-       volatile uint32 context_reg;            /* MBAR_ETH + 0x104 */
-       volatile uint32 test_cntrl;             /* MBAR_ETH + 0x108 */
-       volatile uint32 acc_reg;                /* MBAR_ETH + 0x10C */
-       volatile uint32 ones;                   /* MBAR_ETH + 0x110 */
-       volatile uint32 zeros;                  /* MBAR_ETH + 0x114 */
-       volatile uint32 iaddr1;                 /* MBAR_ETH + 0x118 */
-       volatile uint32 iaddr2;                 /* MBAR_ETH + 0x11C */
-       volatile uint32 gaddr1;                 /* MBAR_ETH + 0x120 */
-       volatile uint32 gaddr2;                 /* MBAR_ETH + 0x124 */
-       volatile uint32 random;                 /* MBAR_ETH + 0x128 */
-       volatile uint32 rand1;                  /* MBAR_ETH + 0x12C */
-       volatile uint32 tmp;                    /* MBAR_ETH + 0x130 */
-
-       volatile uint32 RES6[3];                /* MBAR_ETH + 0x134-13C */
-       volatile uint32 fifo_id;                /* MBAR_ETH + 0x140 */
-       volatile uint32 x_wmrk;                 /* MBAR_ETH + 0x144 */
-       volatile uint32 fcntrl;                 /* MBAR_ETH + 0x148 */
-       volatile uint32 r_bound;                /* MBAR_ETH + 0x14C */
-       volatile uint32 r_fstart;               /* MBAR_ETH + 0x150 */
-       volatile uint32 r_count;                /* MBAR_ETH + 0x154 */
-       volatile uint32 r_lag;                  /* MBAR_ETH + 0x158 */
-       volatile uint32 r_read;                 /* MBAR_ETH + 0x15C */
-       volatile uint32 r_write;                /* MBAR_ETH + 0x160 */
-       volatile uint32 x_count;                /* MBAR_ETH + 0x164 */
-       volatile uint32 x_lag;                  /* MBAR_ETH + 0x168 */
-       volatile uint32 x_retry;                /* MBAR_ETH + 0x16C */
-       volatile uint32 x_write;                /* MBAR_ETH + 0x170 */
-       volatile uint32 x_read;                 /* MBAR_ETH + 0x174 */
-
-       volatile uint32 RES7[2];                /* MBAR_ETH + 0x178-17C */
-       volatile uint32 fm_cntrl;               /* MBAR_ETH + 0x180 */
-       volatile uint32 rfifo_data;             /* MBAR_ETH + 0x184 */
-       volatile uint32 rfifo_status;           /* MBAR_ETH + 0x188 */
-       volatile uint32 rfifo_cntrl;            /* MBAR_ETH + 0x18C */
-       volatile uint32 rfifo_lrf_ptr;          /* MBAR_ETH + 0x190 */
-       volatile uint32 rfifo_lwf_ptr;          /* MBAR_ETH + 0x194 */
-       volatile uint32 rfifo_alarm;            /* MBAR_ETH + 0x198 */
-       volatile uint32 rfifo_rdptr;            /* MBAR_ETH + 0x19C */
-       volatile uint32 rfifo_wrptr;            /* MBAR_ETH + 0x1A0 */
-       volatile uint32 tfifo_data;             /* MBAR_ETH + 0x1A4 */
-       volatile uint32 tfifo_status;           /* MBAR_ETH + 0x1A8 */
-       volatile uint32 tfifo_cntrl;            /* MBAR_ETH + 0x1AC */
-       volatile uint32 tfifo_lrf_ptr;          /* MBAR_ETH + 0x1B0 */
-       volatile uint32 tfifo_lwf_ptr;          /* MBAR_ETH + 0x1B4 */
-       volatile uint32 tfifo_alarm;            /* MBAR_ETH + 0x1B8 */
-       volatile uint32 tfifo_rdptr;            /* MBAR_ETH + 0x1BC */
-       volatile uint32 tfifo_wrptr;            /* MBAR_ETH + 0x1C0 */
-
-       volatile uint32 reset_cntrl;            /* MBAR_ETH + 0x1C4 */
-       volatile uint32 xmit_fsm;               /* MBAR_ETH + 0x1C8 */
-
-       volatile uint32 RES8[3];                /* MBAR_ETH + 0x1CC-1D4 */
-       volatile uint32 rdes_data0;             /* MBAR_ETH + 0x1D8 */
-       volatile uint32 rdes_data1;             /* MBAR_ETH + 0x1DC */
-       volatile uint32 r_length;               /* MBAR_ETH + 0x1E0 */
-       volatile uint32 x_length;               /* MBAR_ETH + 0x1E4 */
-       volatile uint32 x_addr;                 /* MBAR_ETH + 0x1E8 */
-       volatile uint32 cdes_data;              /* MBAR_ETH + 0x1EC */
-       volatile uint32 status;                 /* MBAR_ETH + 0x1F0 */
-       volatile uint32 dma_control;            /* MBAR_ETH + 0x1F4 */
-       volatile uint32 des_cmnd;               /* MBAR_ETH + 0x1F8 */
-       volatile uint32 data;                   /* MBAR_ETH + 0x1FC */
-
-/*  MIB COUNTERS (Offset 200-2FF) */
-
-       volatile uint32 rmon_t_drop;            /* MBAR_ETH + 0x200 */
-       volatile uint32 rmon_t_packets;         /* MBAR_ETH + 0x204 */
-       volatile uint32 rmon_t_bc_pkt;          /* MBAR_ETH + 0x208 */
-       volatile uint32 rmon_t_mc_pkt;          /* MBAR_ETH + 0x20C */
-       volatile uint32 rmon_t_crc_align;       /* MBAR_ETH + 0x210 */
-       volatile uint32 rmon_t_undersize;       /* MBAR_ETH + 0x214 */
-       volatile uint32 rmon_t_oversize;        /* MBAR_ETH + 0x218 */
-       volatile uint32 rmon_t_frag;            /* MBAR_ETH + 0x21C */
-       volatile uint32 rmon_t_jab;             /* MBAR_ETH + 0x220 */
-       volatile uint32 rmon_t_col;             /* MBAR_ETH + 0x224 */
-       volatile uint32 rmon_t_p64;             /* MBAR_ETH + 0x228 */
-       volatile uint32 rmon_t_p65to127;        /* MBAR_ETH + 0x22C */
-       volatile uint32 rmon_t_p128to255;       /* MBAR_ETH + 0x230 */
-       volatile uint32 rmon_t_p256to511;       /* MBAR_ETH + 0x234 */
-       volatile uint32 rmon_t_p512to1023;      /* MBAR_ETH + 0x238 */
-       volatile uint32 rmon_t_p1024to2047;     /* MBAR_ETH + 0x23C */
-       volatile uint32 rmon_t_p_gte2048;       /* MBAR_ETH + 0x240 */
-       volatile uint32 rmon_t_octets;          /* MBAR_ETH + 0x244 */
-       volatile uint32 ieee_t_drop;            /* MBAR_ETH + 0x248 */
-       volatile uint32 ieee_t_frame_ok;        /* MBAR_ETH + 0x24C */
-       volatile uint32 ieee_t_1col;            /* MBAR_ETH + 0x250 */
-       volatile uint32 ieee_t_mcol;            /* MBAR_ETH + 0x254 */
-       volatile uint32 ieee_t_def;             /* MBAR_ETH + 0x258 */
-       volatile uint32 ieee_t_lcol;            /* MBAR_ETH + 0x25C */
-       volatile uint32 ieee_t_excol;           /* MBAR_ETH + 0x260 */
-       volatile uint32 ieee_t_macerr;          /* MBAR_ETH + 0x264 */
-       volatile uint32 ieee_t_cserr;           /* MBAR_ETH + 0x268 */
-       volatile uint32 ieee_t_sqe;             /* MBAR_ETH + 0x26C */
-       volatile uint32 t_fdxfc;                /* MBAR_ETH + 0x270 */
-       volatile uint32 ieee_t_octets_ok;       /* MBAR_ETH + 0x274 */
-
-       volatile uint32 RES9[2];                /* MBAR_ETH + 0x278-27C */
-       volatile uint32 rmon_r_drop;            /* MBAR_ETH + 0x280 */
-       volatile uint32 rmon_r_packets;         /* MBAR_ETH + 0x284 */
-       volatile uint32 rmon_r_bc_pkt;          /* MBAR_ETH + 0x288 */
-       volatile uint32 rmon_r_mc_pkt;          /* MBAR_ETH + 0x28C */
-       volatile uint32 rmon_r_crc_align;       /* MBAR_ETH + 0x290 */
-       volatile uint32 rmon_r_undersize;       /* MBAR_ETH + 0x294 */
-       volatile uint32 rmon_r_oversize;        /* MBAR_ETH + 0x298 */
-       volatile uint32 rmon_r_frag;            /* MBAR_ETH + 0x29C */
-       volatile uint32 rmon_r_jab;             /* MBAR_ETH + 0x2A0 */
-
-       volatile uint32 rmon_r_resvd_0;         /* MBAR_ETH + 0x2A4 */
-
-       volatile uint32 rmon_r_p64;             /* MBAR_ETH + 0x2A8 */
-       volatile uint32 rmon_r_p65to127;        /* MBAR_ETH + 0x2AC */
-       volatile uint32 rmon_r_p128to255;       /* MBAR_ETH + 0x2B0 */
-       volatile uint32 rmon_r_p256to511;       /* MBAR_ETH + 0x2B4 */
-       volatile uint32 rmon_r_p512to1023;      /* MBAR_ETH + 0x2B8 */
-       volatile uint32 rmon_r_p1024to2047;     /* MBAR_ETH + 0x2BC */
-       volatile uint32 rmon_r_p_gte2048;       /* MBAR_ETH + 0x2C0 */
-       volatile uint32 rmon_r_octets;          /* MBAR_ETH + 0x2C4 */
-       volatile uint32 ieee_r_drop;            /* MBAR_ETH + 0x2C8 */
-       volatile uint32 ieee_r_frame_ok;        /* MBAR_ETH + 0x2CC */
-       volatile uint32 ieee_r_crc;             /* MBAR_ETH + 0x2D0 */
-       volatile uint32 ieee_r_align;           /* MBAR_ETH + 0x2D4 */
-       volatile uint32 r_macerr;               /* MBAR_ETH + 0x2D8 */
-       volatile uint32 r_fdxfc;                /* MBAR_ETH + 0x2DC */
-       volatile uint32 ieee_r_octets_ok;       /* MBAR_ETH + 0x2E0 */
-
-       volatile uint32 RES10[6];               /* MBAR_ETH + 0x2E4-2FC */
-
-       volatile uint32 RES11[64];              /* MBAR_ETH + 0x300-3FF */
-} ethernet_regs;
-
-/* Receive & Transmit Buffer Descriptor definitions */
-typedef struct BufferDescriptor {
-       uint16 status;
-       uint16 dataLength;
-       uint32 dataPointer;
-} FEC_RBD;
-typedef struct {
-       uint16 status;
-       uint16 dataLength;
-       uint32 dataPointer;
-} FEC_TBD;
-
-/* private structure */
-typedef enum {
-       SEVENWIRE,                      /* 7-wire       */
-       MII10,                          /* MII 10Mbps   */
-       MII100                          /* MII 100Mbps  */
-} xceiver_type;
-
-typedef struct {
-       ethernet_regs *eth;
-       xceiver_type xcv_type;          /* transceiver type */
-       FEC_RBD *rbdBase;               /* RBD ring */
-       FEC_TBD *tbdBase;               /* TBD ring */
-       uint16 rbdIndex;                /* next receive BD to read */
-       uint16 tbdIndex;                /* next transmit BD to send */
-       uint16 usedTbdIndex;            /* next transmit BD to clean */
-       uint16 cleanTbdNum;             /* the number of available transmit BDs */
-} mpc5xxx_fec_priv;
-
-/* Ethernet parameter area */
-#define FEC_TBD_BASE           (FEC_PARAM_BASE + 0x00)
-#define FEC_TBD_NEXT           (FEC_PARAM_BASE + 0x04)
-#define FEC_RBD_BASE           (FEC_PARAM_BASE + 0x08)
-#define FEC_RBD_NEXT           (FEC_PARAM_BASE + 0x0c)
-
-/* BD Numer definitions */
-#define FEC_TBD_NUM            48      /* The user can adjust this value */
-#define FEC_RBD_NUM            32      /* The user can adjust this value */
-
-/* packet size limit */
-#define FEC_MAX_PKT_SIZE       1536
-
-/* RBD bits definitions */
-#define FEC_RBD_EMPTY          0x8000  /* Buffer is empty */
-#define FEC_RBD_WRAP           0x2000  /* Last BD in ring */
-#define FEC_RBD_INT            0x1000  /* Interrupt */
-#define FEC_RBD_LAST           0x0800  /* Buffer is last in frame(useless) */
-#define FEC_RBD_MISS           0x0100  /* Miss bit for prom mode */
-#define FEC_RBD_BC             0x0080  /* The received frame is broadcast frame */
-#define FEC_RBD_MC             0x0040  /* The received frame is multicast frame */
-#define FEC_RBD_LG             0x0020  /* Frame length violation */
-#define FEC_RBD_NO             0x0010  /* Nonoctet align frame */
-#define FEC_RBD_SH             0x0008  /* Short frame */
-#define FEC_RBD_CR             0x0004  /* CRC error */
-#define FEC_RBD_OV             0x0002  /* Receive FIFO overrun */
-#define FEC_RBD_TR             0x0001  /* Frame is truncated */
-#define FEC_RBD_ERR            (FEC_RBD_LG | FEC_RBD_NO | FEC_RBD_CR | \
-                               FEC_RBD_OV | FEC_RBD_TR)
-
-/* TBD bits definitions */
-#define FEC_TBD_READY          0x8000  /* Buffer is ready */
-#define FEC_TBD_WRAP           0x2000  /* Last BD in ring */
-#define FEC_TBD_INT            0x1000  /* Interrupt */
-#define FEC_TBD_LAST           0x0800  /* Buffer is last in frame */
-#define FEC_TBD_TC             0x0400  /* Transmit the CRC */
-#define FEC_TBD_ABC            0x0200  /* Append bad CRC */
-
-/* MII-related definitios */
-#define FEC_MII_DATA_ST                0x40000000      /* Start of frame delimiter */
-#define FEC_MII_DATA_OP_RD     0x20000000      /* Perform a read operation */
-#define FEC_MII_DATA_OP_WR     0x10000000      /* Perform a write operation */
-#define FEC_MII_DATA_PA_MSK    0x0f800000      /* PHY Address field mask */
-#define FEC_MII_DATA_RA_MSK    0x007c0000      /* PHY Register field mask */
-#define FEC_MII_DATA_TA                0x00020000      /* Turnaround */
-#define FEC_MII_DATA_DATAMSK   0x0000ffff      /* PHY data field */
-
-#define FEC_MII_DATA_RA_SHIFT  18      /* MII Register address bits */
-#define FEC_MII_DATA_PA_SHIFT  23      /* MII PHY address bits */
-
-#endif /* __MPC5XXX_FEC_H */
diff --git a/cpu/mpc5xxx/sdma.h b/cpu/mpc5xxx/sdma.h
deleted file mode 100644 (file)
index 8b740e4..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * (C) Copyright 2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * This file is based on code
- * (C) Copyright Motorola, Inc., 2000
- *
- * odin smartdma header file
- */
-
-#ifndef __MPC5XXX_SDMA_H
-#define __MPC5XXX_SDMA_H
-
-#include <common.h>
-#include <mpc5xxx.h>
-
-/* Task number assignment */
-#define FEC_RECV_TASK_NO            0
-#define FEC_XMIT_TASK_NO            1
-
-/*---------------------------------------------------------------------*/
-
-/* Stuff for Ethernet Tx/Rx tasks                                      */
-
-/*---------------------------------------------------------------------*/
-
-/* Layout of Ethernet controller Parameter SRAM area:
-----------------------------------------------------------------
-0x00: TBD_BASE, base address of TX BD ring
-0x04: TBD_NEXT, address of next TX BD to be processed
-0x08: RBD_BASE, base address of RX BD ring
-0x0C: RBD_NEXT, address of next RX BD to be processed
----------------------------------------------------------------
-ALL PARAMETERS ARE ALL LONGWORDS (FOUR BYTES EACH).
-*/
-
-/* base address of SRAM area to store parameters used by Ethernet tasks */
-#define FEC_PARAM_BASE         (MPC5XXX_SRAM + 0x0800)
-
-/* base address of SRAM area for buffer descriptors */
-#define FEC_BD_BASE            (MPC5XXX_SRAM + 0x0820)
-
-/*---------------------------------------------------------------------*/
-
-/* common shortcuts  used  by driver C code                            */
-
-/*---------------------------------------------------------------------*/
-
-/* Disable SmartDMA task */
-#define SDMA_TASK_DISABLE(tasknum)                     \
-{                                                      \
-    volatile ushort *tcr = (ushort *)(MPC5XXX_SDMA + 0x0000001c + 2 * tasknum); \
-    *tcr = (*tcr) & (~0x8000);                         \
-}
-
-/* Enable SmartDMA task */
-#define SDMA_TASK_ENABLE(tasknum)                      \
-{                                                      \
-    volatile ushort *tcr = (ushort *) (MPC5XXX_SDMA + 0x0000001c + 2 * tasknum); \
-    *tcr = (*tcr)  | 0x8000;                           \
-}
-
-/* Enable interrupt */
-#define SDMA_INT_ENABLE(tasknum)                       \
-{                                                      \
-    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
-    sdma->IntMask &= ~(1 << tasknum);                  \
-}
-
-/* Disable interrupt */
-#define SDMA_INT_DISABLE(tasknum)   \
-{                                                      \
-    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
-    sdma->IntMask |= (1 << tasknum);                   \
-}
-
-
-/* Clear interrupt pending bits */
-#define SDMA_CLEAR_IEVENT(tasknum)  \
-{                                                      \
-    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
-    sdma->IntPend = (1 << tasknum);                    \
-}
-
-/* get interupt pending bit of a task */
-#define SDMA_GET_PENDINGBIT(tasknum)                   \
-       ((*(vu_long *)(MPC5XXX_SDMA + 0x14)) & (1<<(tasknum)))
-
-/* get interupt mask bit of a task */
-#define SDMA_GET_MASKBIT(tasknum)                      \
-       ((*(vu_long *)(MPC5XXX_SDMA + 0x18)) & (1<<(tasknum)))
-
-#endif /* __MPC5XXX_SDMA_H */
index 001f2c1d3ac7d1da5d64eb37e16a589d9a506b63..15250d470dac36bf468a03406fe990f50f3b462b 100644 (file)
@@ -118,6 +118,7 @@ static inline void ppc4xx_ibm_ddr2_register_dump(void);
 
 #define ODS_FULL       0x00000000
 #define ODS_REDUCED    0x00000002
+#define OCD_CALIB_DEF  0x00000380
 
 /* defines for ODT (On Die Termination) of the 440SP(e) DDR2 controller */
 #define ODT_EB0R       (0x80000000 >> 8)
@@ -570,15 +571,24 @@ phys_size_t initdram(int board_type)
        mtsdram(SDRAM_MCOPT2,
                (val & ~(SDRAM_MCOPT2_SREN_MASK | SDRAM_MCOPT2_DCEN_MASK |
                         SDRAM_MCOPT2_IPTR_MASK | SDRAM_MCOPT2_ISIE_MASK)) |
-               (SDRAM_MCOPT2_DCEN_ENABLE | SDRAM_MCOPT2_IPTR_EXECUTE));
+                        SDRAM_MCOPT2_IPTR_EXECUTE);
 
        /*------------------------------------------------------------------
-        * Wait for SDRAM_CFG0_DC_EN to complete.
+        * Wait for IPTR_EXECUTE init sequence to complete.
         *-----------------------------------------------------------------*/
        do {
                mfsdram(SDRAM_MCSTAT, val);
        } while ((val & SDRAM_MCSTAT_MIC_MASK) == SDRAM_MCSTAT_MIC_NOTCOMP);
 
+       /* enable the controller only after init sequence completes */
+       mfsdram(SDRAM_MCOPT2, val);
+       mtsdram(SDRAM_MCOPT2, (val | SDRAM_MCOPT2_DCEN_ENABLE));
+
+       /* Make sure delay-line calibration is done before proceeding */
+       do {
+               mfsdram(SDRAM_DLCR, val);
+       } while (!(val & SDRAM_DLCR_DLCS_COMPLETE));
+
        /* get installed memory size */
        dram_size = sdram_memsize();
 
@@ -1343,22 +1353,50 @@ static void program_initplr(unsigned long *dimm_populated,
                emr = CMD_EMR | SELECT_EMR | odt | ods;
                emr2 = CMD_EMR | SELECT_EMR2;
                emr3 = CMD_EMR | SELECT_EMR3;
-               mtsdram(SDRAM_INITPLR0,  0xB5000000 | CMD_NOP);         /* NOP */
+               /* NOP - Wait 106 MemClk cycles */
+               mtsdram(SDRAM_INITPLR0, SDRAM_INITPLR_ENABLE | CMD_NOP |
+                                       SDRAM_INITPLR_IMWT_ENCODE(106));
                udelay(1000);
-               mtsdram(SDRAM_INITPLR1,  0x82000400 | CMD_PRECHARGE);   /* precharge 8 DDR clock cycle */
-               mtsdram(SDRAM_INITPLR2,  0x80800000 | emr2);            /* EMR2 */
-               mtsdram(SDRAM_INITPLR3,  0x80800000 | emr3);            /* EMR3 */
-               mtsdram(SDRAM_INITPLR4,  0x80800000 | emr);             /* EMR DLL ENABLE */
-               mtsdram(SDRAM_INITPLR5,  0x80800000 | mr | DLL_RESET);  /* MR w/ DLL reset */
+               /* precharge 4 MemClk cycles */
+               mtsdram(SDRAM_INITPLR1, SDRAM_INITPLR_ENABLE | CMD_PRECHARGE |
+                                       SDRAM_INITPLR_IMWT_ENCODE(4));
+               /* EMR2 - Wait tMRD (2 MemClk cycles) */
+               mtsdram(SDRAM_INITPLR2, SDRAM_INITPLR_ENABLE | emr2 |
+                                       SDRAM_INITPLR_IMWT_ENCODE(2));
+               /* EMR3 - Wait tMRD (2 MemClk cycles) */
+               mtsdram(SDRAM_INITPLR3, SDRAM_INITPLR_ENABLE | emr3 |
+                                       SDRAM_INITPLR_IMWT_ENCODE(2));
+               /* EMR DLL ENABLE - Wait tMRD (2 MemClk cycles) */
+               mtsdram(SDRAM_INITPLR4, SDRAM_INITPLR_ENABLE | emr |
+                                       SDRAM_INITPLR_IMWT_ENCODE(2));
+               /* MR w/ DLL reset - 200 cycle wait for DLL reset */
+               mtsdram(SDRAM_INITPLR5, SDRAM_INITPLR_ENABLE | mr | DLL_RESET |
+                                       SDRAM_INITPLR_IMWT_ENCODE(200));
                udelay(1000);
-               mtsdram(SDRAM_INITPLR6,  0x82000400 | CMD_PRECHARGE);   /* precharge 8 DDR clock cycle */
-               mtsdram(SDRAM_INITPLR7,  0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
-               mtsdram(SDRAM_INITPLR8,  0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
-               mtsdram(SDRAM_INITPLR9,  0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
-               mtsdram(SDRAM_INITPLR10, 0x8a000000 | CMD_REFRESH);     /* Refresh  50 DDR clock cycle */
-               mtsdram(SDRAM_INITPLR11, 0x80000000 | mr);              /* MR w/o DLL reset */
-               mtsdram(SDRAM_INITPLR12, 0x80800380 | emr);             /* EMR OCD Default */
-               mtsdram(SDRAM_INITPLR13, 0x80800000 | emr);             /* EMR OCD Exit */
+               /* precharge 4 MemClk cycles */
+               mtsdram(SDRAM_INITPLR6, SDRAM_INITPLR_ENABLE | CMD_PRECHARGE |
+                                       SDRAM_INITPLR_IMWT_ENCODE(4));
+               /* Refresh 25 MemClk cycles */
+               mtsdram(SDRAM_INITPLR7, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
+                                       SDRAM_INITPLR_IMWT_ENCODE(25));
+               /* Refresh 25 MemClk cycles */
+               mtsdram(SDRAM_INITPLR8, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
+                                       SDRAM_INITPLR_IMWT_ENCODE(25));
+               /* Refresh 25 MemClk cycles */
+               mtsdram(SDRAM_INITPLR9, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
+                                       SDRAM_INITPLR_IMWT_ENCODE(25));
+               /* Refresh 25 MemClk cycles */
+               mtsdram(SDRAM_INITPLR10, SDRAM_INITPLR_ENABLE | CMD_REFRESH |
+                                        SDRAM_INITPLR_IMWT_ENCODE(25));
+               /* MR w/o DLL reset - Wait tMRD (2 MemClk cycles) */
+               mtsdram(SDRAM_INITPLR11, SDRAM_INITPLR_ENABLE | mr |
+                                        SDRAM_INITPLR_IMWT_ENCODE(2));
+               /* EMR OCD Default - Wait tMRD (2 MemClk cycles) */
+               mtsdram(SDRAM_INITPLR12, SDRAM_INITPLR_ENABLE | OCD_CALIB_DEF |
+                                        SDRAM_INITPLR_IMWT_ENCODE(2) | emr);
+               /* EMR OCD Exit */
+               mtsdram(SDRAM_INITPLR13, SDRAM_INITPLR_ENABLE | emr |
+                                        SDRAM_INITPLR_IMWT_ENCODE(2));
        } else {
                printf("ERROR: ucode error as unknown DDR type in program_initplr");
                spd_ddr_init_hang ();
@@ -2466,12 +2504,13 @@ static void program_DQS_calibration(unsigned long *dimm_populated,
         * Program RFDC register
         * Set Feedback Fractional Oversample
         * Auto-detect read sample cycle enable
+        * Set RFOS to 1/4 of memclk cycle (0x3f)
         *-----------------------------------------------------------------*/
        mfsdram(SDRAM_RFDC, val);
        mtsdram(SDRAM_RFDC,
                (val & ~(SDRAM_RFDC_ARSE_MASK | SDRAM_RFDC_RFOS_MASK |
                         SDRAM_RFDC_RFFD_MASK))
-               | (SDRAM_RFDC_ARSE_ENABLE | SDRAM_RFDC_RFOS_ENCODE(0) |
+               | (SDRAM_RFDC_ARSE_ENABLE | SDRAM_RFDC_RFOS_ENCODE(0x3f) |
                   SDRAM_RFDC_RFFD_ENCODE(0)));
 
        DQS_calibration_process();
index 72acfd01b5e6f685fc02fdfbfd5ebcad1a241605..7d96e796d16b675a54a1cc43eb3af1954c990e6e 100644 (file)
@@ -149,6 +149,10 @@ static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
 }
 #endif /* #ifndef CONFIG_NAND_SPL */
 
+#ifndef CFG_NAND_BCR
+#define CFG_NAND_BCR 0x80002222
+#endif
+
 void board_nand_select_device(struct nand_chip *nand, int chip)
 {
        /*
@@ -161,7 +165,14 @@ void board_nand_select_device(struct nand_chip *nand, int chip)
        /* Set NandFlash Core Configuration Register */
        /* 1 col x 2 rows */
        out_be32((u32 *)(base + NDFC_CCR), 0x00000000 | (cs << 24));
-       out_be32((u32 *)(base + NDFC_BCFG0 + (cs << 2)), 0x80002222);
+       out_be32((u32 *)(base + NDFC_BCFG0 + (cs << 2)), CFG_NAND_BCR);
+}
+
+static void ndfc_select_chip(struct mtd_info *mtd, int chip)
+{
+       /*
+        * Nothing to do here!
+        */
 }
 
 int board_nand_init(struct nand_chip *nand)
@@ -192,6 +203,7 @@ int board_nand_init(struct nand_chip *nand)
        nand->ecc.mode = NAND_ECC_HW;
        nand->ecc.size = 256;
        nand->ecc.bytes = 3;
+       nand->select_chip = ndfc_select_chip;
 
 #ifndef CONFIG_NAND_SPL
        nand->write_buf  = ndfc_write_buf;
index 7944c6c3c2e27799e23a15c20e6fba5539e0461e..a95d1cb17d9ef34d37db7ca2c7f388025e29b416 100644 (file)
@@ -129,11 +129,11 @@ void external_interrupt(struct pt_regs *regs)
                uic_interrupt(UIC3_DCR_BASE, 96);
 #endif
 
+       mtdcr(uic0sr, (uic_msr & UICB0_ALL));
+
        if (uic_msr & ~(UICB0_ALL))
                uic_interrupt(UIC0_DCR_BASE, 0);
 
-       mtdcr(uic0sr, uic_msr);
-
        return;
 }
 
diff --git a/cpu/sh2/Makefile b/cpu/sh2/Makefile
new file mode 100644 (file)
index 0000000..50f6720
--- /dev/null
@@ -0,0 +1,49 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# Copyright (C) 2007,2008 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+# Copyright (C) 2008 Renesas Solutions Corp.
+#
+# 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$(CPU).a
+
+START  = start.o
+OBJS   = cpu.o interrupts.o watchdog.o time.o # cache.o
+
+all:   .depend $(START) $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+.depend:       Makefile $(START:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/cpu/sh2/cache.c b/cpu/sh2/cache.c
new file mode 100644 (file)
index 0000000..b5c47cf
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * (C) Copyright 2007
+ * Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
+ *
+ * Copyright (C) 2007, 2008 Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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 <command.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+
+/*
+ * Jump to P2 area.
+ * When handling TLB or caches, we need to do it from P2 area.
+ */
+#define jump_to_P2()                   \
+do {                                   \
+       unsigned long __dummy;          \
+       __asm__ __volatile__(           \
+               "mov.l  1f, %0\n\t"     \
+               "or     %1, %0\n\t"     \
+               "jmp    @%0\n\t"        \
+               " nop\n\t"              \
+               ".balign 4\n"           \
+               "1:     .long 2f\n"     \
+               "2:"                    \
+               : "=&r" (__dummy)       \
+               : "r" (0x20000000));    \
+} while (0)
+
+/*
+ * Back to P1 area.
+ */
+#define back_to_P1()                   \
+do {                                   \
+       unsigned long __dummy;          \
+       __asm__ __volatile__(           \
+               "nop;nop;nop;nop;nop;nop;nop\n\t"       \
+               "mov.l  1f, %0\n\t"     \
+               "jmp    @%0\n\t"        \
+               " nop\n\t"              \
+               ".balign 4\n"           \
+               "1:     .long 2f\n"     \
+               "2:"                    \
+               : "=&r" (__dummy));     \
+} while (0)
+
+#define CACHE_VALID    1
+#define CACHE_UPDATED  2
+
+static inline void cache_wback_all(void)
+{
+       unsigned long addr, data, i, j;
+
+       jump_to_P2();
+       for (i = 0; i < CACHE_OC_NUM_ENTRIES; i++) {
+               for (j = 0; j < CACHE_OC_NUM_WAYS; j++) {
+                       addr = CACHE_OC_ADDRESS_ARRAY
+                               | (j << CACHE_OC_WAY_SHIFT)
+                               | (i << CACHE_OC_ENTRY_SHIFT);
+                       data = inl(addr);
+                       if (data & CACHE_UPDATED) {
+                               data &= ~CACHE_UPDATED;
+                               outl(data, addr);
+                       }
+               }
+       }
+       back_to_P1();
+}
+
+
+#define CACHE_ENABLE   0
+#define CACHE_DISABLE  1
+
+int cache_control(unsigned int cmd)
+{
+       unsigned long ccr;
+
+       jump_to_P2();
+       ccr = inl(CCR);
+
+       if (ccr & CCR_CACHE_ENABLE)
+               cache_wback_all();
+
+       if (cmd == CACHE_DISABLE)
+               outl(CCR_CACHE_STOP, CCR);
+       else
+               outl(CCR_CACHE_INIT, CCR);
+       back_to_P1();
+
+       return 0;
+}
diff --git a/cpu/sh2/config.mk b/cpu/sh2/config.mk
new file mode 100644 (file)
index 0000000..52d5a0f
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# (C) Copyright 2007-2008
+# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+#
+# 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
+#
+#
+PLATFORM_CPPFLAGS += -m3e -mb
+PLATFORM_RELFLAGS += -ffixed-r13
+PLATFORM_LDFLAGS += -EB
diff --git a/cpu/sh2/cpu.c b/cpu/sh2/cpu.c
new file mode 100644 (file)
index 0000000..e0cb047
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2007,2008 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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 <command.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+
+#define STBCR4      0xFFFE040C
+#define cmt_clock_enable() do {\
+               writeb(readb(STBCR4) & ~0x04, STBCR4);\
+       } while (0)
+#define scif0_enable() do {\
+               writeb(readb(STBCR4) & ~0x80, STBCR4);\
+       } while (0)
+
+int checkcpu(void)
+{
+#if defined(CONFIG_SH2A)
+       puts("CPU: SH2A\n");
+#else
+       puts("CPU: SH2\n");
+#endif
+       return 0;
+}
+
+int cpu_init(void)
+{
+       /* SCIF enable */
+       scif0_enable();
+       /* CMT clock enable */
+       cmt_clock_enable() ;
+       return 0;
+}
+
+int cleanup_before_linux(void)
+{
+       disable_interrupts();
+       return 0;
+}
+
+int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       disable_interrupts();
+       reset_cpu(0);
+       return 0;
+}
+
+void flush_cache(unsigned long addr, unsigned long size)
+{
+
+}
+
+void icache_enable(void)
+{
+}
+
+void icache_disable(void)
+{
+}
+
+int icache_status(void)
+{
+       return 0;
+}
+
+void dcache_enable(void)
+{
+}
+
+void dcache_disable(void)
+{
+}
+
+int dcache_status(void)
+{
+       return 0;
+}
diff --git a/cpu/sh2/interrupts.c b/cpu/sh2/interrupts.c
new file mode 100644 (file)
index 0000000..fe6ff3a
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2007,2008 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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>
+
+int interrupt_init(void)
+{
+       return 0;
+}
+
+void enable_interrupts(void)
+{
+
+}
+
+int disable_interrupts(void)
+{
+       return 0;
+}
diff --git a/cpu/sh2/start.S b/cpu/sh2/start.S
new file mode 100644 (file)
index 0000000..c4fa688
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2007,2008 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+
+ * 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>
+
+       .text
+       .align  2
+
+       .global _start
+_start:
+       .long 0x00000010        /* Ppower ON reset PC*/
+       .long 0x00000000
+       .long 0x00000010        /* Manual reset PC */
+       .long 0x00000000
+_init:
+       mov.l   ._lowlevel_init, r0
+100:   bsrf    r0
+       nop
+       bsr     1f
+       nop
+1:     sts     pr, r5
+       mov.l   ._reloc_dst, r4
+       add     #(_start-1b), r5
+       mov.l   ._reloc_dst_end, r6
+
+2:     mov.l   @r5+, r1
+       mov.l   r1, @r4
+       add     #4, r4
+       cmp/hs  r6, r4
+       bf      2b
+
+       mov.l   ._bss_start, r4
+       mov.l   ._bss_end, r5
+       mov     #0, r1
+
+3:     mov.l   r1, @r4                 /* bss clear */
+       add     #4, r4
+       cmp/hs  r5, r4
+       bf      3b
+
+       mov.l   ._gd_init, r13          /* global data */
+       mov.l   ._stack_init, r15       /* stack */
+
+       mov.l   ._sh_generic_init, r0
+       jsr     @r0
+       nop
+
+loop:
+       bra     loop
+
+       .align  2
+
+._lowlevel_init:       .long   (lowlevel_init - (100b + 4))
+._reloc_dst:           .long   reloc_dst
+._reloc_dst_end:       .long   reloc_dst_end
+._bss_start:           .long   bss_start
+._bss_end:             .long   bss_end
+._gd_init:             .long   (_start - CFG_GBL_DATA_SIZE)
+._stack_init:  .long   (_start - CFG_GBL_DATA_SIZE - CFG_MALLOC_LEN - 16)
+._sh_generic_init:     .long   sh_generic_init
diff --git a/cpu/sh2/time.c b/cpu/sh2/time.c
new file mode 100644 (file)
index 0000000..d6eb0cb
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2007,2008 Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * (C) Copyright 2003
+ * 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 <common.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+
+#define CMT_CMCSR_INIT  0x0001 /* PCLK/32 */
+#define CMT_CMCSR_CALIB 0x0000
+#define CMT_MAX_COUNTER (0xFFFFFFFF)
+#define CMT_TIMER_RESET (0xFFFF)
+
+static vu_long cmt0_timer;
+
+static void cmt_timer_start(unsigned int timer)
+{
+       writew(readw(CMSTR) | 0x01, CMSTR);
+}
+
+static void cmt_timer_stop(unsigned int timer)
+{
+       writew(readw(CMSTR) & ~0x01, CMSTR);
+}
+
+int timer_init(void)
+{
+       cmt0_timer = 0;
+       /* Divide clock by 32 */
+       readw(CMCSR_0);
+       writew(CMT_CMCSR_INIT, CMCSR_0);
+
+       /* User Device 0 only */
+       cmt_timer_stop(0);
+       set_timer(CMT_TIMER_RESET);
+       cmt_timer_start(0);
+
+       return 0;
+}
+
+unsigned long long get_ticks(void)
+{
+       return cmt0_timer;
+}
+
+static vu_long cmcnt;
+ulong get_timer(ulong base)
+{
+       ulong data = readw(CMCNT_0);
+
+       if (data >= cmcnt)
+               cmcnt = data - cmcnt;
+       else
+               cmcnt = (CMT_TIMER_RESET - cmcnt) + data;
+
+       if ((cmt0_timer + cmcnt) > CMT_MAX_COUNTER)
+               cmt0_timer = ((cmt0_timer + cmcnt) - CMT_MAX_COUNTER);
+       else
+               cmt0_timer += cmcnt;
+
+       cmcnt = data;
+       return cmt0_timer - base;
+}
+
+void set_timer(ulong t)
+{
+       writew((u16) t, CMCOR_0);
+}
+
+void reset_timer(void)
+{
+       cmt_timer_stop(0);
+       set_timer(CMT_TIMER_RESET);
+       cmt0_timer = 0;
+       cmt_timer_start(0);
+}
+
+void udelay(unsigned long usec)
+{
+       unsigned int start = get_timer(0);
+
+       while (get_timer((ulong) start) < (usec * (CFG_HZ / 1000000)))
+               continue;
+}
+
+unsigned long get_tbclk(void)
+{
+       return CFG_HZ;
+}
diff --git a/cpu/sh2/watchdog.c b/cpu/sh2/watchdog.c
new file mode 100644 (file)
index 0000000..de0254b
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhoro@renesas.com>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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/processor.h>
+
+int watchdog_init(void)
+{
+       return 0;
+}
+
+void reset_cpu(unsigned long ignored)
+{
+       while (1)
+               ;
+}
diff --git a/doc/README.sh7785lcr b/doc/README.sh7785lcr
new file mode 100644 (file)
index 0000000..0770276
--- /dev/null
@@ -0,0 +1,83 @@
+========================================
+Renesas Technology R0P7785LC0011RL board
+========================================
+
+This board specification:
+=========================
+
+The R0P7785LC0011RL(board config name:sh7785lcr) has the following device:
+
+ - SH7785 (SH-4A)
+ - DDR2-SDRAM 512MB
+ - NOR Flash 64MB
+ - 2D Graphic controller
+ - SATA controller
+ - Ethernet controller
+ - USB host/peripheral controller
+ - SD controller
+ - I2C controller
+ - RTC
+
+This board has 2 physical memory maps. It can be changed with DIP switch(S2-5).
+
+ phys address                  | S2-5 = OFF    | S2-5 = ON
+ -------------------------------+---------------+---------------
+ 0x00000000 - 0x03ffffff(CS0)  | NOR Flash     | NOR Flash
+ 0x04000000 - 0x05ffffff(CS1)  | PLD           | PLD
+ 0x06000000 - 0x07ffffff(CS1)  | reserved      | I2C
+ 0x08000000 - 0x0bffffff(CS2)  | USB           | DDR SDRAM
+ 0x0c000000 - 0x0fffffff(CS3)  | SD            | DDR SDRAM
+ 0x10000000 - 0x13ffffff(CS4)  | SM107         | SM107
+ 0x14000000 - 0x17ffffff(CS5)  | I2C           | USB
+ 0x18000000 - 0x1bffffff(CS6)  | reserved      | SD
+ 0x40000000 - 0x5fffffff       | DDR SDRAM     | (cannot use)
+
+
+This board specific command:
+============================
+
+This board has the following its specific command:
+
+ - hwtest
+ - printmac
+ - setmac
+
+
+1. hwtest
+
+This is self-check command. This command has the following options:
+
+ - all         : test all hardware
+ - pld         : output PLD version
+ - led         : turn on LEDs
+ - dipsw       : test DIP switch
+ - sm107       : output SM107 version
+ - net         : check RTL8110 ID
+ - sata                : check SiI3512 ID
+ - net         : output PCI slot device ID
+
+i.e)
+=> hwtest led
+turn on LEDs 3, 5, 7, 9
+turn on LEDs 4, 6, 8, 10
+
+=> hwtest net
+Ethernet OK
+
+
+2. printmac
+
+This command outputs MAC address of this board.
+
+i.e)
+=> printmac
+MAC = 00:00:87:**:**:**
+
+
+3. setmac
+
+This command writes MAC address of this board.
+
+i.e)
+=> setmac 00:00:87:**:**:**
+
index b7b3a75bc952700ef9a64e365281e75a09578d00..264553dfa84078d48ae5b24249da0ee8913b18fa 100644 (file)
@@ -76,12 +76,20 @@ static const struct fsl_i2c *i2c_dev[2] = {
  * For this table, the values are based on a value of 1 for the DFSR
  * register.  See the application note AN2919 "Determining the I2C Frequency
  * Divider Ratio for SCL"
+ *
+ * ColdFire I2C frequency dividers for FDR values are different from
+ * PowerPC. The protocol to use the I2C module is still the same.
+ * A different table is defined and are based on MCF5xxx user manual.
+ *
  */
 static const struct {
        unsigned short divider;
+#ifdef __PPC__
        u8 dfsr;
+#endif
        u8 fdr;
 } fsl_i2c_speed_map[] = {
+#ifdef __PPC__
        {160, 1, 32}, {192, 1, 33}, {224, 1, 34}, {256, 1, 35},
        {288, 1, 0}, {320, 1, 1}, {352, 6, 1}, {384, 1, 2}, {416, 6, 2},
        {448, 1, 38}, {480, 1, 3}, {512, 1, 39}, {544, 11, 3}, {576, 1, 4},
@@ -98,6 +106,25 @@ static const struct {
        {20480, 1, 25}, {24576, 1, 26}, {28672, 1, 62}, {30720, 1, 27},
        {32768, 1, 63}, {36864, 1, 28}, {40960, 1, 29}, {49152, 1, 30},
        {61440, 1, 31}, {-1, 1, 31}
+#elif defined(__M68K__)
+       {20, 32}, {22, 33}, {24, 34}, {26, 35},
+       {28, 0}, {28, 36}, {30, 1}, {32, 37},
+       {34, 2}, {36, 38}, {40, 3}, {40, 39},
+       {44, 4}, {48, 5}, {48, 40}, {56, 6},
+       {56, 41}, {64, 42}, {68, 7}, {72, 43},
+       {80, 8}, {80, 44}, {88, 9}, {96, 41},
+       {104, 10}, {112, 42}, {128, 11}, {128, 43},
+       {144, 12}, {160, 13}, {160, 48}, {192, 14},
+       {192, 49}, {224, 50}, {240, 15}, {256, 51},
+       {288, 16}, {320, 17}, {320, 52}, {384, 18},
+       {384, 53}, {448, 54}, {480, 19}, {512, 55},
+       {576, 20}, {640, 21}, {640, 56}, {768, 22},
+       {768, 57}, {960, 23}, {896, 58}, {1024, 59},
+       {1152, 24}, {1280, 25}, {1280, 60}, {1536, 26},
+       {1536, 61}, {1792, 62}, {1920, 27}, {2048, 63},
+       {2304, 28}, {2560, 29}, {3072, 30}, {3840, 31},
+       {-1, 31}
+#endif
 };
 
 /**
@@ -126,12 +153,17 @@ static unsigned int set_i2c_bus_speed(const struct fsl_i2c *dev,
 
        for (i = 0; i < ARRAY_SIZE(fsl_i2c_speed_map); i++)
                if (fsl_i2c_speed_map[i].divider >= divider) {
-                       u8 fdr, dfsr;
+                       u8 fdr;
+#ifdef __PPC__
+                       u8 dfsr;
                        dfsr = fsl_i2c_speed_map[i].dfsr;
+#endif
                        fdr = fsl_i2c_speed_map[i].fdr;
                        speed = i2c_clk / fsl_i2c_speed_map[i].divider;
                        writeb(fdr, &dev->fdr);         /* set bus speed */
+#ifdef __PPC__
                        writeb(dfsr, &dev->dfsrr);      /* set default filter */
+#endif
                        break;
                }
 
index 19233105a20653e55aa55911cc351679a29a66d9..b0abe6e52343b0d0d91a1022f1ebf2ef9126aca1 100644 (file)
@@ -37,6 +37,7 @@ endif
 
 COBJS-$(CONFIG_NAND_FSL_ELBC) += fsl_elbc_nand.o
 COBJS-$(CONFIG_NAND_FSL_UPM) += fsl_upm.o
+COBJS-$(CONFIG_NAND_S3C64XX) += s3c64xx.o
 endif
 
 COBJS  := $(COBJS-y)
diff --git a/drivers/mtd/nand/s3c64xx.c b/drivers/mtd/nand/s3c64xx.c
new file mode 100644 (file)
index 0000000..159fe76
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * (C) Copyright 2006 DENX Software Engineering
+ *
+ * Implementation for U-Boot 1.1.6 by Samsung
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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 <common.h>
+
+#include <nand.h>
+#include <s3c6400.h>
+
+#include <asm/io.h>
+#include <asm/errno.h>
+
+#define MAX_CHIPS      2
+static int nand_cs[MAX_CHIPS] = {0, 1};
+
+#ifdef CONFIG_NAND_SPL
+#define printf(arg...) do {} while (0)
+#endif
+
+/* Nand flash definition values by jsgood */
+#ifdef S3C_NAND_DEBUG
+/*
+ * Function to print out oob buffer for debugging
+ * Written by jsgood
+ */
+static void print_oob(const char *header, struct mtd_info *mtd)
+{
+       int i;
+       struct nand_chip *chip = mtd->priv;
+
+       printf("%s:\t", header);
+
+       for (i = 0; i < 64; i++)
+               printf("%02x ", chip->oob_poi[i]);
+
+       printf("\n");
+}
+#endif /* S3C_NAND_DEBUG */
+
+#ifdef CONFIG_NAND_SPL
+static u_char nand_read_byte(struct mtd_info *mtd)
+{
+       struct nand_chip *this = mtd->priv;
+       return readb(this->IO_ADDR_R);
+}
+
+static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
+{
+       int i;
+       struct nand_chip *this = mtd->priv;
+
+       for (i = 0; i < len; i++)
+               writeb(buf[i], this->IO_ADDR_W);
+}
+
+static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
+{
+       int i;
+       struct nand_chip *this = mtd->priv;
+
+       for (i = 0; i < len; i++)
+               buf[i] = readb(this->IO_ADDR_R);
+}
+#endif
+
+static void s3c_nand_select_chip(struct mtd_info *mtd, int chip)
+{
+       int ctrl = readl(NFCONT);
+
+       switch (chip) {
+       case -1:
+               ctrl |= 6;
+               break;
+       case 0:
+               ctrl &= ~2;
+               break;
+       case 1:
+               ctrl &= ~4;
+               break;
+       default:
+               return;
+       }
+
+       writel(ctrl, NFCONT);
+}
+
+/*
+ * Hardware specific access to control-lines function
+ * Written by jsgood
+ */
+static void s3c_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
+{
+       struct nand_chip *this = mtd->priv;
+
+       if (ctrl & NAND_CTRL_CHANGE) {
+               if (ctrl & NAND_CLE)
+                       this->IO_ADDR_W = (void __iomem *)NFCMMD;
+               else if (ctrl & NAND_ALE)
+                       this->IO_ADDR_W = (void __iomem *)NFADDR;
+               else
+                       this->IO_ADDR_W = (void __iomem *)NFDATA;
+               if (ctrl & NAND_NCE)
+                       s3c_nand_select_chip(mtd, *(int *)this->priv);
+               else
+                       s3c_nand_select_chip(mtd, -1);
+       }
+
+       if (cmd != NAND_CMD_NONE)
+               writeb(cmd, this->IO_ADDR_W);
+}
+
+/*
+ * Function for checking device ready pin
+ * Written by jsgood
+ */
+static int s3c_nand_device_ready(struct mtd_info *mtdinfo)
+{
+       return !!(readl(NFSTAT) & NFSTAT_RnB);
+}
+
+#ifdef CFG_S3C_NAND_HWECC
+/*
+ * This function is called before encoding ecc codes to ready ecc engine.
+ * Written by jsgood
+ */
+static void s3c_nand_enable_hwecc(struct mtd_info *mtd, int mode)
+{
+       u_long nfcont, nfconf;
+
+       /*
+        * The original driver used 4-bit ECC for "new" MLC chips, i.e., for
+        * those with non-zero ID[3][3:2], which anyway only holds for ST
+        * (Numonyx) chips
+        */
+       nfconf = readl(NFCONF) & ~NFCONF_ECC_4BIT;
+
+       writel(nfconf, NFCONF);
+
+       /* Initialize & unlock */
+       nfcont = readl(NFCONT);
+       nfcont |= NFCONT_INITECC;
+       nfcont &= ~NFCONT_MECCLOCK;
+
+       if (mode == NAND_ECC_WRITE)
+               nfcont |= NFCONT_ECC_ENC;
+       else if (mode == NAND_ECC_READ)
+               nfcont &= ~NFCONT_ECC_ENC;
+
+       writel(nfcont, NFCONT);
+}
+
+/*
+ * This function is called immediately after encoding ecc codes.
+ * This function returns encoded ecc codes.
+ * Written by jsgood
+ */
+static int s3c_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
+                                 u_char *ecc_code)
+{
+       u_long nfcont, nfmecc0;
+
+       /* Lock */
+       nfcont = readl(NFCONT);
+       nfcont |= NFCONT_MECCLOCK;
+       writel(nfcont, NFCONT);
+
+       nfmecc0 = readl(NFMECC0);
+
+       ecc_code[0] = nfmecc0 & 0xff;
+       ecc_code[1] = (nfmecc0 >> 8) & 0xff;
+       ecc_code[2] = (nfmecc0 >> 16) & 0xff;
+       ecc_code[3] = (nfmecc0 >> 24) & 0xff;
+
+       return 0;
+}
+
+/*
+ * This function determines whether read data is good or not.
+ * If SLC, must write ecc codes to controller before reading status bit.
+ * If MLC, status bit is already set, so only reading is needed.
+ * If status bit is good, return 0.
+ * If correctable errors occured, do that.
+ * If uncorrectable errors occured, return -1.
+ * Written by jsgood
+ */
+static int s3c_nand_correct_data(struct mtd_info *mtd, u_char *dat,
+                                u_char *read_ecc, u_char *calc_ecc)
+{
+       int ret = -1;
+       u_long nfestat0, nfmeccdata0, nfmeccdata1, err_byte_addr;
+       u_char err_type, repaired;
+
+       /* SLC: Write ecc to compare */
+       nfmeccdata0 = (calc_ecc[1] << 16) | calc_ecc[0];
+       nfmeccdata1 = (calc_ecc[3] << 16) | calc_ecc[2];
+       writel(nfmeccdata0, NFMECCDATA0);
+       writel(nfmeccdata1, NFMECCDATA1);
+
+       /* Read ecc status */
+       nfestat0 = readl(NFESTAT0);
+       err_type = nfestat0 & 0x3;
+
+       switch (err_type) {
+       case 0: /* No error */
+               ret = 0;
+               break;
+
+       case 1:
+               /*
+                * 1 bit error (Correctable)
+                * (nfestat0 >> 7) & 0x7ff      :error byte number
+                * (nfestat0 >> 4) & 0x7        :error bit number
+                */
+               err_byte_addr = (nfestat0 >> 7) & 0x7ff;
+               repaired = dat[err_byte_addr] ^ (1 << ((nfestat0 >> 4) & 0x7));
+
+               printf("S3C NAND: 1 bit error detected at byte %ld. "
+                      "Correcting from 0x%02x to 0x%02x...OK\n",
+                      err_byte_addr, dat[err_byte_addr], repaired);
+
+               dat[err_byte_addr] = repaired;
+
+               ret = 1;
+               break;
+
+       case 2: /* Multiple error */
+       case 3: /* ECC area error */
+               printf("S3C NAND: ECC uncorrectable error detected. "
+                      "Not correctable.\n");
+               ret = -1;
+               break;
+       }
+
+       return ret;
+}
+#endif /* CFG_S3C_NAND_HWECC */
+
+/*
+ * Board-specific NAND initialization. The following members of the
+ * argument are board-specific (per include/linux/mtd/nand.h):
+ * - IO_ADDR_R?: address to read the 8 I/O lines of the flash device
+ * - IO_ADDR_W?: address to write the 8 I/O lines of the flash device
+ * - hwcontrol: hardwarespecific function for accesing control-lines
+ * - dev_ready: hardwarespecific function for  accesing device ready/busy line
+ * - enable_hwecc?: function to enable (reset)  hardware ecc generator. Must
+ *   only be provided if a hardware ECC is available
+ * - eccmode: mode of ecc, see defines
+ * - chip_delay: chip dependent delay for transfering data from array to
+ *   read regs (tR)
+ * - options: various chip options. They can partly be set to inform
+ *   nand_scan about special functionality. See the defines for further
+ *   explanation
+ * Members with a "?" were not set in the merged testing-NAND branch,
+ * so they are not set here either.
+ */
+int board_nand_init(struct nand_chip *nand)
+{
+       static int chip_n;
+
+       if (chip_n >= MAX_CHIPS)
+               return -ENODEV;
+
+       NFCONT_REG = (NFCONT_REG & ~NFCONT_WP) | NFCONT_ENABLE | 0x6;
+
+       nand->IO_ADDR_R         = (void __iomem *)NFDATA;
+       nand->IO_ADDR_W         = (void __iomem *)NFDATA;
+       nand->cmd_ctrl          = s3c_nand_hwcontrol;
+       nand->dev_ready         = s3c_nand_device_ready;
+       nand->select_chip       = s3c_nand_select_chip;
+       nand->options           = 0;
+#ifdef CONFIG_NAND_SPL
+       nand->read_byte         = nand_read_byte;
+       nand->write_buf         = nand_write_buf;
+       nand->read_buf          = nand_read_buf;
+#endif
+
+#ifdef CFG_S3C_NAND_HWECC
+       nand->ecc.hwctl         = s3c_nand_enable_hwecc;
+       nand->ecc.calculate     = s3c_nand_calculate_ecc;
+       nand->ecc.correct       = s3c_nand_correct_data;
+
+       /*
+        * If you get more than 1 NAND-chip with different page-sizes on the
+        * board one day, it will get more complicated...
+        */
+       nand->ecc.mode          = NAND_ECC_HW;
+       nand->ecc.size          = CFG_NAND_ECCSIZE;
+       nand->ecc.bytes         = CFG_NAND_ECCBYTES;
+#else
+       nand->ecc.mode          = NAND_ECC_SOFT;
+#endif /* ! CFG_S3C_NAND_HWECC */
+
+       nand->priv              = nand_cs + chip_n++;
+
+       return 0;
+}
index bcf31cbe278a41fc6e95c380e967a6eeace4370d..a084000a9384a7339519876308e547d762978f49 100644 (file)
@@ -41,6 +41,8 @@ COBJS-$(CONFIG_DRIVER_KS8695ETH) += ks8695eth.o
 COBJS-$(CONFIG_DRIVER_LAN91C96) += lan91c96.o
 COBJS-$(CONFIG_MACB) += macb.o
 COBJS-$(CONFIG_MCFFEC) += mcffec.o
+COBJS-$(CONFIG_MPC5xxx_FEC) += mpc5xxx_fec.o
+COBJS-$(CONFIG_MPC512x_FEC) += mpc512x_fec.o
 COBJS-$(CONFIG_NATSEMI) += natsemi.o
 ifeq ($(CONFIG_DRIVER_NE2000),y)
 COBJS-y += ne2000.o
diff --git a/drivers/net/mpc512x_fec.c b/drivers/net/mpc512x_fec.c
new file mode 100644 (file)
index 0000000..7caeeda
--- /dev/null
@@ -0,0 +1,794 @@
+/*
+ * (C) Copyright 2003-2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * Derived from the MPC8xx FEC driver.
+ * Adapted for MPC512x by Grzegorz Bernacki <gjb@semihalf.com>
+ */
+
+#include <common.h>
+#include <mpc512x.h>
+#include <malloc.h>
+#include <net.h>
+#include <miiphy.h>
+#include "mpc512x_fec.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define DEBUG 0
+
+#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \
+       defined(CONFIG_MPC512x_FEC)
+
+#if !(defined(CONFIG_MII) || defined(CONFIG_CMD_MII))
+#error "CONFIG_MII has to be defined!"
+#endif
+
+#if (DEBUG & 0x40)
+static uint32 local_crc32(char *string, unsigned int crc_value, int len);
+#endif
+
+int fec512x_miiphy_read(char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal);
+int fec512x_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data);
+int mpc512x_fec_init_phy(struct eth_device *dev, bd_t * bis);
+
+static uchar rx_buff[FEC_BUFFER_SIZE];
+static int rx_buff_idx = 0;
+
+/********************************************************************/
+#if (DEBUG & 0x2)
+static void mpc512x_fec_phydump (char *devname)
+{
+       uint16 phyStatus, i;
+       uint8 phyAddr = CONFIG_PHY_ADDR;
+       uint8 reg_mask[] = {
+               /* regs to print: 0...8, 21,27,31 */
+               1, 1, 1, 1,  1, 1, 1, 1,     1, 0, 0, 0,  0, 0, 0, 0,
+               0, 0, 0, 0,  0, 1, 0, 0,     0, 0, 0, 1,  0, 0, 0, 1,
+       };
+
+       for (i = 0; i < 32; i++) {
+               if (reg_mask[i]) {
+                       miiphy_read (devname, phyAddr, i, &phyStatus);
+                       printf ("Mii reg %d: 0x%04x\n", i, phyStatus);
+               }
+       }
+}
+#endif
+
+/********************************************************************/
+static int mpc512x_fec_bd_init (mpc512x_fec_priv *fec)
+{
+       int ix;
+
+       /*
+        * Receive BDs init
+        */
+       for (ix = 0; ix < FEC_RBD_NUM; ix++) {
+               fec->bdBase->rbd[ix].dataPointer = (uint32)&fec->bdBase->recv_frames[ix];
+               fec->bdBase->rbd[ix].status = FEC_RBD_EMPTY;
+               fec->bdBase->rbd[ix].dataLength = 0;
+       }
+
+       /*
+        * have the last RBD to close the ring
+        */
+       fec->bdBase->rbd[ix - 1].status |= FEC_RBD_WRAP;
+       fec->rbdIndex = 0;
+
+       /*
+        * Trasmit BDs init
+        */
+       for (ix = 0; ix < FEC_TBD_NUM; ix++) {
+               fec->bdBase->tbd[ix].status = 0;
+       }
+
+       /*
+        * Have the last TBD to close the ring
+        */
+       fec->bdBase->tbd[ix - 1].status |= FEC_TBD_WRAP;
+
+       /*
+        * Initialize some indices
+        */
+       fec->tbdIndex = 0;
+       fec->usedTbdIndex = 0;
+       fec->cleanTbdNum = FEC_TBD_NUM;
+
+       return 0;
+}
+
+/********************************************************************/
+static void mpc512x_fec_rbd_clean (mpc512x_fec_priv *fec, volatile FEC_RBD * pRbd)
+{
+       /*
+        * Reset buffer descriptor as empty
+        */
+       if ((fec->rbdIndex) == (FEC_RBD_NUM - 1))
+               pRbd->status = (FEC_RBD_WRAP | FEC_RBD_EMPTY);
+       else
+               pRbd->status = FEC_RBD_EMPTY;
+
+       pRbd->dataLength = 0;
+
+       /*
+        * Increment BD count
+        */
+       fec->rbdIndex = (fec->rbdIndex + 1) % FEC_RBD_NUM;
+
+       /*
+        * Now, we have an empty RxBD, notify FEC
+        */
+       fec->eth->r_des_active = 0x01000000;    /* Descriptor polling active */
+}
+
+/********************************************************************/
+static void mpc512x_fec_tbd_scrub (mpc512x_fec_priv *fec)
+{
+       volatile FEC_TBD *pUsedTbd;
+
+#if (DEBUG & 0x1)
+       printf ("tbd_scrub: fec->cleanTbdNum = %d, fec->usedTbdIndex = %d\n",
+               fec->cleanTbdNum, fec->usedTbdIndex);
+#endif
+
+       /*
+        * process all the consumed TBDs
+        */
+       while (fec->cleanTbdNum < FEC_TBD_NUM) {
+               pUsedTbd = &fec->bdBase->tbd[fec->usedTbdIndex];
+               if (pUsedTbd->status & FEC_TBD_READY) {
+#if (DEBUG & 0x20)
+                       printf ("Cannot clean TBD %d, in use\n", fec->usedTbdIndex);
+#endif
+                       return;
+               }
+
+               /*
+                * clean this buffer descriptor
+                */
+               if (fec->usedTbdIndex == (FEC_TBD_NUM - 1))
+                       pUsedTbd->status = FEC_TBD_WRAP;
+               else
+                       pUsedTbd->status = 0;
+
+               /*
+                * update some indeces for a correct handling of the TBD ring
+                */
+               fec->cleanTbdNum++;
+               fec->usedTbdIndex = (fec->usedTbdIndex + 1) % FEC_TBD_NUM;
+       }
+}
+
+/********************************************************************/
+static void mpc512x_fec_set_hwaddr (mpc512x_fec_priv *fec, char *mac)
+{
+       uint8 currByte;                 /* byte for which to compute the CRC */
+       int byte;                       /* loop - counter */
+       int bit;                        /* loop - counter */
+       uint32 crc = 0xffffffff;        /* initial value */
+
+       /*
+        * The algorithm used is the following:
+        * we loop on each of the six bytes of the provided address,
+        * and we compute the CRC by left-shifting the previous
+        * value by one position, so that each bit in the current
+        * byte of the address may contribute the calculation. If
+        * the latter and the MSB in the CRC are different, then
+        * the CRC value so computed is also ex-ored with the
+        * "polynomium generator". The current byte of the address
+        * is also shifted right by one bit at each iteration.
+        * This is because the CRC generatore in hardware is implemented
+        * as a shift-register with as many ex-ores as the radixes
+        * in the polynomium. This suggests that we represent the
+        * polynomiumm itself as a 32-bit constant.
+        */
+       for (byte = 0; byte < 6; byte++) {
+               currByte = mac[byte];
+               for (bit = 0; bit < 8; bit++) {
+                       if ((currByte & 0x01) ^ (crc & 0x01)) {
+                               crc >>= 1;
+                               crc = crc ^ 0xedb88320;
+                       } else {
+                               crc >>= 1;
+                       }
+                       currByte >>= 1;
+               }
+       }
+
+       crc = crc >> 26;
+
+       /*
+        * Set individual hash table register
+        */
+       if (crc >= 32) {
+               fec->eth->iaddr1 = (1 << (crc - 32));
+               fec->eth->iaddr2 = 0;
+       } else {
+               fec->eth->iaddr1 = 0;
+               fec->eth->iaddr2 = (1 << crc);
+       }
+
+       /*
+        * Set physical address
+        */
+       fec->eth->paddr1 = (mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3];
+       fec->eth->paddr2 = (mac[4] << 24) + (mac[5] << 16) + 0x8808;
+}
+
+/********************************************************************/
+static int mpc512x_fec_init (struct eth_device *dev, bd_t * bis)
+{
+       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
+
+#if (DEBUG & 0x1)
+       printf ("mpc512x_fec_init... Begin\n");
+#endif
+
+       /* Set interrupt mask register */
+       fec->eth->imask = 0x00000000;
+
+       /* Clear FEC-Lite interrupt event register(IEVENT) */
+       fec->eth->ievent = 0xffffffff;
+
+       /* Set transmit fifo watermark register(X_WMRK), default = 64 */
+       fec->eth->x_wmrk = 0x0;
+
+       /* Set Opcode/Pause Duration Register */
+       fec->eth->op_pause = 0x00010020;
+
+       /* Frame length=1522; MII mode */
+       fec->eth->r_cntrl = (FEC_MAX_FRAME_LEN << 16) | 0x24;
+
+       /* Half-duplex, heartbeat disabled */
+       fec->eth->x_cntrl = 0x00000000;
+
+       /* Enable MIB counters */
+       fec->eth->mib_control = 0x0;
+
+       /* Setup recv fifo start and buff size */
+       fec->eth->r_fstart = 0x500;
+       fec->eth->r_buff_size = FEC_BUFFER_SIZE;
+
+       /* Setup BD base addresses */
+       fec->eth->r_des_start = (uint32)fec->bdBase->rbd;
+       fec->eth->x_des_start = (uint32)fec->bdBase->tbd;
+
+       /* DMA Control */
+       fec->eth->dma_control = 0xc0000000;
+
+       /* Enable FEC */
+       fec->eth->ecntrl |= 0x00000006;
+
+       /* Initilize addresses and status words of BDs */
+       mpc512x_fec_bd_init (fec);
+
+        /* Descriptor polling active */
+       fec->eth->r_des_active = 0x01000000;
+
+#if (DEBUG & 0x1)
+       printf("mpc512x_fec_init... Done \n");
+#endif
+       return 1;
+}
+
+/********************************************************************/
+int mpc512x_fec_init_phy (struct eth_device *dev, bd_t * bis)
+{
+       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
+       const uint8 phyAddr = CONFIG_PHY_ADDR;  /* Only one PHY */
+       int timeout = 1;
+       uint16 phyStatus;
+
+#if (DEBUG & 0x1)
+       printf ("mpc512x_fec_init_phy... Begin\n");
+#endif
+
+       /*
+        * Clear FEC-Lite interrupt event register(IEVENT)
+        */
+       fec->eth->ievent = 0xffffffff;
+
+       /*
+        * Set interrupt mask register
+        */
+       fec->eth->imask = 0x00000000;
+
+       if (fec->xcv_type != SEVENWIRE) {
+               /*
+                * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
+                * and do not drop the Preamble.
+                */
+               fec->eth->mii_speed = (((gd->ips_clk / 1000000) / 5) + 1) << 1;
+
+               /*
+                * Reset PHY, then delay 300ns
+                */
+               miiphy_write (dev->name, phyAddr, 0x0, 0x8000);
+               udelay (1000);
+
+               if (fec->xcv_type == MII10) {
+               /*
+                * Force 10Base-T, FDX operation
+                */
+#if (DEBUG & 0x2)
+                       printf ("Forcing 10 Mbps ethernet link... ");
+#endif
+                       miiphy_read (dev->name, phyAddr, 0x1, &phyStatus);
+
+                       miiphy_write (dev->name, phyAddr, 0x0, 0x0180);
+
+                       timeout = 20;
+                       do {    /* wait for link status to go down */
+                               udelay (10000);
+                               if ((timeout--) == 0) {
+#if (DEBUG & 0x2)
+                                       printf ("hmmm, should not have waited...");
+#endif
+                                       break;
+                               }
+                               miiphy_read (dev->name, phyAddr, 0x1, &phyStatus);
+#if (DEBUG & 0x2)
+                               printf ("=");
+#endif
+                       } while ((phyStatus & 0x0004)); /* !link up */
+
+                       timeout = 1000;
+                       do {    /* wait for link status to come back up */
+                               udelay (10000);
+                               if ((timeout--) == 0) {
+                                       printf ("failed. Link is down.\n");
+                                       break;
+                               }
+                               miiphy_read (dev->name, phyAddr, 0x1, &phyStatus);
+#if (DEBUG & 0x2)
+                               printf ("+");
+#endif
+                       } while (!(phyStatus & 0x0004)); /* !link up */
+
+#if (DEBUG & 0x2)
+                       printf ("done.\n");
+#endif
+               } else {        /* MII100 */
+                       /*
+                        * Set the auto-negotiation advertisement register bits
+                        */
+                       miiphy_write (dev->name, phyAddr, 0x4, 0x01e1);
+
+                       /*
+                        * Set MDIO bit 0.12 = 1(&& bit 0.9=1?) to enable auto-negotiation
+                        */
+                       miiphy_write (dev->name, phyAddr, 0x0, 0x1200);
+
+                       /*
+                        * Wait for AN completion
+                        */
+                       timeout = 50000;
+                       do {
+                               udelay (1000);
+
+                               if ((timeout--) == 0) {
+#if (DEBUG & 0x2)
+                                       printf ("PHY auto neg 0 failed...\n");
+#endif
+                                       return -1;
+                               }
+
+                               if (miiphy_read (dev->name, phyAddr, 0x1, &phyStatus) != 0) {
+#if (DEBUG & 0x2)
+                                       printf ("PHY auto neg 1 failed 0x%04x...\n", phyStatus);
+#endif
+                                       return -1;
+                               }
+                       } while (!(phyStatus & 0x0004));
+
+#if (DEBUG & 0x2)
+                       printf ("PHY auto neg complete! \n");
+#endif
+               }
+       }
+
+#if (DEBUG & 0x2)
+       if (fec->xcv_type != SEVENWIRE)
+               mpc512x_fec_phydump (dev->name);
+#endif
+
+#if (DEBUG & 0x1)
+       printf ("mpc512x_fec_init_phy... Done \n");
+#endif
+       return 1;
+}
+
+/********************************************************************/
+static void mpc512x_fec_halt (struct eth_device *dev)
+{
+       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
+       int counter = 0xffff;
+
+#if (DEBUG & 0x2)
+       if (fec->xcv_type != SEVENWIRE)
+               mpc512x_fec_phydump (dev->name);
+#endif
+
+       /*
+        * mask FEC chip interrupts
+        */
+       fec->eth->imask = 0;
+
+       /*
+        * issue graceful stop command to the FEC transmitter if necessary
+        */
+       fec->eth->x_cntrl |= 0x00000001;
+
+       /*
+        * wait for graceful stop to register
+        */
+       while ((counter--) && (!(fec->eth->ievent & 0x10000000))) ;
+
+       /*
+        * Disable the Ethernet Controller
+        */
+       fec->eth->ecntrl &= 0xfffffffd;
+
+       /*
+        * Issue a reset command to the FEC chip
+        */
+       fec->eth->ecntrl |= 0x1;
+
+       /*
+        * wait at least 16 clock cycles
+        */
+       udelay (10);
+#if (DEBUG & 0x3)
+       printf ("Ethernet task stopped\n");
+#endif
+}
+
+/********************************************************************/
+
+static int mpc512x_fec_send (struct eth_device *dev, volatile void *eth_data,
+               int data_length)
+{
+       /*
+        * This routine transmits one frame.  This routine only accepts
+        * 6-byte Ethernet addresses.
+        */
+       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
+       volatile FEC_TBD *pTbd;
+
+#if (DEBUG & 0x20)
+       printf("tbd status: 0x%04x\n", fec->tbdBase[fec->tbdIndex].status);
+#endif
+
+       /*
+        * Clear Tx BD ring at first
+        */
+       mpc512x_fec_tbd_scrub (fec);
+
+       /*
+        * Check for valid length of data.
+        */
+       if ((data_length > 1500) || (data_length <= 0)) {
+               return -1;
+       }
+
+       /*
+        * Check the number of vacant TxBDs.
+        */
+       if (fec->cleanTbdNum < 1) {
+#if (DEBUG & 0x20)
+               printf ("No available TxBDs ...\n");
+#endif
+               return -1;
+       }
+
+       /*
+        * Get the first TxBD to send the mac header
+        */
+       pTbd = &fec->bdBase->tbd[fec->tbdIndex];
+       pTbd->dataLength = data_length;
+       pTbd->dataPointer = (uint32)eth_data;
+       pTbd->status |= FEC_TBD_LAST | FEC_TBD_TC | FEC_TBD_READY;
+       fec->tbdIndex = (fec->tbdIndex + 1) % FEC_TBD_NUM;
+
+       /* Activate transmit Buffer Descriptor polling */
+       fec->eth->x_des_active = 0x01000000;    /* Descriptor polling active    */
+
+#if (DEBUG & 0x8)
+       printf ( "+" );
+#endif
+
+       fec->cleanTbdNum -= 1;
+
+       /*
+        * wait until frame is sent .
+        */
+       while (pTbd->status & FEC_TBD_READY) {
+               udelay (10);
+#if (DEBUG & 0x8)
+               printf ("TDB status = %04x\n", pTbd->status);
+#endif
+       }
+
+       return 0;
+}
+
+
+/********************************************************************/
+static int mpc512x_fec_recv (struct eth_device *dev)
+{
+       /*
+        * This command pulls one frame from the card
+        */
+       mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
+       volatile FEC_RBD *pRbd = &fec->bdBase->rbd[fec->rbdIndex];
+       unsigned long ievent;
+       int frame_length = 0;
+
+#if (DEBUG & 0x1)
+       printf ("mpc512x_fec_recv %d Start...\n", fec->rbdIndex);
+#endif
+#if (DEBUG & 0x8)
+       printf( "-" );
+#endif
+
+       /*
+        * Check if any critical events have happened
+        */
+       ievent = fec->eth->ievent;
+       fec->eth->ievent = ievent;
+       if (ievent & 0x20060000) {
+               /* BABT, Rx/Tx FIFO errors */
+               mpc512x_fec_halt (dev);
+               mpc512x_fec_init (dev, NULL);
+               return 0;
+       }
+       if (ievent & 0x80000000) {
+               /* Heartbeat error */
+               fec->eth->x_cntrl |= 0x00000001;
+       }
+       if (ievent & 0x10000000) {
+               /* Graceful stop complete */
+               if (fec->eth->x_cntrl & 0x00000001) {
+                       mpc512x_fec_halt (dev);
+                       fec->eth->x_cntrl &= ~0x00000001;
+                       mpc512x_fec_init (dev, NULL);
+               }
+       }
+
+       if (!(pRbd->status & FEC_RBD_EMPTY)) {
+               if (!(pRbd->status & FEC_RBD_ERR) &&
+                       ((pRbd->dataLength - 4) > 14)) {
+
+                       /*
+                        * Get buffer size
+                        */
+                       if (pRbd->status & FEC_RBD_LAST)
+                               frame_length = pRbd->dataLength - 4;
+                       else
+                               frame_length = pRbd->dataLength;
+#if (DEBUG & 0x20)
+                       {
+                               int i;
+                               printf ("recv data length 0x%08x data hdr: ",
+                                       pRbd->dataLength);
+                               for (i = 0; i < 14; i++)
+                                       printf ("%x ", *((uint8*)pRbd->dataPointer + i));
+                               printf("\n");
+                       }
+#endif
+                       /*
+                        *  Fill the buffer and pass it to upper layers
+                        */
+                       memcpy (&rx_buff[rx_buff_idx], (void*)pRbd->dataPointer,
+                               frame_length - rx_buff_idx);
+                       rx_buff_idx = frame_length;
+
+                       if (pRbd->status & FEC_RBD_LAST) {
+                               NetReceive ((uchar*)rx_buff, frame_length);
+                               rx_buff_idx = 0;
+                       }
+               }
+
+               /*
+                * Reset buffer descriptor as empty
+                */
+               mpc512x_fec_rbd_clean (fec, pRbd);
+       }
+
+       /* Try to fill Buffer Descriptors */
+       fec->eth->r_des_active = 0x01000000;    /* Descriptor polling active */
+       return frame_length;
+}
+
+/********************************************************************/
+int mpc512x_fec_initialize (bd_t * bis)
+{
+       mpc512x_fec_priv *fec;
+       struct eth_device *dev;
+       int i;
+       char *tmp, *end, env_enetaddr[6];
+       void * bd;
+
+       fec = (mpc512x_fec_priv *) malloc (sizeof(*fec));
+       dev = (struct eth_device *) malloc (sizeof(*dev));
+       memset (dev, 0, sizeof *dev);
+
+       fec->eth = (ethernet_regs *) MPC512X_FEC;
+
+# ifndef CONFIG_FEC_10MBIT
+       fec->xcv_type = MII100;
+# else
+       fec->xcv_type = MII10;
+# endif
+       dev->priv = (void *)fec;
+       dev->iobase = MPC512X_FEC;
+       dev->init = mpc512x_fec_init;
+       dev->halt = mpc512x_fec_halt;
+       dev->send = mpc512x_fec_send;
+       dev->recv = mpc512x_fec_recv;
+
+       sprintf (dev->name, "FEC ETHERNET");
+       eth_register (dev);
+
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
+       miiphy_register (dev->name,
+                       fec512x_miiphy_read, fec512x_miiphy_write);
+#endif
+
+       /* Clean up space FEC's MIB and FIFO RAM ...*/
+       memset ((void *) MPC512X_FEC + 0x200, 0x00, 0x400);
+
+       /*
+        * Malloc space for BDs  (must be quad word-aligned)
+        * this pointer is lost, so cannot be freed
+        */
+       bd = malloc (sizeof(mpc512x_buff_descs) + 0x1f);
+       fec->bdBase = (mpc512x_buff_descs*)((uint32)bd & 0xfffffff0);
+       memset ((void *) bd, 0x00, sizeof(mpc512x_buff_descs) + 0x1f);
+
+       /*
+        * Set interrupt mask register
+        */
+       fec->eth->imask = 0x00000000;
+
+       /*
+        * Clear FEC-Lite interrupt event register(IEVENT)
+        */
+       fec->eth->ievent = 0xffffffff;
+
+       /*
+        * Try to set the mac address now. The fec mac address is
+        * a garbage after reset. When not using fec for booting
+        * the Linux fec driver will try to work with this garbage.
+        */
+       tmp = getenv ("ethaddr");
+       if (tmp) {
+               for (i=0; i<6; i++) {
+                       env_enetaddr[i] = tmp ? simple_strtoul (tmp, &end, 16) : 0;
+                       if (tmp)
+                               tmp = (*end) ? end+1 : end;
+               }
+               mpc512x_fec_set_hwaddr (fec, env_enetaddr);
+               fec->eth->gaddr1 = 0x00000000;
+               fec->eth->gaddr2 = 0x00000000;
+       }
+
+       mpc512x_fec_init_phy (dev, bis);
+
+       return 1;
+}
+
+/* MII-interface related functions */
+/********************************************************************/
+int fec512x_miiphy_read (char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal)
+{
+       ethernet_regs *eth = (ethernet_regs *) MPC512X_FEC;
+       uint32 reg;             /* convenient holder for the PHY register */
+       uint32 phy;             /* convenient holder for the PHY */
+       int timeout = 0xffff;
+
+       /*
+        * reading from any PHY's register is done by properly
+        * programming the FEC's MII data register.
+        */
+       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
+       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
+
+       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | phy | reg);
+
+       /*
+        * wait for the related interrupt
+        */
+       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
+
+       if (timeout == 0) {
+#if (DEBUG & 0x2)
+               printf ("Read MDIO failed...\n");
+#endif
+               return -1;
+       }
+
+       /*
+        * clear mii interrupt bit
+        */
+       eth->ievent = 0x00800000;
+
+       /*
+        * it's now safe to read the PHY's register
+        */
+       *retVal = (uint16) eth->mii_data;
+
+       return 0;
+}
+
+/********************************************************************/
+int fec512x_miiphy_write (char *devname, uint8 phyAddr, uint8 regAddr, uint16 data)
+{
+       ethernet_regs *eth = (ethernet_regs *) MPC512X_FEC;
+       uint32 reg;             /* convenient holder for the PHY register */
+       uint32 phy;             /* convenient holder for the PHY */
+       int timeout = 0xffff;
+
+       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
+       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
+
+       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
+                       FEC_MII_DATA_TA | phy | reg | data);
+
+       /*
+        * wait for the MII interrupt
+        */
+       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
+
+       if (timeout == 0) {
+#if (DEBUG & 0x2)
+               printf ("Write MDIO failed...\n");
+#endif
+               return -1;
+       }
+
+       /*
+        * clear MII interrupt bit
+        */
+       eth->ievent = 0x00800000;
+
+       return 0;
+}
+
+#if (DEBUG & 0x40)
+static uint32 local_crc32 (char *string, unsigned int crc_value, int len)
+{
+       int i;
+       char c;
+       unsigned int crc, count;
+
+       /*
+        * crc32 algorithm
+        */
+       /*
+        * crc = 0xffffffff; * The initialized value should be 0xffffffff
+        */
+       crc = crc_value;
+
+       for (i = len; --i >= 0;) {
+               c = *string++;
+               for (count = 0; count < 8; count++) {
+                       if ((c & 0x01) ^ (crc & 0x01)) {
+                               crc >>= 1;
+                               crc = crc ^ 0xedb88320;
+                       } else {
+                               crc >>= 1;
+                       }
+                       c >>= 1;
+               }
+       }
+
+       /*
+        * In big endian system, do byte swaping for crc value
+        */
+        /**/ return crc;
+}
+#endif /* DEBUG */
+
+#endif /* CONFIG_MPC512x_FEC */
diff --git a/drivers/net/mpc512x_fec.h b/drivers/net/mpc512x_fec.h
new file mode 100644 (file)
index 0000000..9c38502
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * (C) Copyright 2003 - 2007
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * Derived from the MPC8xx driver's header file.
+ */
+
+#ifndef __MPC512X_FEC_H
+#define __MPC512X_FEC_H
+
+#include <common.h>
+#include <mpc512x.h>
+
+typedef unsigned long uint32;
+typedef unsigned short uint16;
+typedef unsigned char uint8;
+
+typedef struct ethernet_register_set {
+
+/* [10:2]addr = 00 */
+
+/*  Control and status Registers (offset 000-1FF) */
+
+       volatile uint32 fec_id;                 /* MBAR_ETH + 0x000 */
+       volatile uint32 ievent;                 /* MBAR_ETH + 0x004 */
+       volatile uint32 imask;                  /* MBAR_ETH + 0x008 */
+
+       volatile uint32 RES0[1];                /* MBAR_ETH + 0x00C */
+       volatile uint32 r_des_active;           /* MBAR_ETH + 0x010 */
+       volatile uint32 x_des_active;           /* MBAR_ETH + 0x014 */
+
+       volatile uint32 RES1[3];                /* MBAR_ETH + 0x018-020 */
+       volatile uint32 ecntrl;                 /* MBAR_ETH + 0x024 */
+
+       volatile uint32 RES2[6];                /* MBAR_ETH + 0x028-03C */
+       volatile uint32 mii_data;               /* MBAR_ETH + 0x040 */
+       volatile uint32 mii_speed;              /* MBAR_ETH + 0x044 */
+
+       volatile uint32 RES3[7];                /* MBAR_ETH + 0x048-060 */
+       volatile uint32 mib_control;            /* MBAR_ETH + 0x064 */
+
+       volatile uint32 RES4[7];                /* MBAR_ETH + 0x068-80 */
+       volatile uint32 r_cntrl;                /* MBAR_ETH + 0x084 */
+       volatile uint32 r_hash;                 /* MBAR_ETH + 0x088 */
+
+       volatile uint32 RES5[14];               /* MBAR_ETH + 0x08c-0C0 */
+       volatile uint32 x_cntrl;                /* MBAR_ETH + 0x0C4 */
+
+       volatile uint32 RES6[7];                /* MBAR_ETH + 0x0C8-0E0 */
+       volatile uint32 paddr1;                 /* MBAR_ETH + 0x0E4 */
+       volatile uint32 paddr2;                 /* MBAR_ETH + 0x0E8 */
+       volatile uint32 op_pause;               /* MBAR_ETH + 0x0EC */
+
+       volatile uint32 RES7[10];               /* MBAR_ETH + 0x0F0-114 */
+       volatile uint32 iaddr1;                 /* MBAR_ETH + 0x118 */
+       volatile uint32 iaddr2;                 /* MBAR_ETH + 0x11C */
+       volatile uint32 gaddr1;                 /* MBAR_ETH + 0x120 */
+       volatile uint32 gaddr2;                 /* MBAR_ETH + 0x124 */
+
+       volatile uint32 RES8[6];                /* MBAR_ETH + 0x128-13C */
+       volatile uint32 fifo_id;                /* MBAR_ETH + 0x140 */
+       volatile uint32 x_wmrk;                 /* MBAR_ETH + 0x144 */
+       volatile uint32 RES9[1];                /* MBAR_ETH + 0x148 */
+       volatile uint32 r_bound;                /* MBAR_ETH + 0x14C */
+       volatile uint32 r_fstart;               /* MBAR_ETH + 0x150 */
+
+       volatile uint32 RES10[11];              /* MBAR_ETH + 0x154-17C */
+       volatile uint32 r_des_start;            /* MBAR_ETH + 0x180 */
+       volatile uint32 x_des_start;            /* MBAR_ETH + 0x184 */
+       volatile uint32 r_buff_size;            /* MBAR_ETH + 0x188 */
+       volatile uint32 RES11[26];              /* MBAR_ETH + 0x18C-1F0 */
+       volatile uint32 dma_control;            /* MBAR_ETH + 0x1F4 */
+       volatile uint32 RES12[2];               /* MBAR_ETH + 0x1F8-1FC */
+
+/*  MIB COUNTERS (Offset 200-2FF) */
+
+       volatile uint32 rmon_t_drop;            /* MBAR_ETH + 0x200 */
+       volatile uint32 rmon_t_packets;         /* MBAR_ETH + 0x204 */
+       volatile uint32 rmon_t_bc_pkt;          /* MBAR_ETH + 0x208 */
+       volatile uint32 rmon_t_mc_pkt;          /* MBAR_ETH + 0x20C */
+       volatile uint32 rmon_t_crc_align;       /* MBAR_ETH + 0x210 */
+       volatile uint32 rmon_t_undersize;       /* MBAR_ETH + 0x214 */
+       volatile uint32 rmon_t_oversize;        /* MBAR_ETH + 0x218 */
+       volatile uint32 rmon_t_frag;            /* MBAR_ETH + 0x21C */
+       volatile uint32 rmon_t_jab;             /* MBAR_ETH + 0x220 */
+       volatile uint32 rmon_t_col;             /* MBAR_ETH + 0x224 */
+       volatile uint32 rmon_t_p64;             /* MBAR_ETH + 0x228 */
+       volatile uint32 rmon_t_p65to127;        /* MBAR_ETH + 0x22C */
+       volatile uint32 rmon_t_p128to255;       /* MBAR_ETH + 0x230 */
+       volatile uint32 rmon_t_p256to511;       /* MBAR_ETH + 0x234 */
+       volatile uint32 rmon_t_p512to1023;      /* MBAR_ETH + 0x238 */
+       volatile uint32 rmon_t_p1024to2047;     /* MBAR_ETH + 0x23C */
+       volatile uint32 rmon_t_p_gte2048;       /* MBAR_ETH + 0x240 */
+       volatile uint32 rmon_t_octets;          /* MBAR_ETH + 0x244 */
+       volatile uint32 ieee_t_drop;            /* MBAR_ETH + 0x248 */
+       volatile uint32 ieee_t_frame_ok;        /* MBAR_ETH + 0x24C */
+       volatile uint32 ieee_t_1col;            /* MBAR_ETH + 0x250 */
+       volatile uint32 ieee_t_mcol;            /* MBAR_ETH + 0x254 */
+       volatile uint32 ieee_t_def;             /* MBAR_ETH + 0x258 */
+       volatile uint32 ieee_t_lcol;            /* MBAR_ETH + 0x25C */
+       volatile uint32 ieee_t_excol;           /* MBAR_ETH + 0x260 */
+       volatile uint32 ieee_t_macerr;          /* MBAR_ETH + 0x264 */
+       volatile uint32 ieee_t_cserr;           /* MBAR_ETH + 0x268 */
+       volatile uint32 ieee_t_sqe;             /* MBAR_ETH + 0x26C */
+       volatile uint32 t_fdxfc;                /* MBAR_ETH + 0x270 */
+       volatile uint32 ieee_t_octets_ok;       /* MBAR_ETH + 0x274 */
+
+       volatile uint32 RES13[2];               /* MBAR_ETH + 0x278-27C */
+       volatile uint32 rmon_r_drop;            /* MBAR_ETH + 0x280 */
+       volatile uint32 rmon_r_packets;         /* MBAR_ETH + 0x284 */
+       volatile uint32 rmon_r_bc_pkt;          /* MBAR_ETH + 0x288 */
+       volatile uint32 rmon_r_mc_pkt;          /* MBAR_ETH + 0x28C */
+       volatile uint32 rmon_r_crc_align;       /* MBAR_ETH + 0x290 */
+       volatile uint32 rmon_r_undersize;       /* MBAR_ETH + 0x294 */
+       volatile uint32 rmon_r_oversize;        /* MBAR_ETH + 0x298 */
+       volatile uint32 rmon_r_frag;            /* MBAR_ETH + 0x29C */
+       volatile uint32 rmon_r_jab;             /* MBAR_ETH + 0x2A0 */
+
+       volatile uint32 rmon_r_resvd_0;         /* MBAR_ETH + 0x2A4 */
+
+       volatile uint32 rmon_r_p64;             /* MBAR_ETH + 0x2A8 */
+       volatile uint32 rmon_r_p65to127;        /* MBAR_ETH + 0x2AC */
+       volatile uint32 rmon_r_p128to255;       /* MBAR_ETH + 0x2B0 */
+       volatile uint32 rmon_r_p256to511;       /* MBAR_ETH + 0x2B4 */
+       volatile uint32 rmon_r_p512to1023;      /* MBAR_ETH + 0x2B8 */
+       volatile uint32 rmon_r_p1024to2047;     /* MBAR_ETH + 0x2BC */
+       volatile uint32 rmon_r_p_gte2048;       /* MBAR_ETH + 0x2C0 */
+       volatile uint32 rmon_r_octets;          /* MBAR_ETH + 0x2C4 */
+       volatile uint32 ieee_r_drop;            /* MBAR_ETH + 0x2C8 */
+       volatile uint32 ieee_r_frame_ok;        /* MBAR_ETH + 0x2CC */
+       volatile uint32 ieee_r_crc;             /* MBAR_ETH + 0x2D0 */
+       volatile uint32 ieee_r_align;           /* MBAR_ETH + 0x2D4 */
+       volatile uint32 r_macerr;               /* MBAR_ETH + 0x2D8 */
+       volatile uint32 r_fdxfc;                /* MBAR_ETH + 0x2DC */
+       volatile uint32 ieee_r_octets_ok;       /* MBAR_ETH + 0x2E0 */
+
+       volatile uint32 RES14[6];               /* MBAR_ETH + 0x2E4-2FC */
+
+       volatile uint32 RES15[64];              /* MBAR_ETH + 0x300-3FF */
+} ethernet_regs;
+
+/* Receive & Transmit Buffer Descriptor definitions */
+typedef struct BufferDescriptor {
+       uint16 status;
+       uint16 dataLength;
+       uint32 dataPointer;
+} FEC_RBD;
+
+typedef struct {
+       uint16 status;
+       uint16 dataLength;
+       uint32 dataPointer;
+} FEC_TBD;
+
+/* private structure */
+typedef enum {
+       SEVENWIRE,                      /* 7-wire       */
+       MII10,                          /* MII 10Mbps   */
+       MII100                          /* MII 100Mbps  */
+} xceiver_type;
+
+/* BD Numer definitions */
+#define FEC_TBD_NUM            48      /* The user can adjust this value */
+#define FEC_RBD_NUM            32      /* The user can adjust this value */
+
+/* packet size limit */
+#define FEC_MAX_FRAME_LEN      1522    /* recommended default value */
+
+/* Buffer size must be evenly divisible by 16 */
+#define FEC_BUFFER_SIZE                ((FEC_MAX_FRAME_LEN + 0x10) & (~0xf))
+
+typedef struct {
+       uint8 frame[FEC_BUFFER_SIZE];
+} mpc512x_frame;
+
+typedef struct {
+       FEC_RBD rbd[FEC_RBD_NUM];                       /* RBD ring */
+       FEC_TBD tbd[FEC_TBD_NUM];                       /* TBD ring */
+       mpc512x_frame recv_frames[FEC_RBD_NUM];         /* receive buff */
+} mpc512x_buff_descs;
+
+typedef struct {
+       ethernet_regs *eth;
+       xceiver_type xcv_type;          /* transceiver type */
+       mpc512x_buff_descs *bdBase;     /* BD rings and recv buffer */
+       uint16 rbdIndex;                /* next receive BD to read */
+       uint16 tbdIndex;                /* next transmit BD to send */
+       uint16 usedTbdIndex;            /* next transmit BD to clean */
+       uint16 cleanTbdNum;             /* the number of available transmit BDs */
+} mpc512x_fec_priv;
+
+/* RBD bits definitions */
+#define FEC_RBD_EMPTY          0x8000  /* Buffer is empty */
+#define FEC_RBD_WRAP           0x2000  /* Last BD in ring */
+#define FEC_RBD_LAST           0x0800  /* Buffer is last in frame(useless) */
+#define FEC_RBD_MISS           0x0100  /* Miss bit for prom mode */
+#define FEC_RBD_BC             0x0080  /* The received frame is broadcast frame */
+#define FEC_RBD_MC             0x0040  /* The received frame is multicast frame */
+#define FEC_RBD_LG             0x0020  /* Frame length violation */
+#define FEC_RBD_NO             0x0010  /* Nonoctet align frame */
+#define FEC_RBD_SH             0x0008  /* Short frame */
+#define FEC_RBD_CR             0x0004  /* CRC error */
+#define FEC_RBD_OV             0x0002  /* Receive FIFO overrun */
+#define FEC_RBD_TR             0x0001  /* Frame is truncated */
+#define FEC_RBD_ERR            (FEC_RBD_LG | FEC_RBD_NO | FEC_RBD_CR | \
+                               FEC_RBD_OV | FEC_RBD_TR)
+
+/* TBD bits definitions */
+#define FEC_TBD_READY          0x8000  /* Buffer is ready */
+#define FEC_TBD_WRAP           0x2000  /* Last BD in ring */
+#define FEC_TBD_LAST           0x0800  /* Buffer is last in frame */
+#define FEC_TBD_TC             0x0400  /* Transmit the CRC */
+#define FEC_TBD_ABC            0x0200  /* Append bad CRC */
+
+/* MII-related definitios */
+#define FEC_MII_DATA_ST                0x40000000      /* Start of frame delimiter */
+#define FEC_MII_DATA_OP_RD     0x20000000      /* Perform a read operation */
+#define FEC_MII_DATA_OP_WR     0x10000000      /* Perform a write operation */
+#define FEC_MII_DATA_PA_MSK    0x0f800000      /* PHY Address field mask */
+#define FEC_MII_DATA_RA_MSK    0x007c0000      /* PHY Register field mask */
+#define FEC_MII_DATA_TA                0x00020000      /* Turnaround */
+#define FEC_MII_DATA_DATAMSK   0x0000ffff      /* PHY data field */
+
+#define FEC_MII_DATA_RA_SHIFT  18      /* MII Register address bits */
+#define FEC_MII_DATA_PA_SHIFT  23      /* MII PHY address bits */
+
+#endif /* __MPC512X_FEC_H */
diff --git a/drivers/net/mpc5xxx_fec.c b/drivers/net/mpc5xxx_fec.c
new file mode 100644 (file)
index 0000000..3d3eb8b
--- /dev/null
@@ -0,0 +1,1067 @@
+/*
+ * (C) Copyright 2003-2005
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * This file is based on mpc4200fec.c,
+ * (C) Copyright Motorola, Inc., 2000
+ */
+
+#include <common.h>
+#include <mpc5xxx.h>
+#include <mpc5xxx_sdma.h>
+#include <malloc.h>
+#include <net.h>
+#include <miiphy.h>
+#include "mpc5xxx_fec.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* #define DEBUG       0x28 */
+
+#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \
+       defined(CONFIG_MPC5xxx_FEC)
+
+#if !(defined(CONFIG_MII) || defined(CONFIG_CMD_MII))
+#error "CONFIG_MII has to be defined!"
+#endif
+
+#if (DEBUG & 0x60)
+static void tfifo_print(char *devname, mpc5xxx_fec_priv *fec);
+static void rfifo_print(char *devname, mpc5xxx_fec_priv *fec);
+#endif /* DEBUG */
+
+#if (DEBUG & 0x40)
+static uint32 local_crc32(char *string, unsigned int crc_value, int len);
+#endif
+
+typedef struct {
+    uint8 data[1500];           /* actual data */
+    int length;                 /* actual length */
+    int used;                   /* buffer in use or not */
+    uint8 head[16];             /* MAC header(6 + 6 + 2) + 2(aligned) */
+} NBUF;
+
+int fec5xxx_miiphy_read(char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal);
+int fec5xxx_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data);
+
+/********************************************************************/
+#if (DEBUG & 0x2)
+static void mpc5xxx_fec_phydump (char *devname)
+{
+       uint16 phyStatus, i;
+       uint8 phyAddr = CONFIG_PHY_ADDR;
+       uint8 reg_mask[] = {
+#if CONFIG_PHY_TYPE == 0x79c874        /* AMD Am79C874 */
+               /* regs to print: 0...7, 16...19, 21, 23, 24 */
+               1, 1, 1, 1,  1, 1, 1, 1,     0, 0, 0, 0,  0, 0, 0, 0,
+               1, 1, 1, 1,  0, 1, 0, 1,     1, 0, 0, 0,  0, 0, 0, 0,
+#else
+               /* regs to print: 0...8, 16...20 */
+               1, 1, 1, 1,  1, 1, 1, 1,     1, 0, 0, 0,  0, 0, 0, 0,
+               1, 1, 1, 1,  1, 0, 0, 0,     0, 0, 0, 0,  0, 0, 0, 0,
+#endif
+       };
+
+       for (i = 0; i < 32; i++) {
+               if (reg_mask[i]) {
+                       miiphy_read(devname, phyAddr, i, &phyStatus);
+                       printf("Mii reg %d: 0x%04x\n", i, phyStatus);
+               }
+       }
+}
+#endif
+
+/********************************************************************/
+static int mpc5xxx_fec_rbd_init(mpc5xxx_fec_priv *fec)
+{
+       int ix;
+       char *data;
+       static int once = 0;
+
+       for (ix = 0; ix < FEC_RBD_NUM; ix++) {
+               if (!once) {
+                       data = (char *)malloc(FEC_MAX_PKT_SIZE);
+                       if (data == NULL) {
+                               printf ("RBD INIT FAILED\n");
+                               return -1;
+                       }
+                       fec->rbdBase[ix].dataPointer = (uint32)data;
+               }
+               fec->rbdBase[ix].status = FEC_RBD_EMPTY;
+               fec->rbdBase[ix].dataLength = 0;
+       }
+       once ++;
+
+       /*
+        * have the last RBD to close the ring
+        */
+       fec->rbdBase[ix - 1].status |= FEC_RBD_WRAP;
+       fec->rbdIndex = 0;
+
+       return 0;
+}
+
+/********************************************************************/
+static void mpc5xxx_fec_tbd_init(mpc5xxx_fec_priv *fec)
+{
+       int ix;
+
+       for (ix = 0; ix < FEC_TBD_NUM; ix++) {
+               fec->tbdBase[ix].status = 0;
+       }
+
+       /*
+        * Have the last TBD to close the ring
+        */
+       fec->tbdBase[ix - 1].status |= FEC_TBD_WRAP;
+
+       /*
+        * Initialize some indices
+        */
+       fec->tbdIndex = 0;
+       fec->usedTbdIndex = 0;
+       fec->cleanTbdNum = FEC_TBD_NUM;
+}
+
+/********************************************************************/
+static void mpc5xxx_fec_rbd_clean(mpc5xxx_fec_priv *fec, volatile FEC_RBD * pRbd)
+{
+       /*
+        * Reset buffer descriptor as empty
+        */
+       if ((fec->rbdIndex) == (FEC_RBD_NUM - 1))
+               pRbd->status = (FEC_RBD_WRAP | FEC_RBD_EMPTY);
+       else
+               pRbd->status = FEC_RBD_EMPTY;
+
+       pRbd->dataLength = 0;
+
+       /*
+        * Now, we have an empty RxBD, restart the SmartDMA receive task
+        */
+       SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
+
+       /*
+        * Increment BD count
+        */
+       fec->rbdIndex = (fec->rbdIndex + 1) % FEC_RBD_NUM;
+}
+
+/********************************************************************/
+static void mpc5xxx_fec_tbd_scrub(mpc5xxx_fec_priv *fec)
+{
+       volatile FEC_TBD *pUsedTbd;
+
+#if (DEBUG & 0x1)
+       printf ("tbd_scrub: fec->cleanTbdNum = %d, fec->usedTbdIndex = %d\n",
+               fec->cleanTbdNum, fec->usedTbdIndex);
+#endif
+
+       /*
+        * process all the consumed TBDs
+        */
+       while (fec->cleanTbdNum < FEC_TBD_NUM) {
+               pUsedTbd = &fec->tbdBase[fec->usedTbdIndex];
+               if (pUsedTbd->status & FEC_TBD_READY) {
+#if (DEBUG & 0x20)
+                       printf("Cannot clean TBD %d, in use\n", fec->cleanTbdNum);
+#endif
+                       return;
+               }
+
+               /*
+                * clean this buffer descriptor
+                */
+               if (fec->usedTbdIndex == (FEC_TBD_NUM - 1))
+                       pUsedTbd->status = FEC_TBD_WRAP;
+               else
+                       pUsedTbd->status = 0;
+
+               /*
+                * update some indeces for a correct handling of the TBD ring
+                */
+               fec->cleanTbdNum++;
+               fec->usedTbdIndex = (fec->usedTbdIndex + 1) % FEC_TBD_NUM;
+       }
+}
+
+/********************************************************************/
+static void mpc5xxx_fec_set_hwaddr(mpc5xxx_fec_priv *fec, char *mac)
+{
+       uint8 currByte;                 /* byte for which to compute the CRC */
+       int byte;                       /* loop - counter */
+       int bit;                        /* loop - counter */
+       uint32 crc = 0xffffffff;        /* initial value */
+
+       /*
+        * The algorithm used is the following:
+        * we loop on each of the six bytes of the provided address,
+        * and we compute the CRC by left-shifting the previous
+        * value by one position, so that each bit in the current
+        * byte of the address may contribute the calculation. If
+        * the latter and the MSB in the CRC are different, then
+        * the CRC value so computed is also ex-ored with the
+        * "polynomium generator". The current byte of the address
+        * is also shifted right by one bit at each iteration.
+        * This is because the CRC generatore in hardware is implemented
+        * as a shift-register with as many ex-ores as the radixes
+        * in the polynomium. This suggests that we represent the
+        * polynomiumm itself as a 32-bit constant.
+        */
+       for (byte = 0; byte < 6; byte++) {
+               currByte = mac[byte];
+               for (bit = 0; bit < 8; bit++) {
+                       if ((currByte & 0x01) ^ (crc & 0x01)) {
+                               crc >>= 1;
+                               crc = crc ^ 0xedb88320;
+                       } else {
+                               crc >>= 1;
+                       }
+                       currByte >>= 1;
+               }
+       }
+
+       crc = crc >> 26;
+
+       /*
+        * Set individual hash table register
+        */
+       if (crc >= 32) {
+               fec->eth->iaddr1 = (1 << (crc - 32));
+               fec->eth->iaddr2 = 0;
+       } else {
+               fec->eth->iaddr1 = 0;
+               fec->eth->iaddr2 = (1 << crc);
+       }
+
+       /*
+        * Set physical address
+        */
+       fec->eth->paddr1 = (mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3];
+       fec->eth->paddr2 = (mac[4] << 24) + (mac[5] << 16) + 0x8808;
+}
+
+/********************************************************************/
+static int mpc5xxx_fec_init(struct eth_device *dev, bd_t * bis)
+{
+       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
+       struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA;
+
+#if (DEBUG & 0x1)
+       printf ("mpc5xxx_fec_init... Begin\n");
+#endif
+
+       /*
+        * Initialize RxBD/TxBD rings
+        */
+       mpc5xxx_fec_rbd_init(fec);
+       mpc5xxx_fec_tbd_init(fec);
+
+       /*
+        * Clear FEC-Lite interrupt event register(IEVENT)
+        */
+       fec->eth->ievent = 0xffffffff;
+
+       /*
+        * Set interrupt mask register
+        */
+       fec->eth->imask = 0x00000000;
+
+       /*
+        * Set FEC-Lite receive control register(R_CNTRL):
+        */
+       if (fec->xcv_type == SEVENWIRE) {
+               /*
+                * Frame length=1518; 7-wire mode
+                */
+               fec->eth->r_cntrl = 0x05ee0020; /*0x05ee0000;FIXME */
+       } else {
+               /*
+                * Frame length=1518; MII mode;
+                */
+               fec->eth->r_cntrl = 0x05ee0024; /*0x05ee0004;FIXME */
+       }
+
+       fec->eth->x_cntrl = 0x00000000; /* half-duplex, heartbeat disabled */
+       if (fec->xcv_type != SEVENWIRE) {
+               /*
+                * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
+                * and do not drop the Preamble.
+                */
+               fec->eth->mii_speed = (((gd->ipb_clk >> 20) / 5) << 1); /* No MII for 7-wire mode */
+       }
+
+       /*
+        * Set Opcode/Pause Duration Register
+        */
+       fec->eth->op_pause = 0x00010020;        /*FIXME 0xffff0020; */
+
+       /*
+        * Set Rx FIFO alarm and granularity value
+        */
+       fec->eth->rfifo_cntrl = 0x0c000000
+                               | (fec->eth->rfifo_cntrl & ~0x0f000000);
+       fec->eth->rfifo_alarm = 0x0000030c;
+#if (DEBUG & 0x22)
+       if (fec->eth->rfifo_status & 0x00700000 ) {
+               printf("mpc5xxx_fec_init() RFIFO error\n");
+       }
+#endif
+
+       /*
+        * Set Tx FIFO granularity value
+        */
+       fec->eth->tfifo_cntrl = 0x0c000000
+                               | (fec->eth->tfifo_cntrl & ~0x0f000000);
+#if (DEBUG & 0x2)
+       printf("tfifo_status: 0x%08x\n", fec->eth->tfifo_status);
+       printf("tfifo_alarm: 0x%08x\n", fec->eth->tfifo_alarm);
+#endif
+
+       /*
+        * Set transmit fifo watermark register(X_WMRK), default = 64
+        */
+       fec->eth->tfifo_alarm = 0x00000080;
+       fec->eth->x_wmrk = 0x2;
+
+       /*
+        * Set individual address filter for unicast address
+        * and set physical address registers.
+        */
+       mpc5xxx_fec_set_hwaddr(fec, (char *)dev->enetaddr);
+
+       /*
+        * Set multicast address filter
+        */
+       fec->eth->gaddr1 = 0x00000000;
+       fec->eth->gaddr2 = 0x00000000;
+
+       /*
+        * Turn ON cheater FSM: ????
+        */
+       fec->eth->xmit_fsm = 0x03000000;
+
+#if defined(CONFIG_MPC5200)
+       /*
+        * Turn off COMM bus prefetch in the MGT5200 BestComm. It doesn't
+        * work w/ the current receive task.
+        */
+        sdma->PtdCntrl |= 0x00000001;
+#endif
+
+       /*
+        * Set priority of different initiators
+        */
+       sdma->IPR0 = 7;         /* always */
+       sdma->IPR3 = 6;         /* Eth RX */
+       sdma->IPR4 = 5;         /* Eth Tx */
+
+       /*
+        * Clear SmartDMA task interrupt pending bits
+        */
+       SDMA_CLEAR_IEVENT(FEC_RECV_TASK_NO);
+
+       /*
+        * Initialize SmartDMA parameters stored in SRAM
+        */
+       *(volatile int *)FEC_TBD_BASE = (int)fec->tbdBase;
+       *(volatile int *)FEC_RBD_BASE = (int)fec->rbdBase;
+       *(volatile int *)FEC_TBD_NEXT = (int)fec->tbdBase;
+       *(volatile int *)FEC_RBD_NEXT = (int)fec->rbdBase;
+
+       /*
+        * Enable FEC-Lite controller
+        */
+       fec->eth->ecntrl |= 0x00000006;
+
+#if (DEBUG & 0x2)
+       if (fec->xcv_type != SEVENWIRE)
+               mpc5xxx_fec_phydump (dev->name);
+#endif
+
+       /*
+        * Enable SmartDMA receive task
+        */
+       SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
+
+#if (DEBUG & 0x1)
+       printf("mpc5xxx_fec_init... Done \n");
+#endif
+
+       return 1;
+}
+
+/********************************************************************/
+static int mpc5xxx_fec_init_phy(struct eth_device *dev, bd_t * bis)
+{
+       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
+       const uint8 phyAddr = CONFIG_PHY_ADDR;  /* Only one PHY */
+
+#if (DEBUG & 0x1)
+       printf ("mpc5xxx_fec_init_phy... Begin\n");
+#endif
+
+       /*
+        * Initialize GPIO pins
+        */
+       if (fec->xcv_type == SEVENWIRE) {
+               /*  10MBit with 7-wire operation */
+#if defined(CONFIG_TOTAL5200)
+               /* 7-wire and USB2 on Ethernet */
+               *(vu_long *)MPC5XXX_GPS_PORT_CONFIG |= 0x00030000;
+#else  /* !CONFIG_TOTAL5200 */
+               /* 7-wire only */
+               *(vu_long *)MPC5XXX_GPS_PORT_CONFIG |= 0x00020000;
+#endif /* CONFIG_TOTAL5200 */
+       } else {
+               /* 100MBit with MD operation */
+               *(vu_long *)MPC5XXX_GPS_PORT_CONFIG |= 0x00050000;
+       }
+
+       /*
+        * Clear FEC-Lite interrupt event register(IEVENT)
+        */
+       fec->eth->ievent = 0xffffffff;
+
+       /*
+        * Set interrupt mask register
+        */
+       fec->eth->imask = 0x00000000;
+
+/*
+ * In original Promess-provided code PHY initialization is disabled with the
+ * following comment: "Phy initialization is DISABLED for now.  There was a
+ * problem with running 100 Mbps on PRO board". Thus we temporarily disable
+ * PHY initialization for the Motion-PRO board, until a proper fix is found.
+ */
+
+       if (fec->xcv_type != SEVENWIRE) {
+               /*
+                * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
+                * and do not drop the Preamble.
+                */
+               fec->eth->mii_speed = (((gd->ipb_clk >> 20) / 5) << 1); /* No MII for 7-wire mode */
+       }
+
+       if (fec->xcv_type != SEVENWIRE) {
+               /*
+                * Initialize PHY(LXT971A):
+                *
+                *   Generally, on power up, the LXT971A reads its configuration
+                *   pins to check for forced operation, If not cofigured for
+                *   forced operation, it uses auto-negotiation/parallel detection
+                *   to automatically determine line operating conditions.
+                *   If the PHY device on the other side of the link supports
+                *   auto-negotiation, the LXT971A auto-negotiates with it
+                *   using Fast Link Pulse(FLP) Bursts. If the PHY partner does not
+                *   support auto-negotiation, the LXT971A automatically detects
+                *   the presence of either link pulses(10Mbps PHY) or Idle
+                *   symbols(100Mbps) and sets its operating conditions accordingly.
+                *
+                *   When auto-negotiation is controlled by software, the following
+                *   steps are recommended.
+                *
+                * Note:
+                *   The physical address is dependent on hardware configuration.
+                *
+                */
+               int timeout = 1;
+               uint16 phyStatus;
+
+               /*
+                * Reset PHY, then delay 300ns
+                */
+               miiphy_write(dev->name, phyAddr, 0x0, 0x8000);
+               udelay(1000);
+
+#if defined(CONFIG_UC101) || defined(CONFIG_MUCMC52)
+               /* Set the LED configuration Register for the UC101
+                  and MUCMC52 Board */
+               miiphy_write(dev->name, phyAddr, 0x14, 0x4122);
+#endif
+               if (fec->xcv_type == MII10) {
+                       /*
+                        * Force 10Base-T, FDX operation
+                        */
+#if (DEBUG & 0x2)
+                       printf("Forcing 10 Mbps ethernet link... ");
+#endif
+                       miiphy_read(dev->name, phyAddr, 0x1, &phyStatus);
+                       /*
+                       miiphy_write(dev->name, fec, phyAddr, 0x0, 0x0100);
+                       */
+                       miiphy_write(dev->name, phyAddr, 0x0, 0x0180);
+
+                       timeout = 20;
+                       do {    /* wait for link status to go down */
+                               udelay(10000);
+                               if ((timeout--) == 0) {
+#if (DEBUG & 0x2)
+                                       printf("hmmm, should not have waited...");
+#endif
+                                       break;
+                               }
+                               miiphy_read(dev->name, phyAddr, 0x1, &phyStatus);
+#if (DEBUG & 0x2)
+                               printf("=");
+#endif
+                       } while ((phyStatus & 0x0004)); /* !link up */
+
+                       timeout = 1000;
+                       do {    /* wait for link status to come back up */
+                               udelay(10000);
+                               if ((timeout--) == 0) {
+                                       printf("failed. Link is down.\n");
+                                       break;
+                               }
+                               miiphy_read(dev->name, phyAddr, 0x1, &phyStatus);
+#if (DEBUG & 0x2)
+                               printf("+");
+#endif
+                       } while (!(phyStatus & 0x0004));        /* !link up */
+
+#if (DEBUG & 0x2)
+                       printf ("done.\n");
+#endif
+               } else {        /* MII100 */
+                       /*
+                        * Set the auto-negotiation advertisement register bits
+                        */
+                       miiphy_write(dev->name, phyAddr, 0x4, 0x01e1);
+
+                       /*
+                        * Set MDIO bit 0.12 = 1(&& bit 0.9=1?) to enable auto-negotiation
+                        */
+                       miiphy_write(dev->name, phyAddr, 0x0, 0x1200);
+
+                       /*
+                        * Wait for AN completion
+                        */
+                       timeout = 5000;
+                       do {
+                               udelay(1000);
+
+                               if ((timeout--) == 0) {
+#if (DEBUG & 0x2)
+                                       printf("PHY auto neg 0 failed...\n");
+#endif
+                                       return -1;
+                               }
+
+                               if (miiphy_read(dev->name, phyAddr, 0x1, &phyStatus) != 0) {
+#if (DEBUG & 0x2)
+                                       printf("PHY auto neg 1 failed 0x%04x...\n", phyStatus);
+#endif
+                                       return -1;
+                               }
+                       } while (!(phyStatus & 0x0004));
+
+#if (DEBUG & 0x2)
+                       printf("PHY auto neg complete! \n");
+#endif
+               }
+
+       }
+
+#if (DEBUG & 0x2)
+       if (fec->xcv_type != SEVENWIRE)
+               mpc5xxx_fec_phydump (dev->name);
+#endif
+
+
+#if (DEBUG & 0x1)
+       printf("mpc5xxx_fec_init_phy... Done \n");
+#endif
+
+       return 1;
+}
+
+/********************************************************************/
+static void mpc5xxx_fec_halt(struct eth_device *dev)
+{
+#if defined(CONFIG_MPC5200)
+       struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA;
+#endif
+       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
+       int counter = 0xffff;
+
+#if (DEBUG & 0x2)
+       if (fec->xcv_type != SEVENWIRE)
+               mpc5xxx_fec_phydump (dev->name);
+#endif
+
+       /*
+        * mask FEC chip interrupts
+        */
+       fec->eth->imask = 0;
+
+       /*
+        * issue graceful stop command to the FEC transmitter if necessary
+        */
+       fec->eth->x_cntrl |= 0x00000001;
+
+       /*
+        * wait for graceful stop to register
+        */
+       while ((counter--) && (!(fec->eth->ievent & 0x10000000))) ;
+
+       /*
+        * Disable SmartDMA tasks
+        */
+       SDMA_TASK_DISABLE (FEC_XMIT_TASK_NO);
+       SDMA_TASK_DISABLE (FEC_RECV_TASK_NO);
+
+#if defined(CONFIG_MPC5200)
+       /*
+        * Turn on COMM bus prefetch in the MGT5200 BestComm after we're
+        * done. It doesn't work w/ the current receive task.
+        */
+        sdma->PtdCntrl &= ~0x00000001;
+#endif
+
+       /*
+        * Disable the Ethernet Controller
+        */
+       fec->eth->ecntrl &= 0xfffffffd;
+
+       /*
+        * Clear FIFO status registers
+        */
+       fec->eth->rfifo_status &= 0x00700000;
+       fec->eth->tfifo_status &= 0x00700000;
+
+       fec->eth->reset_cntrl = 0x01000000;
+
+       /*
+        * Issue a reset command to the FEC chip
+        */
+       fec->eth->ecntrl |= 0x1;
+
+       /*
+        * wait at least 16 clock cycles
+        */
+       udelay(10);
+
+#if (DEBUG & 0x3)
+       printf("Ethernet task stopped\n");
+#endif
+}
+
+#if (DEBUG & 0x60)
+/********************************************************************/
+
+static void tfifo_print(char *devname, mpc5xxx_fec_priv *fec)
+{
+       uint16 phyAddr = CONFIG_PHY_ADDR;
+       uint16 phyStatus;
+
+       if ((fec->eth->tfifo_lrf_ptr != fec->eth->tfifo_lwf_ptr)
+               || (fec->eth->tfifo_rdptr != fec->eth->tfifo_wrptr)) {
+
+               miiphy_read(devname, phyAddr, 0x1, &phyStatus);
+               printf("\nphyStatus: 0x%04x\n", phyStatus);
+               printf("ecntrl:   0x%08x\n", fec->eth->ecntrl);
+               printf("ievent:   0x%08x\n", fec->eth->ievent);
+               printf("x_status: 0x%08x\n", fec->eth->x_status);
+               printf("tfifo: status  0x%08x\n", fec->eth->tfifo_status);
+
+               printf("       control 0x%08x\n", fec->eth->tfifo_cntrl);
+               printf("       lrfp    0x%08x\n", fec->eth->tfifo_lrf_ptr);
+               printf("       lwfp    0x%08x\n", fec->eth->tfifo_lwf_ptr);
+               printf("       alarm   0x%08x\n", fec->eth->tfifo_alarm);
+               printf("       readptr 0x%08x\n", fec->eth->tfifo_rdptr);
+               printf("       writptr 0x%08x\n", fec->eth->tfifo_wrptr);
+       }
+}
+
+static void rfifo_print(char *devname, mpc5xxx_fec_priv *fec)
+{
+       uint16 phyAddr = CONFIG_PHY_ADDR;
+       uint16 phyStatus;
+
+       if ((fec->eth->rfifo_lrf_ptr != fec->eth->rfifo_lwf_ptr)
+               || (fec->eth->rfifo_rdptr != fec->eth->rfifo_wrptr)) {
+
+               miiphy_read(devname, phyAddr, 0x1, &phyStatus);
+               printf("\nphyStatus: 0x%04x\n", phyStatus);
+               printf("ecntrl:   0x%08x\n", fec->eth->ecntrl);
+               printf("ievent:   0x%08x\n", fec->eth->ievent);
+               printf("x_status: 0x%08x\n", fec->eth->x_status);
+               printf("rfifo: status  0x%08x\n", fec->eth->rfifo_status);
+
+               printf("       control 0x%08x\n", fec->eth->rfifo_cntrl);
+               printf("       lrfp    0x%08x\n", fec->eth->rfifo_lrf_ptr);
+               printf("       lwfp    0x%08x\n", fec->eth->rfifo_lwf_ptr);
+               printf("       alarm   0x%08x\n", fec->eth->rfifo_alarm);
+               printf("       readptr 0x%08x\n", fec->eth->rfifo_rdptr);
+               printf("       writptr 0x%08x\n", fec->eth->rfifo_wrptr);
+       }
+}
+#endif /* DEBUG */
+
+/********************************************************************/
+
+static int mpc5xxx_fec_send(struct eth_device *dev, volatile void *eth_data,
+               int data_length)
+{
+       /*
+        * This routine transmits one frame.  This routine only accepts
+        * 6-byte Ethernet addresses.
+        */
+       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
+       volatile FEC_TBD *pTbd;
+
+#if (DEBUG & 0x20)
+       printf("tbd status: 0x%04x\n", fec->tbdBase[0].status);
+       tfifo_print(dev->name, fec);
+#endif
+
+       /*
+        * Clear Tx BD ring at first
+        */
+       mpc5xxx_fec_tbd_scrub(fec);
+
+       /*
+        * Check for valid length of data.
+        */
+       if ((data_length > 1500) || (data_length <= 0)) {
+               return -1;
+       }
+
+       /*
+        * Check the number of vacant TxBDs.
+        */
+       if (fec->cleanTbdNum < 1) {
+#if (DEBUG & 0x20)
+               printf("No available TxBDs ...\n");
+#endif
+               return -1;
+       }
+
+       /*
+        * Get the first TxBD to send the mac header
+        */
+       pTbd = &fec->tbdBase[fec->tbdIndex];
+       pTbd->dataLength = data_length;
+       pTbd->dataPointer = (uint32)eth_data;
+       pTbd->status |= FEC_TBD_LAST | FEC_TBD_TC | FEC_TBD_READY;
+       fec->tbdIndex = (fec->tbdIndex + 1) % FEC_TBD_NUM;
+
+#if (DEBUG & 0x100)
+       printf("SDMA_TASK_ENABLE, fec->tbdIndex = %d \n", fec->tbdIndex);
+#endif
+
+       /*
+        * Kick the MII i/f
+        */
+       if (fec->xcv_type != SEVENWIRE) {
+               uint16 phyStatus;
+               miiphy_read(dev->name, 0, 0x1, &phyStatus);
+       }
+
+       /*
+        * Enable SmartDMA transmit task
+        */
+
+#if (DEBUG & 0x20)
+       tfifo_print(dev->name, fec);
+#endif
+       SDMA_TASK_ENABLE (FEC_XMIT_TASK_NO);
+#if (DEBUG & 0x20)
+       tfifo_print(dev->name, fec);
+#endif
+#if (DEBUG & 0x8)
+       printf( "+" );
+#endif
+
+       fec->cleanTbdNum -= 1;
+
+#if (DEBUG & 0x129) && (DEBUG & 0x80000000)
+       printf ("smartDMA ethernet Tx task enabled\n");
+#endif
+       /*
+        * wait until frame is sent .
+        */
+       while (pTbd->status & FEC_TBD_READY) {
+               udelay(10);
+#if (DEBUG & 0x8)
+               printf ("TDB status = %04x\n", pTbd->status);
+#endif
+       }
+
+       return 0;
+}
+
+
+/********************************************************************/
+static int mpc5xxx_fec_recv(struct eth_device *dev)
+{
+       /*
+        * This command pulls one frame from the card
+        */
+       mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)dev->priv;
+       volatile FEC_RBD *pRbd = &fec->rbdBase[fec->rbdIndex];
+       unsigned long ievent;
+       int frame_length, len = 0;
+       NBUF *frame;
+       uchar buff[FEC_MAX_PKT_SIZE];
+
+#if (DEBUG & 0x1)
+       printf ("mpc5xxx_fec_recv %d Start...\n", fec->rbdIndex);
+#endif
+#if (DEBUG & 0x8)
+       printf( "-" );
+#endif
+
+       /*
+        * Check if any critical events have happened
+        */
+       ievent = fec->eth->ievent;
+       fec->eth->ievent = ievent;
+       if (ievent & 0x20060000) {
+               /* BABT, Rx/Tx FIFO errors */
+               mpc5xxx_fec_halt(dev);
+               mpc5xxx_fec_init(dev, NULL);
+               return 0;
+       }
+       if (ievent & 0x80000000) {
+               /* Heartbeat error */
+               fec->eth->x_cntrl |= 0x00000001;
+       }
+       if (ievent & 0x10000000) {
+               /* Graceful stop complete */
+               if (fec->eth->x_cntrl & 0x00000001) {
+                       mpc5xxx_fec_halt(dev);
+                       fec->eth->x_cntrl &= ~0x00000001;
+                       mpc5xxx_fec_init(dev, NULL);
+               }
+       }
+
+       if (!(pRbd->status & FEC_RBD_EMPTY)) {
+               if ((pRbd->status & FEC_RBD_LAST) && !(pRbd->status & FEC_RBD_ERR) &&
+                       ((pRbd->dataLength - 4) > 14)) {
+
+                       /*
+                        * Get buffer address and size
+                        */
+                       frame = (NBUF *)pRbd->dataPointer;
+                       frame_length = pRbd->dataLength - 4;
+
+#if (DEBUG & 0x20)
+                       {
+                               int i;
+                               printf("recv data hdr:");
+                               for (i = 0; i < 14; i++)
+                                       printf("%x ", *(frame->head + i));
+                               printf("\n");
+                       }
+#endif
+                       /*
+                        *  Fill the buffer and pass it to upper layers
+                        */
+                       memcpy(buff, frame->head, 14);
+                       memcpy(buff + 14, frame->data, frame_length);
+                       NetReceive(buff, frame_length);
+                       len = frame_length;
+               }
+               /*
+                * Reset buffer descriptor as empty
+                */
+               mpc5xxx_fec_rbd_clean(fec, pRbd);
+       }
+       SDMA_CLEAR_IEVENT (FEC_RECV_TASK_NO);
+       return len;
+}
+
+
+/********************************************************************/
+int mpc5xxx_fec_initialize(bd_t * bis)
+{
+       mpc5xxx_fec_priv *fec;
+       struct eth_device *dev;
+       char *tmp, *end;
+       char env_enetaddr[6];
+       int i;
+
+       fec = (mpc5xxx_fec_priv *)malloc(sizeof(*fec));
+       dev = (struct eth_device *)malloc(sizeof(*dev));
+       memset(dev, 0, sizeof *dev);
+
+       fec->eth = (ethernet_regs *)MPC5XXX_FEC;
+       fec->tbdBase = (FEC_TBD *)FEC_BD_BASE;
+       fec->rbdBase = (FEC_RBD *)(FEC_BD_BASE + FEC_TBD_NUM * sizeof(FEC_TBD));
+#if defined(CONFIG_CANMB)              || \
+       defined(CONFIG_CM5200)          || \
+       defined(CONFIG_HMI1001)         || \
+       defined(CONFIG_ICECUBE)         || \
+       defined(CONFIG_INKA4X0)         || \
+       defined(CONFIG_JUPITER)         || \
+       defined(CONFIG_MCC200)          || \
+       defined(CONFIG_MOTIONPRO)       || \
+       defined(CONFIG_MUCMC52)         || \
+       defined(CONFIG_O2DNT)           || \
+       defined(CONFIG_PM520)           || \
+       defined(CONFIG_TOP5200)         || \
+       defined(CONFIG_TQM5200)         || \
+       defined(CONFIG_UC101)           || \
+       defined(CONFIG_V38B)            || \
+       defined(CONFIG_MUNICES)
+# ifndef CONFIG_FEC_10MBIT
+       fec->xcv_type = MII100;
+# else
+       fec->xcv_type = MII10;
+# endif
+#elif defined(CONFIG_TOTAL5200)
+       fec->xcv_type = SEVENWIRE;
+#else
+#error fec->xcv_type not initialized.
+#endif
+
+       dev->priv = (void *)fec;
+       dev->iobase = MPC5XXX_FEC;
+       dev->init = mpc5xxx_fec_init;
+       dev->halt = mpc5xxx_fec_halt;
+       dev->send = mpc5xxx_fec_send;
+       dev->recv = mpc5xxx_fec_recv;
+
+       sprintf(dev->name, "FEC ETHERNET");
+       eth_register(dev);
+
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
+       miiphy_register (dev->name,
+                       fec5xxx_miiphy_read, fec5xxx_miiphy_write);
+#endif
+
+       /*
+        * Try to set the mac address now. The fec mac address is
+        * a garbage after reset. When not using fec for booting
+        * the Linux fec driver will try to work with this garbage.
+        */
+       tmp = getenv("ethaddr");
+       if (tmp) {
+               for (i=0; i<6; i++) {
+                       env_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
+                       if (tmp)
+                               tmp = (*end) ? end+1 : end;
+               }
+               mpc5xxx_fec_set_hwaddr(fec, env_enetaddr);
+       }
+
+       mpc5xxx_fec_init_phy(dev, bis);
+
+       return 1;
+}
+
+/* MII-interface related functions */
+/********************************************************************/
+int fec5xxx_miiphy_read(char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal)
+{
+       ethernet_regs *eth = (ethernet_regs *)MPC5XXX_FEC;
+       uint32 reg;             /* convenient holder for the PHY register */
+       uint32 phy;             /* convenient holder for the PHY */
+       int timeout = 0xffff;
+
+       /*
+        * reading from any PHY's register is done by properly
+        * programming the FEC's MII data register.
+        */
+       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
+       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
+
+       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | phy | reg);
+
+       /*
+        * wait for the related interrupt
+        */
+       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
+
+       if (timeout == 0) {
+#if (DEBUG & 0x2)
+               printf ("Read MDIO failed...\n");
+#endif
+               return -1;
+       }
+
+       /*
+        * clear mii interrupt bit
+        */
+       eth->ievent = 0x00800000;
+
+       /*
+        * it's now safe to read the PHY's register
+        */
+       *retVal = (uint16) eth->mii_data;
+
+       return 0;
+}
+
+/********************************************************************/
+int fec5xxx_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data)
+{
+       ethernet_regs *eth = (ethernet_regs *)MPC5XXX_FEC;
+       uint32 reg;             /* convenient holder for the PHY register */
+       uint32 phy;             /* convenient holder for the PHY */
+       int timeout = 0xffff;
+
+       reg = regAddr << FEC_MII_DATA_RA_SHIFT;
+       phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
+
+       eth->mii_data = (FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
+                       FEC_MII_DATA_TA | phy | reg | data);
+
+       /*
+        * wait for the MII interrupt
+        */
+       while ((timeout--) && (!(eth->ievent & 0x00800000))) ;
+
+       if (timeout == 0) {
+#if (DEBUG & 0x2)
+               printf ("Write MDIO failed...\n");
+#endif
+               return -1;
+       }
+
+       /*
+        * clear MII interrupt bit
+        */
+       eth->ievent = 0x00800000;
+
+       return 0;
+}
+
+#if (DEBUG & 0x40)
+static uint32 local_crc32(char *string, unsigned int crc_value, int len)
+{
+       int i;
+       char c;
+       unsigned int crc, count;
+
+       /*
+        * crc32 algorithm
+        */
+       /*
+        * crc = 0xffffffff; * The initialized value should be 0xffffffff
+        */
+       crc = crc_value;
+
+       for (i = len; --i >= 0;) {
+               c = *string++;
+               for (count = 0; count < 8; count++) {
+                       if ((c & 0x01) ^ (crc & 0x01)) {
+                               crc >>= 1;
+                               crc = crc ^ 0xedb88320;
+                       } else {
+                               crc >>= 1;
+                       }
+                       c >>= 1;
+               }
+       }
+
+       /*
+        * In big endian system, do byte swaping for crc value
+        */
+        /**/ return crc;
+}
+#endif /* DEBUG */
+
+#endif /* CONFIG_MPC5xxx_FEC */
diff --git a/drivers/net/mpc5xxx_fec.h b/drivers/net/mpc5xxx_fec.h
new file mode 100644 (file)
index 0000000..16c3e8e
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * This file is based on mpc4200fec.h
+ * (C) Copyright Motorola, Inc., 2000
+ *
+ * odin ethernet header file
+ */
+
+#ifndef __MPC5XXX_FEC_H
+#define __MPC5XXX_FEC_H
+
+typedef unsigned long uint32;
+typedef unsigned short uint16;
+typedef unsigned char uint8;
+
+typedef struct ethernet_register_set {
+
+/* [10:2]addr = 00 */
+
+/*  Control and status Registers (offset 000-1FF) */
+
+       volatile uint32 fec_id;                 /* MBAR_ETH + 0x000 */
+       volatile uint32 ievent;                 /* MBAR_ETH + 0x004 */
+       volatile uint32 imask;                  /* MBAR_ETH + 0x008 */
+
+       volatile uint32 RES0[1];                /* MBAR_ETH + 0x00C */
+       volatile uint32 r_des_active;           /* MBAR_ETH + 0x010 */
+       volatile uint32 x_des_active;           /* MBAR_ETH + 0x014 */
+       volatile uint32 r_des_active_cl;        /* MBAR_ETH + 0x018 */
+       volatile uint32 x_des_active_cl;        /* MBAR_ETH + 0x01C */
+       volatile uint32 ivent_set;              /* MBAR_ETH + 0x020 */
+       volatile uint32 ecntrl;                 /* MBAR_ETH + 0x024 */
+
+       volatile uint32 RES1[6];                /* MBAR_ETH + 0x028-03C */
+       volatile uint32 mii_data;               /* MBAR_ETH + 0x040 */
+       volatile uint32 mii_speed;              /* MBAR_ETH + 0x044 */
+       volatile uint32 mii_status;             /* MBAR_ETH + 0x048 */
+
+       volatile uint32 RES2[5];                /* MBAR_ETH + 0x04C-05C */
+       volatile uint32 mib_data;               /* MBAR_ETH + 0x060 */
+       volatile uint32 mib_control;            /* MBAR_ETH + 0x064 */
+
+       volatile uint32 RES3[6];                /* MBAR_ETH + 0x068-7C */
+       volatile uint32 r_activate;             /* MBAR_ETH + 0x080 */
+       volatile uint32 r_cntrl;                /* MBAR_ETH + 0x084 */
+       volatile uint32 r_hash;                 /* MBAR_ETH + 0x088 */
+       volatile uint32 r_data;                 /* MBAR_ETH + 0x08C */
+       volatile uint32 ar_done;                /* MBAR_ETH + 0x090 */
+       volatile uint32 r_test;                 /* MBAR_ETH + 0x094 */
+       volatile uint32 r_mib;                  /* MBAR_ETH + 0x098 */
+       volatile uint32 r_da_low;               /* MBAR_ETH + 0x09C */
+       volatile uint32 r_da_high;              /* MBAR_ETH + 0x0A0 */
+
+       volatile uint32 RES4[7];                /* MBAR_ETH + 0x0A4-0BC */
+       volatile uint32 x_activate;             /* MBAR_ETH + 0x0C0 */
+       volatile uint32 x_cntrl;                /* MBAR_ETH + 0x0C4 */
+       volatile uint32 backoff;                /* MBAR_ETH + 0x0C8 */
+       volatile uint32 x_data;                 /* MBAR_ETH + 0x0CC */
+       volatile uint32 x_status;               /* MBAR_ETH + 0x0D0 */
+       volatile uint32 x_mib;                  /* MBAR_ETH + 0x0D4 */
+       volatile uint32 x_test;                 /* MBAR_ETH + 0x0D8 */
+       volatile uint32 fdxfc_da1;              /* MBAR_ETH + 0x0DC */
+       volatile uint32 fdxfc_da2;              /* MBAR_ETH + 0x0E0 */
+       volatile uint32 paddr1;                 /* MBAR_ETH + 0x0E4 */
+       volatile uint32 paddr2;                 /* MBAR_ETH + 0x0E8 */
+       volatile uint32 op_pause;               /* MBAR_ETH + 0x0EC */
+
+       volatile uint32 RES5[4];                /* MBAR_ETH + 0x0F0-0FC */
+       volatile uint32 instr_reg;              /* MBAR_ETH + 0x100 */
+       volatile uint32 context_reg;            /* MBAR_ETH + 0x104 */
+       volatile uint32 test_cntrl;             /* MBAR_ETH + 0x108 */
+       volatile uint32 acc_reg;                /* MBAR_ETH + 0x10C */
+       volatile uint32 ones;                   /* MBAR_ETH + 0x110 */
+       volatile uint32 zeros;                  /* MBAR_ETH + 0x114 */
+       volatile uint32 iaddr1;                 /* MBAR_ETH + 0x118 */
+       volatile uint32 iaddr2;                 /* MBAR_ETH + 0x11C */
+       volatile uint32 gaddr1;                 /* MBAR_ETH + 0x120 */
+       volatile uint32 gaddr2;                 /* MBAR_ETH + 0x124 */
+       volatile uint32 random;                 /* MBAR_ETH + 0x128 */
+       volatile uint32 rand1;                  /* MBAR_ETH + 0x12C */
+       volatile uint32 tmp;                    /* MBAR_ETH + 0x130 */
+
+       volatile uint32 RES6[3];                /* MBAR_ETH + 0x134-13C */
+       volatile uint32 fifo_id;                /* MBAR_ETH + 0x140 */
+       volatile uint32 x_wmrk;                 /* MBAR_ETH + 0x144 */
+       volatile uint32 fcntrl;                 /* MBAR_ETH + 0x148 */
+       volatile uint32 r_bound;                /* MBAR_ETH + 0x14C */
+       volatile uint32 r_fstart;               /* MBAR_ETH + 0x150 */
+       volatile uint32 r_count;                /* MBAR_ETH + 0x154 */
+       volatile uint32 r_lag;                  /* MBAR_ETH + 0x158 */
+       volatile uint32 r_read;                 /* MBAR_ETH + 0x15C */
+       volatile uint32 r_write;                /* MBAR_ETH + 0x160 */
+       volatile uint32 x_count;                /* MBAR_ETH + 0x164 */
+       volatile uint32 x_lag;                  /* MBAR_ETH + 0x168 */
+       volatile uint32 x_retry;                /* MBAR_ETH + 0x16C */
+       volatile uint32 x_write;                /* MBAR_ETH + 0x170 */
+       volatile uint32 x_read;                 /* MBAR_ETH + 0x174 */
+
+       volatile uint32 RES7[2];                /* MBAR_ETH + 0x178-17C */
+       volatile uint32 fm_cntrl;               /* MBAR_ETH + 0x180 */
+       volatile uint32 rfifo_data;             /* MBAR_ETH + 0x184 */
+       volatile uint32 rfifo_status;           /* MBAR_ETH + 0x188 */
+       volatile uint32 rfifo_cntrl;            /* MBAR_ETH + 0x18C */
+       volatile uint32 rfifo_lrf_ptr;          /* MBAR_ETH + 0x190 */
+       volatile uint32 rfifo_lwf_ptr;          /* MBAR_ETH + 0x194 */
+       volatile uint32 rfifo_alarm;            /* MBAR_ETH + 0x198 */
+       volatile uint32 rfifo_rdptr;            /* MBAR_ETH + 0x19C */
+       volatile uint32 rfifo_wrptr;            /* MBAR_ETH + 0x1A0 */
+       volatile uint32 tfifo_data;             /* MBAR_ETH + 0x1A4 */
+       volatile uint32 tfifo_status;           /* MBAR_ETH + 0x1A8 */
+       volatile uint32 tfifo_cntrl;            /* MBAR_ETH + 0x1AC */
+       volatile uint32 tfifo_lrf_ptr;          /* MBAR_ETH + 0x1B0 */
+       volatile uint32 tfifo_lwf_ptr;          /* MBAR_ETH + 0x1B4 */
+       volatile uint32 tfifo_alarm;            /* MBAR_ETH + 0x1B8 */
+       volatile uint32 tfifo_rdptr;            /* MBAR_ETH + 0x1BC */
+       volatile uint32 tfifo_wrptr;            /* MBAR_ETH + 0x1C0 */
+
+       volatile uint32 reset_cntrl;            /* MBAR_ETH + 0x1C4 */
+       volatile uint32 xmit_fsm;               /* MBAR_ETH + 0x1C8 */
+
+       volatile uint32 RES8[3];                /* MBAR_ETH + 0x1CC-1D4 */
+       volatile uint32 rdes_data0;             /* MBAR_ETH + 0x1D8 */
+       volatile uint32 rdes_data1;             /* MBAR_ETH + 0x1DC */
+       volatile uint32 r_length;               /* MBAR_ETH + 0x1E0 */
+       volatile uint32 x_length;               /* MBAR_ETH + 0x1E4 */
+       volatile uint32 x_addr;                 /* MBAR_ETH + 0x1E8 */
+       volatile uint32 cdes_data;              /* MBAR_ETH + 0x1EC */
+       volatile uint32 status;                 /* MBAR_ETH + 0x1F0 */
+       volatile uint32 dma_control;            /* MBAR_ETH + 0x1F4 */
+       volatile uint32 des_cmnd;               /* MBAR_ETH + 0x1F8 */
+       volatile uint32 data;                   /* MBAR_ETH + 0x1FC */
+
+/*  MIB COUNTERS (Offset 200-2FF) */
+
+       volatile uint32 rmon_t_drop;            /* MBAR_ETH + 0x200 */
+       volatile uint32 rmon_t_packets;         /* MBAR_ETH + 0x204 */
+       volatile uint32 rmon_t_bc_pkt;          /* MBAR_ETH + 0x208 */
+       volatile uint32 rmon_t_mc_pkt;          /* MBAR_ETH + 0x20C */
+       volatile uint32 rmon_t_crc_align;       /* MBAR_ETH + 0x210 */
+       volatile uint32 rmon_t_undersize;       /* MBAR_ETH + 0x214 */
+       volatile uint32 rmon_t_oversize;        /* MBAR_ETH + 0x218 */
+       volatile uint32 rmon_t_frag;            /* MBAR_ETH + 0x21C */
+       volatile uint32 rmon_t_jab;             /* MBAR_ETH + 0x220 */
+       volatile uint32 rmon_t_col;             /* MBAR_ETH + 0x224 */
+       volatile uint32 rmon_t_p64;             /* MBAR_ETH + 0x228 */
+       volatile uint32 rmon_t_p65to127;        /* MBAR_ETH + 0x22C */
+       volatile uint32 rmon_t_p128to255;       /* MBAR_ETH + 0x230 */
+       volatile uint32 rmon_t_p256to511;       /* MBAR_ETH + 0x234 */
+       volatile uint32 rmon_t_p512to1023;      /* MBAR_ETH + 0x238 */
+       volatile uint32 rmon_t_p1024to2047;     /* MBAR_ETH + 0x23C */
+       volatile uint32 rmon_t_p_gte2048;       /* MBAR_ETH + 0x240 */
+       volatile uint32 rmon_t_octets;          /* MBAR_ETH + 0x244 */
+       volatile uint32 ieee_t_drop;            /* MBAR_ETH + 0x248 */
+       volatile uint32 ieee_t_frame_ok;        /* MBAR_ETH + 0x24C */
+       volatile uint32 ieee_t_1col;            /* MBAR_ETH + 0x250 */
+       volatile uint32 ieee_t_mcol;            /* MBAR_ETH + 0x254 */
+       volatile uint32 ieee_t_def;             /* MBAR_ETH + 0x258 */
+       volatile uint32 ieee_t_lcol;            /* MBAR_ETH + 0x25C */
+       volatile uint32 ieee_t_excol;           /* MBAR_ETH + 0x260 */
+       volatile uint32 ieee_t_macerr;          /* MBAR_ETH + 0x264 */
+       volatile uint32 ieee_t_cserr;           /* MBAR_ETH + 0x268 */
+       volatile uint32 ieee_t_sqe;             /* MBAR_ETH + 0x26C */
+       volatile uint32 t_fdxfc;                /* MBAR_ETH + 0x270 */
+       volatile uint32 ieee_t_octets_ok;       /* MBAR_ETH + 0x274 */
+
+       volatile uint32 RES9[2];                /* MBAR_ETH + 0x278-27C */
+       volatile uint32 rmon_r_drop;            /* MBAR_ETH + 0x280 */
+       volatile uint32 rmon_r_packets;         /* MBAR_ETH + 0x284 */
+       volatile uint32 rmon_r_bc_pkt;          /* MBAR_ETH + 0x288 */
+       volatile uint32 rmon_r_mc_pkt;          /* MBAR_ETH + 0x28C */
+       volatile uint32 rmon_r_crc_align;       /* MBAR_ETH + 0x290 */
+       volatile uint32 rmon_r_undersize;       /* MBAR_ETH + 0x294 */
+       volatile uint32 rmon_r_oversize;        /* MBAR_ETH + 0x298 */
+       volatile uint32 rmon_r_frag;            /* MBAR_ETH + 0x29C */
+       volatile uint32 rmon_r_jab;             /* MBAR_ETH + 0x2A0 */
+
+       volatile uint32 rmon_r_resvd_0;         /* MBAR_ETH + 0x2A4 */
+
+       volatile uint32 rmon_r_p64;             /* MBAR_ETH + 0x2A8 */
+       volatile uint32 rmon_r_p65to127;        /* MBAR_ETH + 0x2AC */
+       volatile uint32 rmon_r_p128to255;       /* MBAR_ETH + 0x2B0 */
+       volatile uint32 rmon_r_p256to511;       /* MBAR_ETH + 0x2B4 */
+       volatile uint32 rmon_r_p512to1023;      /* MBAR_ETH + 0x2B8 */
+       volatile uint32 rmon_r_p1024to2047;     /* MBAR_ETH + 0x2BC */
+       volatile uint32 rmon_r_p_gte2048;       /* MBAR_ETH + 0x2C0 */
+       volatile uint32 rmon_r_octets;          /* MBAR_ETH + 0x2C4 */
+       volatile uint32 ieee_r_drop;            /* MBAR_ETH + 0x2C8 */
+       volatile uint32 ieee_r_frame_ok;        /* MBAR_ETH + 0x2CC */
+       volatile uint32 ieee_r_crc;             /* MBAR_ETH + 0x2D0 */
+       volatile uint32 ieee_r_align;           /* MBAR_ETH + 0x2D4 */
+       volatile uint32 r_macerr;               /* MBAR_ETH + 0x2D8 */
+       volatile uint32 r_fdxfc;                /* MBAR_ETH + 0x2DC */
+       volatile uint32 ieee_r_octets_ok;       /* MBAR_ETH + 0x2E0 */
+
+       volatile uint32 RES10[6];               /* MBAR_ETH + 0x2E4-2FC */
+
+       volatile uint32 RES11[64];              /* MBAR_ETH + 0x300-3FF */
+} ethernet_regs;
+
+/* Receive & Transmit Buffer Descriptor definitions */
+typedef struct BufferDescriptor {
+       uint16 status;
+       uint16 dataLength;
+       uint32 dataPointer;
+} FEC_RBD;
+typedef struct {
+       uint16 status;
+       uint16 dataLength;
+       uint32 dataPointer;
+} FEC_TBD;
+
+/* private structure */
+typedef enum {
+       SEVENWIRE,                      /* 7-wire       */
+       MII10,                          /* MII 10Mbps   */
+       MII100                          /* MII 100Mbps  */
+} xceiver_type;
+
+typedef struct {
+       ethernet_regs *eth;
+       xceiver_type xcv_type;          /* transceiver type */
+       FEC_RBD *rbdBase;               /* RBD ring */
+       FEC_TBD *tbdBase;               /* TBD ring */
+       uint16 rbdIndex;                /* next receive BD to read */
+       uint16 tbdIndex;                /* next transmit BD to send */
+       uint16 usedTbdIndex;            /* next transmit BD to clean */
+       uint16 cleanTbdNum;             /* the number of available transmit BDs */
+} mpc5xxx_fec_priv;
+
+/* Ethernet parameter area */
+#define FEC_TBD_BASE           (FEC_PARAM_BASE + 0x00)
+#define FEC_TBD_NEXT           (FEC_PARAM_BASE + 0x04)
+#define FEC_RBD_BASE           (FEC_PARAM_BASE + 0x08)
+#define FEC_RBD_NEXT           (FEC_PARAM_BASE + 0x0c)
+
+/* BD Numer definitions */
+#define FEC_TBD_NUM            48      /* The user can adjust this value */
+#define FEC_RBD_NUM            32      /* The user can adjust this value */
+
+/* packet size limit */
+#define FEC_MAX_PKT_SIZE       1536
+
+/* RBD bits definitions */
+#define FEC_RBD_EMPTY          0x8000  /* Buffer is empty */
+#define FEC_RBD_WRAP           0x2000  /* Last BD in ring */
+#define FEC_RBD_INT            0x1000  /* Interrupt */
+#define FEC_RBD_LAST           0x0800  /* Buffer is last in frame(useless) */
+#define FEC_RBD_MISS           0x0100  /* Miss bit for prom mode */
+#define FEC_RBD_BC             0x0080  /* The received frame is broadcast frame */
+#define FEC_RBD_MC             0x0040  /* The received frame is multicast frame */
+#define FEC_RBD_LG             0x0020  /* Frame length violation */
+#define FEC_RBD_NO             0x0010  /* Nonoctet align frame */
+#define FEC_RBD_SH             0x0008  /* Short frame */
+#define FEC_RBD_CR             0x0004  /* CRC error */
+#define FEC_RBD_OV             0x0002  /* Receive FIFO overrun */
+#define FEC_RBD_TR             0x0001  /* Frame is truncated */
+#define FEC_RBD_ERR            (FEC_RBD_LG | FEC_RBD_NO | FEC_RBD_CR | \
+                               FEC_RBD_OV | FEC_RBD_TR)
+
+/* TBD bits definitions */
+#define FEC_TBD_READY          0x8000  /* Buffer is ready */
+#define FEC_TBD_WRAP           0x2000  /* Last BD in ring */
+#define FEC_TBD_INT            0x1000  /* Interrupt */
+#define FEC_TBD_LAST           0x0800  /* Buffer is last in frame */
+#define FEC_TBD_TC             0x0400  /* Transmit the CRC */
+#define FEC_TBD_ABC            0x0200  /* Append bad CRC */
+
+/* MII-related definitios */
+#define FEC_MII_DATA_ST                0x40000000      /* Start of frame delimiter */
+#define FEC_MII_DATA_OP_RD     0x20000000      /* Perform a read operation */
+#define FEC_MII_DATA_OP_WR     0x10000000      /* Perform a write operation */
+#define FEC_MII_DATA_PA_MSK    0x0f800000      /* PHY Address field mask */
+#define FEC_MII_DATA_RA_MSK    0x007c0000      /* PHY Register field mask */
+#define FEC_MII_DATA_TA                0x00020000      /* Turnaround */
+#define FEC_MII_DATA_DATAMSK   0x0000ffff      /* PHY data field */
+
+#define FEC_MII_DATA_RA_SHIFT  18      /* MII Register address bits */
+#define FEC_MII_DATA_PA_SHIFT  23      /* MII PHY address bits */
+
+#endif /* __MPC5XXX_FEC_H */
index 2384735a2ce125752931fb48c4513ce8bf14a07b..f30014d32efa05709f7f96a7314728c3064423d9 100644 (file)
@@ -30,6 +30,7 @@ COBJS-$(CONFIG_MCFUART) += mcfuart.o
 COBJS-$(CONFIG_NS9750_UART) += ns9750_serial.o
 COBJS-y += ns16550.o
 COBJS-$(CONFIG_DRIVER_S3C4510_UART) += s3c4510b_uart.o
+COBJS-$(CONFIG_S3C64XX) += s3c64xx.o
 COBJS-y += serial.o
 COBJS-$(CONFIG_MAX3100_SERIAL) += serial_max3100.o
 COBJS-y += serial_pl010.o
diff --git a/drivers/serial/s3c64xx.c b/drivers/serial/s3c64xx.c
new file mode 100644 (file)
index 0000000..9d8fcb9
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
+ *
+ * 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 <s3c6400.h>
+
+#ifdef CONFIG_SERIAL1
+#define UART_NR        S3C64XX_UART0
+
+#elif defined(CONFIG_SERIAL2)
+#define UART_NR        S3C64XX_UART1
+
+#elif defined(CONFIG_SERIAL3)
+#define UART_NR        S3C64XX_UART2
+
+#else
+#error "Bad: you didn't configure serial ..."
+#endif
+
+#define barrier() asm volatile("" ::: "memory")
+
+/*
+ * The coefficient, used to calculate the baudrate on S3C6400 UARTs is
+ * calculated as
+ * C = UBRDIV * 16 + number_of_set_bits_in_UDIVSLOT
+ * however, section 31.6.11 of the datasheet doesn't recomment using 1 for 1,
+ * 3 for 2, ... (2^n - 1) for n, instead, they suggest using these constants:
+ */
+static const int udivslot[] = {
+       0,
+       0x0080,
+       0x0808,
+       0x0888,
+       0x2222,
+       0x4924,
+       0x4a52,
+       0x54aa,
+       0x5555,
+       0xd555,
+       0xd5d5,
+       0xddd5,
+       0xdddd,
+       0xdfdd,
+       0xdfdf,
+       0xffdf,
+};
+
+void serial_setbrg(void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       s3c64xx_uart *const uart = s3c64xx_get_base_uart(UART_NR);
+       u32 pclk = get_PCLK();
+       u32 baudrate = gd->baudrate;
+       int i;
+
+       i = (pclk / baudrate) % 16;
+
+       uart->UBRDIV = pclk / baudrate / 16 - 1;
+       uart->UDIVSLOT = udivslot[i];
+
+       for (i = 0; i < 100; i++)
+               barrier();
+}
+
+/*
+ * Initialise the serial port with the given baudrate. The settings
+ * are always 8 data bits, no parity, 1 stop bit, no start bits.
+ */
+int serial_init(void)
+{
+       s3c64xx_uart *const uart = s3c64xx_get_base_uart(UART_NR);
+
+       /* reset and enable FIFOs, set triggers to the maximum */
+       uart->UFCON = 0xff;
+       uart->UMCON = 0;
+       /* 8N1 */
+       uart->ULCON = 3;
+       /* No interrupts, no DMA, pure polling */
+       uart->UCON = 5;
+
+       serial_setbrg();
+
+       return 0;
+}
+
+/*
+ * Read a single byte from the serial port. Returns 1 on success, 0
+ * otherwise. When the function is succesfull, the character read is
+ * written into its argument c.
+ */
+int serial_getc(void)
+{
+       s3c64xx_uart *const uart = s3c64xx_get_base_uart(UART_NR);
+
+       /* wait for character to arrive */
+       while (!(uart->UTRSTAT & 0x1));
+
+       return uart->URXH & 0xff;
+}
+
+#ifdef CONFIG_MODEM_SUPPORT
+static int be_quiet;
+void disable_putc(void)
+{
+       be_quiet = 1;
+}
+
+void enable_putc(void)
+{
+       be_quiet = 0;
+}
+#endif
+
+
+/*
+ * Output a single byte to the serial port.
+ */
+void serial_putc(const char c)
+{
+       s3c64xx_uart *const uart = s3c64xx_get_base_uart(UART_NR);
+
+#ifdef CONFIG_MODEM_SUPPORT
+       if (be_quiet)
+               return;
+#endif
+
+       /* wait for room in the tx FIFO */
+       while (!(uart->UTRSTAT & 0x2));
+
+       uart->UTXH = c;
+
+       /* If \n, also do \r */
+       if (c == '\n')
+               serial_putc('\r');
+}
+
+/*
+ * Test whether a character is in the RX buffer
+ */
+int serial_tstc(void)
+{
+       s3c64xx_uart *const uart = s3c64xx_get_base_uart(UART_NR);
+
+       return uart->UTRSTAT & 0x1;
+}
+
+void serial_puts(const char *s)
+{
+       while (*s)
+               serial_putc(*s++);
+}
index 2b9eeed47e0c68fdf530f89bc0362efbc5665303..61c2b82c0acf7a811f0ffd4102318dcf19a5ade9 100644 (file)
 #include <common.h>
 #include <asm/processor.h>
 
-#if defined (CONFIG_CONS_SCIF0)
-#define SCIF_BASE      SCIF0_BASE
-#elif defined (CONFIG_CONS_SCIF1)
-#define SCIF_BASE      SCIF1_BASE
-#elif defined (CONFIG_CONS_SCIF2)
-#define SCIF_BASE      SCIF2_BASE
+#if defined(CONFIG_CONS_SCIF0)
+# define SCIF_BASE     SCIF0_BASE
+#elif defined(CONFIG_CONS_SCIF1)
+# define SCIF_BASE     SCIF1_BASE
+#elif defined(CONFIG_CONS_SCIF2)
+# define SCIF_BASE     SCIF2_BASE
+#elif defined(CONFIG_CONS_SCIF3)
+# define SCIF_BASE     SCIF3_BASE
+#elif defined(CONFIG_CONS_SCIF4)
+# define SCIF_BASE     SCIF4_BASE
+#elif defined(CONFIG_CONS_SCIF5)
+# define SCIF_BASE     SCIF5_BASE
 #else
-#error "Default SCIF doesn't set....."
+# error "Default SCIF doesn't set....."
 #endif
 
 /* Base register */
@@ -36,7 +42,8 @@
 #define SCSCR  (vu_short *)(SCIF_BASE + 0x8)
 #define SCFCR  (vu_short *)(SCIF_BASE + 0x18)
 #define SCFDR  (vu_short *)(SCIF_BASE + 0x1C)
-#ifdef CONFIG_CPU_SH7720       /* SH7720 specific */
+#if defined(CONFIG_CPU_SH7720) || \
+       (defined(CONFIG_CPU_SH7723) && defined(CONFIG_SCIF_A))
 # define SCFSR (vu_short *)(SCIF_BASE + 0x14)  /* SCSSR */
 # define SCFTDR        (vu_char  *)(SCIF_BASE + 0x20)
 # define SCFRDR        (vu_char  *)(SCIF_BASE + 0x24)
@@ -55,7 +62,7 @@
 # define LSR_ORER      1
 # define FIFOLEVEL_MASK        0xFF
 #elif defined(CONFIG_CPU_SH7763)
-# if defined (CONFIG_CONS_SCIF2)
+# if defined(CONFIG_CONS_SCIF2)
 # define SCSPTR        (vu_short *)(SCIF_BASE + 0x20)
 # define SCLSR         (vu_short *)(SCIF_BASE + 0x24)
 # define LSR_ORER      1
 # define LSR_ORER      1
 # define FIFOLEVEL_MASK        0xFF
 # endif
+#elif defined(CONFIG_CPU_SH7723)
+# if defined(CONIFG_SCIF_A)
+# define SCLSR SCFSR
+# define LSR_ORER      0x0200
+# define FIFOLEVEL_MASK        0x3F
+#else
+# define SCLSR (vu_short *)(SCIF_BASE + 0x24)
+# define LSR_ORER      1
+# define FIFOLEVEL_MASK        0x1F
+#endif
 #elif defined(CONFIG_CPU_SH7750) || \
        defined(CONFIG_CPU_SH7751) || \
-       defined(CONFIG_CPU_SH7722)
+       defined(CONFIG_CPU_SH7722) || \
+       defined(CONFIG_CPU_SH7203)
 # define SCSPTR        (vu_short *)(SCIF_BASE + 0x20)
 # define SCLSR         (vu_short *)(SCIF_BASE + 0x24)
 # define LSR_ORER      1
 /* SCBRR register value setting */
 #if defined(CONFIG_CPU_SH7720)
 # define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1)
+#elif defined(CONFIG_CPU_SH7723) && defined(CONFIG_SCIF_A)
+/* SH7723 SCIFA use bus clock. So clock *2 */
+# define SCBRR_VALUE(bps, clk) (((clk*2*2)+16*bps)/(32*bps)-1)
 #else /* Generic SuperH */
 # define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
 #endif
@@ -167,7 +188,7 @@ void serial_puts(const char *s)
 
 int serial_tstc(void)
 {
-       return serial_rx_fifo_level()? 1 : 0;
+       return serial_rx_fifo_level() ? 1 : 0;
 }
 
 #define FSR_ERR_CLEAR   0x0063
@@ -191,14 +212,16 @@ int serial_getc_check(void)
                handle_error();
        if (*SCLSR & LSR_ORER)
                handle_error();
-       return (status & (FSR_DR | FSR_RDF));
+       return status & (FSR_DR | FSR_RDF);
 }
 
 int serial_getc(void)
 {
        unsigned short status;
        char ch;
-       while (!serial_getc_check()) ;
+
+       while (!serial_getc_check())
+               ;
 
        ch = *SCFRDR;
        status = *SCFSR;
index fd60edbb3d446f32cf6bbc3d18d23b15fcca701e..0bfa4d782a579a1ac6c2e31a320113936979b9dc 100644 (file)
@@ -69,6 +69,7 @@
 #if defined(CONFIG_ARM920T) || \
     defined(CONFIG_S3C2400) || \
     defined(CONFIG_S3C2410) || \
+    defined(CONFIG_S3C6400) || \
     defined(CONFIG_440EP) || \
     defined(CONFIG_PCI_OHCI) || \
     defined(CONFIG_MPC5200) || \
index 66b354daaf67d82dd4893f59a7050f2158afa79d..b0a8853661a61dd355428d80b684369029e48902 100644 (file)
@@ -67,6 +67,9 @@ endif
 
 ifeq ($(ARCH),sh)
 LOAD_ADDR = 0x8C000000
+ifeq ($(CPU),sh2)
+BIG_ENDIAN=y
+endif
 endif
 
 ifeq ($(ARCH),sparc)
index 0e10116d87051e6da3138603e290836f10f5b4f1..c11161f58067f49f1d47b0faea52daf6fec4ba54 100644 (file)
@@ -284,8 +284,8 @@ typedef struct  {
        dv_reg          USERPHYSEL1;
 } mdio_regs;
 
-int dm644x_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data);
-int dm644x_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data);
+int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data);
+int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data);
 
 typedef struct
 {
diff --git a/include/asm-arm/arch-s3c64xx/hardware.h b/include/asm-arm/arch-s3c64xx/hardware.h
new file mode 100644 (file)
index 0000000..84d24c9
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Originates from Samsung's u-boot 1.1.6 port to S3C6400 / SMDK6400
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
+ *
+ * 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 _ARCH_HARDWARE_H_
+#define _ARCH_HARDWARE_H_
+
+#include <asm/sizes.h>
+
+#ifndef __ASSEMBLY__
+#define UData(Data)    ((unsigned long) (Data))
+
+#define __REG(x)       (*(vu_long *)(x))
+#define __REGl(x)      (*(vu_long *)(x))
+#define __REGw(x)      (*(vu_short *)(x))
+#define __REGb(x)      (*(vu_char *)(x))
+#define __REG2(x, y)   (*(vu_long *)((x) + (y)))
+#else
+#define UData(Data)    (Data)
+
+#define __REG(x)       (x)
+#define __REGl(x)      (x)
+#define __REGw(x)      (x)
+#define __REGb(x)      (x)
+#define __REG2(x, y)   ((x) + (y))
+#endif
+
+#define Fld(Size, Shft)        (((Size) << 16) + (Shft))
+
+#define FSize(Field)   ((Field) >> 16)
+#define FShft(Field)   ((Field) & 0x0000FFFF)
+#define FMsk(Field)    (((UData (1) << FSize (Field)) - 1) << FShft (Field))
+#define FAlnMsk(Field) ((UData (1) << FSize (Field)) - 1)
+#define F1stBit(Field) (UData (1) << FShft (Field))
+
+#define FClrBit(Data, Bit)     (Data = (Data & ~(Bit)))
+#define FClrFld(Data, Field)   (Data = (Data & ~FMsk(Field)))
+
+#define FInsrt(Value, Field) \
+                       (UData (Value) << FShft (Field))
+
+#define FExtr(Data, Field) \
+                       ((UData (Data) >> FShft (Field)) & FAlnMsk (Field))
+
+#endif /* _ARCH_HARDWARE_H_ */
index 4f71341327bae7f5f9da6ce635295f3ea232adf6..2bc9bf434e1b1065f15e818f8c4a9f5545d837c6 100644 (file)
@@ -72,15 +72,6 @@ typedef struct fsl_i2c {
 #define I2C_DR         0xFF
 #define I2C_DR_SHIFT   0
 #define I2C_DR_RES     ~(I2C_DR)
-
-       u8 dfsrr;       /* I2C digital filter sampling rate register */
-       u8 res5[3];
-#define I2C_DFSRR      0x3F
-#define I2C_DFSRR_SHIFT        0
-#define I2C_DFSRR_RES  ~(I2C_DR)
-
-       /* Fill out the reserved block */
-       u8 res6[0xE8];
 } fsl_i2c_t;
 
 #endif /* _ASM_I2C_H_ */
diff --git a/include/asm-sh/cpu_sh2.h b/include/asm-sh/cpu_sh2.h
new file mode 100644 (file)
index 0000000..8bc9bc6
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2007,2008 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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 _ASM_CPU_SH2_H_
+#define _ASM_CPU_SH2_H_
+
+/* cache control */
+#define CCR_CACHE_STOP         0x00000008
+#define CCR_CACHE_ENABLE       0x00000005
+#define CCR_CACHE_ICI          0x00000008
+
+#define CACHE_OC_ADDRESS_ARRAY 0xf0000000
+#define CACHE_OC_WAY_SHIFT     13
+#define CACHE_OC_NUM_ENTRIES   256
+#define CACHE_OC_ENTRY_SHIFT   4
+
+#if defined(CONFIG_CPU_SH7203)
+# include <asm/cpu_sh7203.h>
+#else
+# error "Unknown SH2 variant"
+#endif
+
+#endif /* _ASM_CPU_SH2_H_ */
index 5a8a5a149c19c420e19202f14b304aee0e7d0da7..b6cc6cfbd97719873bb782f7ef65775175214d9e 100644 (file)
 # include <asm/cpu_sh7750.h>
 #elif defined (CONFIG_CPU_SH7722)
 # include <asm/cpu_sh7722.h>
+#elif defined (CONFIG_CPU_SH7723)
+# include <asm/cpu_sh7723.h>
 #elif defined (CONFIG_CPU_SH7763)
 # include <asm/cpu_sh7763.h>
 #elif defined (CONFIG_CPU_SH7780)
 # include <asm/cpu_sh7780.h>
+#elif defined (CONFIG_CPU_SH7785)
+# include <asm/cpu_sh7785.h>
 #else
 # error "Unknown SH4 variant"
 #endif
diff --git a/include/asm-sh/cpu_sh7203.h b/include/asm-sh/cpu_sh7203.h
new file mode 100644 (file)
index 0000000..77dcac4
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _ASM_CPU_SH7203_H_
+#define _ASM_CPU_SH7203_H_
+
+/* Cache */
+#define CCR1           0xFFFC1000
+#define CCR                    CCR1
+
+/* PFC */
+#define PACR           0xA4050100
+#define PBCR           0xA4050102
+#define PCCR           0xA4050104
+#define PETCR          0xA4050106
+
+/* Port Data Registers */
+#define PADR           0xA4050120
+#define PBDR           0xA4050122
+#define PCDR           0xA4050124
+
+/* BSC */
+
+/* SDRAM controller */
+
+/* SCIF */
+#define SCSMR_0                0xFFFE8000
+#define SCIF0_BASE     SCSMR_0
+
+/* Timer(CMT) */
+#define CMSTR  0xFFFEC000
+#define CMCSR_0 0xFFFEC002
+#define CMCNT_0 0xFFFEC004
+#define CMCOR_0 0xFFFEC006
+#define CMCSR_1 0xFFFEC008
+#define CMCNT_1 0xFFFEC00A
+#define CMCOR_1        0xFFFEC00C
+
+/* On chip oscillator circuits */
+#define FRQCR          0xA415FF80
+#define WTCNT          0xA415FF84
+#define WTCSR          0xA415FF86
+
+#endif /* _ASM_CPU_SH7203_H_ */
diff --git a/include/asm-sh/cpu_sh7723.h b/include/asm-sh/cpu_sh7723.h
new file mode 100644 (file)
index 0000000..6dac6e9
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * (C) Copyright 2008 Renesas Solutions Corp.
+ *
+ * SH7723 Internal I/O register
+ *
+ * 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 _ASM_CPU_SH7723_H_
+#define _ASM_CPU_SH7723_H_
+
+#define CACHE_OC_NUM_WAYS      4
+#define CCR_CACHE_INIT 0x0000090d
+
+/* EXP */
+#define TRA            0xFF000020
+#define EXPEVT 0xFF000024
+#define INTEVT 0xFF000028
+
+/* MMU */
+#define PTEH   0xFF000000
+#define PTEL   0xFF000004
+#define TTB            0xFF000008
+#define TEA            0xFF00000C
+#define MMUCR  0xFF000010
+#define PASCR  0xFF000070
+#define IRMCR  0xFF000078
+
+/* CACHE */
+#define CCR            0xFF00001C
+#define RAMCR  0xFF000074
+
+/* INTC */
+
+/* BSC */
+#define CMNCR          0xFEC10000
+#define        CS0BCR          0xFEC10004
+#define CS2BCR         0xFEC10008
+#define CS4BCR         0xFEC10010
+#define CS5ABCR                0xFEC10014
+#define CS5BBCR                0xFEC10018
+#define CS6ABCR                0xFEC1001C
+#define CS6BBCR                0xFEC10020
+#define CS0WCR         0xFEC10024
+#define CS2WCR         0xFEC10028
+#define CS4WCR         0xFEC10030
+#define CS5AWCR                0xFEC10034
+#define CS5BWCR                0xFEC10038
+#define CS6AWCR                0xFEC1003C
+#define CS6BWCR                0xFEC10040
+#define RBWTCNT                0xFEC10054
+
+/* SBSC */
+#define SBSC_SDCR      0xFE400008
+#define SBSC_SDWCR     0xFE40000C
+#define SBSC_SDPCR     0xFE400010
+#define SBSC_RTCSR     0xFE400014
+#define SBSC_RTCNT     0xFE400018
+#define SBSC_RTCOR     0xFE40001C
+#define SBSC_RFCR      0xFE400020
+
+/* DMAC */
+
+/* CPG */
+#define FRQCR       0xA4150000
+#define VCLKCR      0xA4150004
+#define SCLKACR     0xA4150008
+#define SCLKBCR     0xA415000C
+#define IRDACLKCR   0xA4150018
+#define PLLCR       0xA4150024
+#define DLLFRQ      0xA4150050
+
+/* LOW POWER MODE */
+#define STBCR       0xA4150020
+#define MSTPCR0     0xA4150030
+#define MSTPCR1     0xA4150034
+#define MSTPCR2     0xA4150038
+
+/* RWDT */
+#define RWTCNT      0xA4520000
+#define RWTCSR      0xA4520004
+#define WTCNT          RWTCNT
+
+/* TMU */
+#define TSTR        0xFFD80004
+#define TCOR0       0xFFD80008
+#define TCNT0       0xFFD8000C
+#define TCR0        0xFFD80010
+#define TCOR1       0xFFD80014
+#define TCNT1       0xFFD80018
+#define TCR1        0xFFD8001C
+#define TCOR2       0xFFD80020
+#define TCNT2       0xFFD80024
+#define TCR2        0xFFD80028
+
+/* TPU */
+
+/* CMT */
+#define CMSTR       0xA44A0000
+#define CMCSR       0xA44A0060
+#define CMCNT       0xA44A0064
+#define CMCOR       0xA44A0068
+
+/* MSIOF */
+
+/* SCIF */
+#define SCIF0_BASE  0xFFE00000
+#define SCIF1_BASE  0xFFE10000
+#define SCIF2_BASE  0xFFE20000
+#define SCIF3_BASE  0xa4e30000
+#define SCIF4_BASE  0xa4e40000
+#define SCIF5_BASE  0xa4e50000
+
+/* RTC */
+/* IrDA */
+/* KEYSC */
+/* USB */
+/* IIC */
+/* FLCTL */
+/* VPU */
+/* VIO(CEU) */
+/* VIO(VEU) */
+/* VIO(BEU) */
+/* 2DG */
+/* LCDC */
+/* VOU */
+/* TSIF */
+/* SIU */
+/* ATAPI */
+
+/* PFC */
+#define PACR        0xA4050100
+#define PBCR        0xA4050102
+#define PCCR        0xA4050104
+#define PDCR        0xA4050106
+#define PECR        0xA4050108
+#define PFCR        0xA405010A
+#define PGCR        0xA405010C
+#define PHCR        0xA405010E
+#define PJCR        0xA4050110
+#define PKCR        0xA4050112
+#define PLCR        0xA4050114
+#define PMCR        0xA4050116
+#define PNCR        0xA4050118
+#define PQCR        0xA405011A
+#define PRCR        0xA405011C
+#define PSCR        0xA405011E
+#define PTCR        0xA4050140
+#define PUCR        0xA4050142
+#define PVCR        0xA4050144
+#define PWCR        0xA4050146
+#define PXCR        0xA4050148
+#define PYCR        0xA405014A
+#define PZCR        0xA405014C
+#define PSELA       0xA405014E
+#define PSELB       0xA4050150
+#define PSELC       0xA4050152
+#define PSELD       0xA4050154
+#define HIZCRA      0xA4050158
+#define HIZCRB      0xA405015A
+#define HIZCRC      0xA405015C
+#define HIZCRD      0xA405015E
+#define MSELCRA     0xA4050180
+#define MSELCRB     0xA4050182
+#define PULCR       0xA4050184
+#define DRVCRA      0xA405018A
+#define DRVCRB      0xA405018C
+
+/* I/O Port */
+#define PADR        0xA4050120
+#define PBDR        0xA4050122
+#define PCDR        0xA4050124
+#define PDDR        0xA4050126
+#define PEDR        0xA4050128
+#define PFDR        0xA405012A
+#define PGDR        0xA405012C
+#define PHDR        0xA405012E
+#define PJDR        0xA4050130
+#define PKDR        0xA4050132
+#define PLDR        0xA4050134
+#define PMDR        0xA4050136
+#define PNDR        0xA4050138
+#define PQDR        0xA405013A
+#define PRDR        0xA405013C
+#define PSDR        0xA405013E
+#define PTDR        0xA4050160
+#define PUDR        0xA4050162
+#define PVDR        0xA4050164
+#define PWDR        0xA4050166
+#define PYDR        0xA4050168
+#define PZDR        0xA405016A
+
+/* UBC */
+/* H-UDI */
+
+#endif /* _ASM_CPU_SH7723_H_ */
diff --git a/include/asm-sh/cpu_sh7785.h b/include/asm-sh/cpu_sh7785.h
new file mode 100644 (file)
index 0000000..4a4dfc9
--- /dev/null
@@ -0,0 +1,156 @@
+#ifndef        _ASM_CPU_SH7785_H_
+#define        _ASM_CPU_SH7785_H_
+
+/*
+ * Copyright (c) 2007,2008 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * Copyright (c) 2008 Yusuke Goda <goda.yusuke@renesas.com>
+ * Copyright (c) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.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
+ *
+ */
+
+#define        CACHE_OC_NUM_WAYS       1
+#define        CCR_CACHE_INIT          0x0000090b
+
+/*     Exceptions      */
+#define        TRA             0xFF000020
+#define        EXPEVT  0xFF000024
+#define        INTEVT  0xFF000028
+
+/* Cache Controller */
+#define        CCR     0xFF00001C
+#define        QACR0   0xFF000038
+#define        QACR1   0xFF00003C
+#define        RAMCR   0xFF000074
+
+/* Watchdog Timer and Reset */
+#define        WTCNT   WDTCNT
+#define        WDTST   0xFFCC0000
+#define        WDTCSR  0xFFCC0004
+#define        WDTBST  0xFFCC0008
+#define        WDTCNT  0xFFCC0010
+#define        WDTBCNT 0xFFCC0018
+
+/* Timer Unit */
+#define        TSTR    TSTR0
+#define        TOCR    0xFFD80000
+#define        TSTR0   0xFFD80004
+#define        TCOR0   0xFFD80008
+#define        TCNT0   0xFFD8000C
+#define        TCR0    0xFFD80010
+#define        TCOR1   0xFFD80014
+#define        TCNT1   0xFFD80018
+#define        TCR1    0xFFD8001C
+#define        TCOR2   0xFFD80020
+#define        TCNT2   0xFFD80024
+#define        TCR2    0xFFD80028
+#define        TCPR2   0xFFD8002C
+#define        TSTR1   0xFFDC0004
+#define        TCOR3   0xFFDC0008
+#define        TCNT3   0xFFDC000C
+#define        TCR3    0xFFDC0010
+#define        TCOR4   0xFFDC0014
+#define        TCNT4   0xFFDC0018
+#define        TCR4    0xFFDC001C
+#define        TCOR5   0xFFDC0020
+#define        TCNT5   0xFFDC0024
+#define        TCR5    0xFFDC0028
+
+/* Serial Communication        Interface with FIFO */
+#define        SCIF1_BASE      0xffeb0000
+
+/* LBSC */
+#define MMSELR         0xfc400020
+#define LBSC_BASE      0xff800000
+#define BCR            (LBSC_BASE + 0x1000)
+#define CS0BCR         (LBSC_BASE + 0x2000)
+#define CS1BCR         (LBSC_BASE + 0x2010)
+#define CS2BCR         (LBSC_BASE + 0x2020)
+#define CS3BCR         (LBSC_BASE + 0x2030)
+#define CS4BCR         (LBSC_BASE + 0x2040)
+#define CS5BCR         (LBSC_BASE + 0x2050)
+#define CS6BCR         (LBSC_BASE + 0x2060)
+#define CS0WCR         (LBSC_BASE + 0x2008)
+#define CS1WCR         (LBSC_BASE + 0x2018)
+#define CS2WCR         (LBSC_BASE + 0x2028)
+#define CS3WCR         (LBSC_BASE + 0x2038)
+#define CS4WCR         (LBSC_BASE + 0x2048)
+#define CS5WCR         (LBSC_BASE + 0x2058)
+#define CS6WCR         (LBSC_BASE + 0x2068)
+#define CS5PCR         (LBSC_BASE + 0x2070)
+#define CS6PCR         (LBSC_BASE + 0x2080)
+
+/* PCI Controller */
+#define        SH7780_PCIECR           0xFE000008
+#define        SH7780_PCIVID           0xFE040000
+#define        SH7780_PCIDID           0xFE040002
+#define        SH7780_PCICMD           0xFE040004
+#define        SH7780_PCISTATUS        0xFE040006
+#define        SH7780_PCIRID           0xFE040008
+#define        SH7780_PCIPIF           0xFE040009
+#define        SH7780_PCISUB           0xFE04000A
+#define        SH7780_PCIBCC           0xFE04000B
+#define        SH7780_PCICLS           0xFE04000C
+#define        SH7780_PCILTM           0xFE04000D
+#define        SH7780_PCIHDR           0xFE04000E
+#define        SH7780_PCIBIST          0xFE04000F
+#define        SH7780_PCIIBAR          0xFE040010
+#define        SH7780_PCIMBAR0         0xFE040014
+#define        SH7780_PCIMBAR1         0xFE040018
+#define        SH7780_PCISVID          0xFE04002C
+#define        SH7780_PCISID           0xFE04002E
+#define        SH7780_PCICP            0xFE040034
+#define        SH7780_PCIINTLINE       0xFE04003C
+#define        SH7780_PCIINTPIN        0xFE04003D
+#define        SH7780_PCIMINGNT        0xFE04003E
+#define        SH7780_PCIMAXLAT        0xFE04003F
+#define        SH7780_PCICID           0xFE040040
+#define        SH7780_PCINIP           0xFE040041
+#define        SH7780_PCIPMC           0xFE040042
+#define        SH7780_PCIPMCSR         0xFE040044
+#define        SH7780_PCIPMCSRBSE      0xFE040046
+#define        SH7780_PCI_CDD          0xFE040047
+#define        SH7780_PCICR            0xFE040100
+#define        SH7780_PCILSR0          0xFE040104
+#define        SH7780_PCILSR1          0xFE040108
+#define        SH7780_PCILAR0          0xFE04010C
+#define        SH7780_PCILAR1          0xFE040110
+#define        SH7780_PCIIR            0xFE040114
+#define        SH7780_PCIIMR           0xFE040118
+#define        SH7780_PCIAIR           0xFE04011C
+#define        SH7780_PCICIR           0xFE040120
+#define        SH7780_PCIAINT          0xFE040130
+#define        SH7780_PCIAINTM         0xFE040134
+#define        SH7780_PCIBMIR          0xFE040138
+#define        SH7780_PCIPAR           0xFE0401C0
+#define        SH7780_PCIPINT          0xFE0401CC
+#define        SH7780_PCIPINTM         0xFE0401D0
+#define        SH7780_PCIMBR0          0xFE0401E0
+#define        SH7780_PCIMBMR0         0xFE0401E4
+#define        SH7780_PCIMBR1          0xFE0401E8
+#define        SH7780_PCIMBMR1         0xFE0401EC
+#define        SH7780_PCIMBR2          0xFE0401F0
+#define        SH7780_PCIMBMR2         0xFE0401F4
+#define        SH7780_PCIIOBR          0xFE0401F8
+#define        SH7780_PCIIOBMR         0xFE0401FC
+#define        SH7780_PCICSCR0         0xFE040210
+#define        SH7780_PCICSCR1         0xFE040214
+#define        SH7780_PCICSAR0         0xFE040218
+#define        SH7780_PCICSAR1         0xFE04021C
+#define        SH7780_PCIPDR           0xFE040220
+
+#endif /* _ASM_CPU_SH7780_H_ */
index 388aa69c64cee49d8eb5f8b1e5897a8c34890c67..938a89cff50b1b54ea418aab1889b923364591a7 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef _ASM_SH_PROCESSOR_H_
 #define _ASM_SH_PROCESSOR_H_
-#if defined CONFIG_SH3
+#if defined(CONFIG_SH2) || \
+       defined (CONFIG_SH2A)
+# include <asm/cpu_sh2.h>
+#elif defined (CONFIG_SH3)
 # include <asm/cpu_sh3.h>
 #elif defined (CONFIG_SH4) || \
        defined (CONFIG_SH4A)
index de3d595ed25c5ae63d6f1a5ba42bcabcc96bd903..a394988b5ce998a4df93f9366ce28bc7e011e335 100644 (file)
@@ -490,7 +490,8 @@ int prt_mpc8220_clks (void);
 ulong  get_OPB_freq (void);
 ulong  get_PCI_freq (void);
 #endif
-#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X)
+#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || \
+       defined(CONFIG_LH7A40X) || defined(CONFIG_S3C6400)
 void   s3c2410_irq(void);
 #define ARM920_IRQ_CALLBACK s3c2410_irq
 ulong  get_FCLK (void);
index e8361321f171cc8c2da333f72cf75b9a9def5c4e..b32eabe9a37957c7940686735f0204ec7abd941c 100644 (file)
 
 /* I2C */
 #define CONFIG_FSL_I2C
-#define CONFIG_HARD_I2C                        /* I2C with hw support */
-#undef CONFIG_SOFT_I2C                 /* I2C bit-banged */
+#define CONFIG_HARD_I2C                /* I2C with hw support */
+#undef CONFIG_SOFT_I2C         /* I2C bit-banged */
 #define CFG_I2C_SPEED          80000
 #define CFG_I2C_SLAVE          0x7F
 #define CFG_I2C_OFFSET         0x00000300
 #define CFG_IMMR               CFG_MBAR
+#define CFG_I2C_PINMUX_REG     (gpio->par_qspi)
+#define CFG_I2C_PINMUX_CLR     ~(GPIO_PAR_FECI2C_SCL_MASK | GPIO_PAR_FECI2C_SDA_MASK)
+#define CFG_I2C_PINMUX_SET     (GPIO_PAR_FECI2C_SCL_I2CSCL | GPIO_PAR_FECI2C_SDA_I2CSDA)
 
 /* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
 #define CONFIG_BOOTDELAY       1       /* autoboot after 5 seconds */
index c2f5dd9fa47589846c826777de2ef02770b1eb56..6bf2d99c9c1876d3a998693ac72115725cff6edc 100644 (file)
@@ -41,8 +41,8 @@
 
 #define CONFIG_MCFUART
 #define CFG_UART_PORT          (0)
-#define CONFIG_BAUDRATE                19200
-#define CFG_BAUDRATE_TABLE { 9600 , 19200 , 38400 , 57600, 115200 }
+#define CONFIG_BAUDRATE                115200
+#define CFG_BAUDRATE_TABLE     { 9600 , 19200 , 38400 , 57600, 115200 }
 
 #undef  CONFIG_WATCHDOG
 
index f2c2317f50c0af797f559e4f126a43897eb424f3..9f78f6ebc88932b2248735496f226cc04d75298e 100644 (file)
 
 #define CONFIG_HOSTNAME                M5253DEMO
 
+/* I2C */
+#define CONFIG_FSL_I2C
+#define CONFIG_HARD_I2C                /* I2C with hw support */
+#define CFG_I2C_SPEED          80000
+#define CFG_I2C_SLAVE          0x7F
+#define CFG_I2C_OFFSET         0x00000280
+#define CFG_IMMR               CFG_MBAR
+#define CFG_I2C_PINMUX_REG     (*(u32 *) (CFG_MBAR+0x19C))
+#define CFG_I2C_PINMUX_CLR     (0xFFFFE7FF)
+#define CFG_I2C_PINMUX_SET     (0)
+
 #define CFG_PROMPT             "=> "
 #define CFG_LONGHELP           /* undef to save memory */
 
index 12f9783abe89499ab75b7a5d70771724b3ebf7ac..78a1b93cf7597a031397d5f7a146b5f8a537cef6 100644 (file)
@@ -42,7 +42,7 @@
 
 #define CONFIG_MCFUART
 #define CFG_UART_PORT          (0)
-#define CONFIG_BAUDRATE                19200
+#define CONFIG_BAUDRATE                115200
 #define CFG_BAUDRATE_TABLE     { 9600 , 19200 , 38400 , 57600, 115200 }
 
 #undef CONFIG_WATCHDOG         /* disable watchdog */
index 7edd322bdd5af302af57c95384231d9d8f6d078f..fc457e3bcbbe7e44f995f9b3781d380fff0d6030 100644 (file)
@@ -40,8 +40,8 @@
 
 #define CONFIG_MCFUART
 #define CFG_UART_PORT          (0)
-#define CONFIG_BAUDRATE                19200
-#define CFG_BAUDRATE_TABLE { 9600 , 19200 , 38400 , 57600, 115200 }
+#define CONFIG_BAUDRATE                115200
+#define CFG_BAUDRATE_TABLE     { 9600 , 19200 , 38400 , 57600, 115200 }
 
 #undef CONFIG_WATCHDOG
 #define CONFIG_WATCHDOG_TIMEOUT 10000  /* timeout in milliseconds */
@@ -91,6 +91,7 @@
 #ifdef CONFIG_MCFFEC
 #      define CONFIG_NET_MULTI         1
 #      define CONFIG_MII               1
+#      define CONFIG_MII_INIT          1
 #      define CFG_DISCOVER_PHY
 #      define CFG_RX_ETH_BUFFER        8
 #      define CFG_FAULT_ECHO_LINK_DOWN
index 30c70e5796fa0ebc97e85cbba756484ceab57b07..430af6bfa21a52d97c4a4098cbe9113b75bfff00 100644 (file)
@@ -45,7 +45,7 @@
 
 #define CONFIG_MCFUART
 #define CFG_UART_PORT          (0)
-#define CONFIG_BAUDRATE                19200
+#define CONFIG_BAUDRATE                115200
 #define CFG_BAUDRATE_TABLE     { 9600 , 19200 , 38400 , 57600, 115200 }
 
 /* Configuration for environment
 #define CFG_I2C_SLAVE          0x7F
 #define CFG_I2C_OFFSET         0x00000300
 #define CFG_IMMR               CFG_MBAR
+#define CFG_I2C_PINMUX_REG     (gpio_reg->par_feci2c)
+#define CFG_I2C_PINMUX_CLR     (0xFFF0)
+#define CFG_I2C_PINMUX_SET     (0x000F)
 
 #ifdef CONFIG_MCFFEC
 #define CONFIG_ETHADDR         00:06:3b:01:41:55
index 279a12be7b0310fe0dcfd3d269ebe51bbb1f2543..eb59c250dbfe3caa2e4399c0bc465e87c7147eee 100644 (file)
@@ -40,8 +40,8 @@
 
 #define CONFIG_MCFUART
 #define CFG_UART_PORT          (0)
-#define CONFIG_BAUDRATE 19200
-#define CFG_BAUDRATE_TABLE { 9600 , 19200 , 38400 , 57600, 115200 }
+#define CONFIG_BAUDRATE                115200
+#define CFG_BAUDRATE_TABLE     { 9600 , 19200 , 38400 , 57600, 115200 }
 
 #undef CONFIG_MONITOR_IS_IN_RAM        /* define if monitor is started from a pre-loader */
 
index 588c00c6295139d84cbd812796f1c35ac2062995..cf58239df3f07c0f0b63933cba10839036e8e155 100644 (file)
        "u-boot=u-boot.bin\0"                   \
        "load=tftp ${loadaddr) ${u-boot}\0"     \
        "upd=run load; run prog\0"              \
-       "prog=prot off 0 " MK_STR(CFG_UBOOT_END)\
-       "; era 0 " MK_STR(CFG_UBOOT_END)        \
-       "2ffff;"                                \
+       "prog=prot off 0 " MK_STR(CFG_UBOOT_END)        \
+       "; era 0 " MK_STR(CFG_UBOOT_END) " ;"   \
        "cp.b ${loadaddr} 0 ${filesize};"       \
        "save\0"                                \
        ""
index 476aba34786ed505032026eb01266e3dbb6ee6eb..ad9c15eb9b1f4323ab1a7a0bf89095fa53502130 100644 (file)
        " " MK_STR(CFG_UBOOT_END) ";"           \
        "era " MK_STR(CFG_FLASH_BASE) " "       \
        MK_STR(CFG_UBOOT_END) ";"               \
-       "cp.b ${loadaddr} " MK_STR(CFG_FLASH_BASE)\
+       "cp.b ${loadaddr} " MK_STR(CFG_FLASH_BASE)      \
        " ${filesize}; save\0"                  \
        ""
 #endif
 #endif
 #endif
 
-#define CFG_FLASH_PROTECTION           /* "Real" (hardware) sectors protection */
-#define CFG_FLASH_CHECKSUM
-
 /*
  * This is setting for JFFS2 support in u-boot.
  * NOTE: Enable CONFIG_CMD_JFFS2 for JFFS2 support.
index 4037efb733ef1b9ccbc7a8271705a5096f25ceb6..af6723c63753717faad66bdaf4d1ad7e305abd39 100644 (file)
  */
 #define CFG_SDRAM_BASE         0x00000000
 #define CFG_SDRAM_CFG1         0x73711630
-#define CFG_SDRAM_CFG2         0x46370000
+#define CFG_SDRAM_CFG2         0x46770000
 #define CFG_SDRAM_CTRL         0xE10B0000
 #define CFG_SDRAM_EMOD         0x40010000
 #define CFG_SDRAM_MODE         0x018D0000
index a14c55bc336507c9d75a514e9551e640ce148bde..248db53d9a3fba4ac43ecff3f04c0cbdce21bc0e 100644 (file)
  */
 #define CFG_SDRAM_BASE         0x00000000
 #define CFG_SDRAM_CFG1         0x73711630
-#define CFG_SDRAM_CFG2         0x46370000
+#define CFG_SDRAM_CFG2         0x46770000
 #define CFG_SDRAM_CTRL         0xE10B0000
 #define CFG_SDRAM_EMOD         0x40010000
 #define CFG_SDRAM_MODE         0x018D0000
index 5f74afb0d783096d6474a76ece7164df4b99353d..f516c4602c2c396e0cb1a0562b054cf451bdd9b8 100644 (file)
 
 #define CFG_CS0_CFG            0x05059310      /* ALE active low, data size 4bytes */
 #define CFG_CS2_CFG            0x05059010      /* ALE active low, data size 1byte */
+#define CFG_CS_ALETIMING       0x00000005      /* Use alternative CS timing for CS0 and CS2 */
 
 /* Use SRAM for initial stack */
 #define CFG_INIT_RAM_ADDR      CFG_SRAM_BASE           /* Initial RAM address */
diff --git a/include/configs/ap325rxa.h b/include/configs/ap325rxa.h
new file mode 100644 (file)
index 0000000..81a118d
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Configuation settings for the Renesas Solutions AP-325RXA board
+ *
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ * Copyright (C) 2008 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
+ *
+ * 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 __AP325RXA_H
+#define __AP325RXA_H
+
+#undef DEBUG
+#define CONFIG_SH              1
+#define CONFIG_SH4             1
+#define CONFIG_CPU_SH7723      1
+#define CONFIG_AP325RXA        1
+
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NFS
+#define CONFIG_CMD_SDRAM
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_IDE
+#define CONFIG_CMD_EXT2
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_BAUDRATE                38400
+#define CONFIG_BOOTDELAY       3
+#define CONFIG_BOOTARGS                "console=ttySC2,38400"
+
+#define CONFIG_VERSION_VARIABLE
+#undef  CONFIG_SHOW_BOOT_PROGRESS
+
+/* SMC9118 */
+#define CONFIG_DRIVER_SMC911X 1
+#define CONFIG_DRIVER_SMC911X_32_BIT 1
+#define CONFIG_DRIVER_SMC911X_BASE 0xB6080000
+
+/* MEMORY */
+#define AP325RXA_SDRAM_BASE            (0x88000000)
+#define AP325RXA_FLASH_BASE_1          (0xA0000000)
+#define AP325RXA_FLASH_BANK_SIZE       (128 * 1024 * 1024)
+
+/* undef to save memory        */
+#define CFG_LONGHELP
+/* Monitor Command Prompt */
+#define CFG_PROMPT             "=> "
+/* Buffer size for input from the Console */
+#define CFG_CBSIZE             256
+/* Buffer size for Console output */
+#define CFG_PBSIZE             256
+/* max args accepted for monitor commands */
+#define CFG_MAXARGS            16
+/* Buffer size for Boot Arguments passed to kernel */
+#define CFG_BARGSIZE   512
+/* List of legal baudrate settings for this board */
+#define CFG_BAUDRATE_TABLE     { 38400 }
+
+/* SCIF */
+#define CONFIG_SCIF_CONSOLE 1
+#define CONFIG_SCIF_A          1 /* SH7723 has SCIF and SCIFA */
+#define CONFIG_CONS_SCIF5      1
+
+/* Suppress display of console information at boot */
+#undef  CFG_CONSOLE_INFO_QUIET
+#undef  CFG_CONSOLE_OVERWRITE_ROUTINE
+#undef  CFG_CONSOLE_ENV_OVERWRITE
+
+#define CFG_MEMTEST_START      (AP325RXA_SDRAM_BASE)
+#define CFG_MEMTEST_END                (CFG_MEMTEST_START + (60 * 1024 * 1024))
+
+/* Enable alternate, more extensive, memory test */
+#undef  CFG_ALT_MEMTEST
+/* Scratch address used by the alternate memory test */
+#undef  CFG_MEMTEST_SCRATCH
+
+/* Enable temporary baudrate change while serial download */
+#undef  CFG_LOADS_BAUD_CHANGE
+
+#define CFG_SDRAM_BASE (AP325RXA_SDRAM_BASE)
+/* maybe more, but if so u-boot doesn't know about it... */
+#define CFG_SDRAM_SIZE (128 * 1024 * 1024)
+/* default load address for scripts ?!? */
+#define CFG_LOAD_ADDR  (CFG_SDRAM_BASE + 16 * 1024 * 1024)
+
+/* Address of u-boot image in Flash (NOT run time address in SDRAM) ?!? */
+#define CFG_MONITOR_BASE       (AP325RXA_FLASH_BASE_1)
+/* Monitor size */
+#define CFG_MONITOR_LEN        (128 * 1024)
+/* Size of DRAM reserved for malloc() use */
+#define CFG_MALLOC_LEN (256 * 1024)
+/* size in bytes reserved for initial data */
+#define CFG_GBL_DATA_SIZE      (256)
+#define CFG_BOOTMAPSZ  (8 * 1024 * 1024)
+
+/* FLASH */
+#define CONFIG_FLASH_CFI_DRIVER 1
+#define CFG_FLASH_CFI
+#define CFG_FLASH_CFI_DRIVER
+#undef  CFG_FLASH_QUIET_TEST
+/* print 'E' for empty sector on flinfo */
+#define CFG_FLASH_EMPTY_INFO
+/* Physical start address of Flash memory */
+#define CFG_FLASH_BASE (AP325RXA_FLASH_BASE_1)
+/* Max number of sectors on each Flash chip */
+#define CFG_MAX_FLASH_SECT     512
+
+/*
+ * IDE support
+ */
+#define CONFIG_IDE_RESET       1
+#define CFG_PIO_MODE           1
+#define CFG_IDE_MAXBUS         1       /* IDE bus */
+#define CFG_IDE_MAXDEVICE      1
+#define CFG_ATA_BASE_ADDR      0xB4180000
+#define CFG_ATA_STRIDE         2       /* 1bit shift */
+#define CFG_ATA_DATA_OFFSET    0x200   /* data reg offset */
+#define CFG_ATA_REG_OFFSET     0x200   /* reg offset */
+#define CFG_ATA_ALT_OFFSET     0x210   /* alternate register offset */
+
+/* if you use all NOR Flash , you change dip-switch. Please see Manual. */
+#define CFG_MAX_FLASH_BANKS    1
+#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE + (0 * AP325RXA_FLASH_BANK_SIZE)}
+
+/* Timeout for Flash erase operations (in ms) */
+#define CFG_FLASH_ERASE_TOUT   (3 * 1000)
+/* Timeout for Flash write operations (in ms) */
+#define CFG_FLASH_WRITE_TOUT   (3 * 1000)
+/* Timeout for Flash set sector lock bit operations (in ms) */
+#define CFG_FLASH_LOCK_TOUT    (3 * 1000)
+/* Timeout for Flash clear lock bit operations (in ms) */
+#define CFG_FLASH_UNLOCK_TOUT  (3 * 1000)
+
+/*
+ * Use hardware flash sectors protection instead
+ * of U-Boot software protection
+ */
+#undef  CFG_FLASH_PROTECTION
+#undef  CFG_DIRECT_FLASH_TFTP
+
+/* ENV setting */
+#define CFG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_OVERWRITE   1
+#define CFG_ENV_SECT_SIZE      (128 * 1024)
+#define CFG_ENV_SIZE           (CFG_ENV_SECT_SIZE)
+#define CFG_ENV_ADDR           (CFG_FLASH_BASE + CFG_MONITOR_LEN)
+/* Offset of env Flash sector relative to CFG_FLASH_BASE */
+#define CFG_ENV_OFFSET         (CFG_ENV_ADDR - CFG_FLASH_BASE)
+#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SECT_SIZE)
+
+/* Board Clock */
+#define CONFIG_SYS_CLK_FREQ    33333333
+#define TMU_CLK_DIVIDER                (4)     /* 4 (default), 16, 64, 256 or 1024 */
+#define CFG_HZ                 (CONFIG_SYS_CLK_FREQ / TMU_CLK_DIVIDER)
+
+#endif /* __AP325RXA_H */
diff --git a/include/configs/rsk7203.h b/include/configs/rsk7203.h
new file mode 100644 (file)
index 0000000..23598f3
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Configuation settings for the Renesas Technology RSK 7203
+ *
+ * Copyright (C) 2008 Nobuhiro Iwamatsu
+ * Copyright (C) 2008 Renesas Solutions Corp.
+ *
+ * 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 __RSK7203_H
+#define __RSK7203_H
+
+#undef DEBUG
+#define CONFIG_SH              1
+#define CONFIG_SH2             1
+#define CONFIG_SH2A            1
+#define CONFIG_CPU_SH7203      1
+#define CONFIG_RSK7203 1
+
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_NFS
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_SDRAM
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_CACHE
+
+#define CONFIG_BAUDRATE                115200
+#define CONFIG_BOOTARGS                "console=ttySC0,115200"
+#define CONFIG_LOADADDR                0x0C100000 /* RSK7203_SDRAM_BASE + 1MB */
+
+#define CONFIG_VERSION_VARIABLE
+#undef CONFIG_SHOW_BOOT_PROGRESS
+
+/* MEMORY */
+#define RSK7203_SDRAM_BASE     0x0C000000
+#define RSK7203_FLASH_BASE_1   0x20000000      /* Non cache */
+#define RSK7203_FLASH_BANK_SIZE        (4 * 1024 * 1024)
+
+#define CFG_LONGHELP           /* undef to save memory */
+#define CFG_PROMPT     "=> "   /* Monitor Command Prompt */
+#define CFG_CBSIZE     256     /* Buffer size for input from the Console */
+#define CFG_PBSIZE     256     /* Buffer size for Console output */
+#define CFG_MAXARGS    16      /* max args accepted for monitor commands */
+/* Buffer size for Boot Arguments passed to kernel */
+#define CFG_BARGSIZE   512
+/* List of legal baudrate settings for this board */
+#define CFG_BAUDRATE_TABLE     { 115200 }
+
+/* SCIF */
+#define CONFIG_SCIF_CONSOLE    1
+#define CONFIG_CONS_SCIF0      1
+
+#define CFG_MEMTEST_START      RSK7203_SDRAM_BASE
+#define CFG_MEMTEST_END                (CFG_MEMTEST_START + (3 * 1024 * 1024))
+
+#define CFG_SDRAM_BASE         RSK7203_SDRAM_BASE
+#define CFG_SDRAM_SIZE         (32 * 1024 * 1024)
+
+#define CFG_LOAD_ADDR          (CFG_SDRAM_BASE + 1024 * 1024)
+#define CFG_MONITOR_BASE       RSK7203_FLASH_BASE_1
+#define CFG_MONITOR_LEN                (128 * 1024)
+#define CFG_MALLOC_LEN         (256 * 1024)
+#define CFG_GBL_DATA_SIZE      256
+#define CFG_BOOTMAPSZ          (8 * 1024 * 1024)
+
+/* FLASH */
+#define CONFIG_FLASH_CFI_DRIVER
+#define CFG_FLASH_CFI
+#define CFG_FLASH_CFI_WIDTH FLASH_CFI_16BIT
+#undef CFG_FLASH_QUIET_TEST
+#define CFG_FLASH_EMPTY_INFO   /* print 'E' for empty sector on flinfo */
+#define CFG_FLASH_BASE         RSK7203_FLASH_BASE_1
+#define CFG_FLASH_BANKS_LIST   { CFG_FLASH_BASE }
+#define CFG_MAX_FLASH_SECT     64
+#define CFG_MAX_FLASH_BANKS    1
+
+#define CFG_ENV_IS_IN_FLASH
+#define CFG_ENV_SECT_SIZE      (64 * 1024)
+#define CFG_ENV_SIZE           CFG_ENV_SECT_SIZE
+#define CFG_ENV_ADDR           (CFG_MONITOR_BASE + CFG_MONITOR_LEN)
+#define CFG_FLASH_ERASE_TOUT   12000
+#define CFG_FLASH_WRITE_TOUT   500
+
+/* Board Clock */
+#define CONFIG_SYS_CLK_FREQ    33333333
+#define CMT_CLK_DIVIDER        32      /* 8 (default), 32, 128 or 512 */
+#define CFG_HZ                 (CONFIG_SYS_CLK_FREQ / CMT_CLK_DIVIDER)
+
+#endif /* __RSK7203_H */
index 18675c2d536f176cc29d3ea43edddd331c3436b2..74f6e3a89bbdce3b0c447a236aad83b052c8bf33 100644 (file)
  * Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
  */
 #define CFG_NAND_U_BOOT_OFFS   (16 << 10)      /* Offset to RAM U-Boot image */
-#define CFG_NAND_U_BOOT_SIZE   (384 << 10)     /* Size of RAM U-Boot image   */
+#define CFG_NAND_U_BOOT_SIZE   (512 << 10)     /* Size of RAM U-Boot image   */
 
 /*
  * Now the NAND chip has to be defined (no autodetection used!)
diff --git a/include/configs/sh7785lcr.h b/include/configs/sh7785lcr.h
new file mode 100644 (file)
index 0000000..efdb163
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Configuation settings for the Renesas Technology R0P7785LC0011RL board
+ *
+ * Copyright (C) 2008 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
+ *
+ * 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 __SH7785LCR_H
+#define __SH7785LCR_H
+
+#undef DEBUG
+#define CONFIG_SH              1
+#define CONFIG_SH4A            1
+#define CONFIG_CPU_SH7785      1
+#define CONFIG_SH7785LCR       1
+
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_PCI
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_NFS
+#define CONFIG_CMD_DFL
+#define CONFIG_CMD_SDRAM
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_ENV
+
+#define CONFIG_CMD_USB
+#define CONFIG_USB_STORAGE
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#define CONFIG_MAC_PARTITION
+
+#define CONFIG_BAUDRATE                115200
+#define CONFIG_BOOTDELAY       3
+#define CONFIG_BOOTARGS                "console=ttySC1,115200 root=/dev/nfs ip=dhcp"
+
+#define CONFIG_EXTRA_ENV_SETTINGS                                      \
+       "bootdevice=0:1\0"                                              \
+       "usbload=usb reset;usbboot;usb stop;bootm\0"
+
+#define CONFIG_VERSION_VARIABLE
+#undef CONFIG_SHOW_BOOT_PROGRESS
+
+/* MEMORY */
+#define SH7785LCR_SDRAM_BASE           (0x08000000)
+#define SH7785LCR_SDRAM_SIZE           (128 * 1024 * 1024)
+#define SH7785LCR_FLASH_BASE_1         (0xa0000000)
+#define SH7785LCR_FLASH_BANK_SIZE      (64 * 1024 * 1024)
+#define SH7785LCR_USB_BASE             (0xb4000000)
+
+#define CFG_LONGHELP
+#define CFG_PROMPT             "=> "
+#define CFG_CBSIZE             256
+#define CFG_PBSIZE             256
+#define CFG_MAXARGS            16
+#define CFG_BARGSIZE           512
+#define CFG_BAUDRATE_TABLE     { 115200 }
+
+/* SCIF */
+#define CONFIG_SCIF_CONSOLE    1
+#define CONFIG_CONS_SCIF1      1
+#define CONFIG_SCIF_EXT_CLOCK  1
+#undef CFG_CONSOLE_INFO_QUIET
+#undef CFG_CONSOLE_OVERWRITE_ROUTINE
+#undef CFG_CONSOLE_ENV_OVERWRITE
+
+
+#define CFG_MEMTEST_START      (SH7785LCR_SDRAM_BASE)
+#define CFG_MEMTEST_END                (CFG_MEMTEST_START + \
+                                       (SH7785LCR_SDRAM_SIZE) - \
+                                        4 * 1024 * 1024)
+#undef CFG_ALT_MEMTEST
+#undef CFG_MEMTEST_SCRATCH
+#undef CFG_LOADS_BAUD_CHANGE
+
+#define CFG_SDRAM_BASE (SH7785LCR_SDRAM_BASE)
+#define CFG_SDRAM_SIZE (SH7785LCR_SDRAM_SIZE)
+#define CFG_LOAD_ADDR  (CFG_SDRAM_BASE + 16 * 1024 * 1024)
+
+#define CFG_MONITOR_BASE       (SH7785LCR_FLASH_BASE_1)
+#define CFG_MONITOR_LEN                (512 * 1024)
+#define CFG_MALLOC_LEN         (512 * 1024)
+#define CFG_GBL_DATA_SIZE      (256)
+#define CFG_BOOTMAPSZ          (8 * 1024 * 1024)
+
+/* FLASH */
+#define CONFIG_FLASH_CFI_DRIVER
+#define CFG_FLASH_CFI
+#undef CFG_FLASH_QUIET_TEST
+#define CFG_FLASH_EMPTY_INFO
+#define CFG_FLASH_BASE         (SH7785LCR_FLASH_BASE_1)
+#define CFG_MAX_FLASH_SECT     512
+
+#define CFG_MAX_FLASH_BANKS    1
+#define CFG_FLASH_BANKS_LIST   { CFG_FLASH_BASE + \
+                                (0 * SH7785LCR_FLASH_BANK_SIZE) }
+
+#define CFG_FLASH_ERASE_TOUT   (3 * 1000)
+#define CFG_FLASH_WRITE_TOUT   (3 * 1000)
+#define CFG_FLASH_LOCK_TOUT    (3 * 1000)
+#define CFG_FLASH_UNLOCK_TOUT  (3 * 1000)
+
+#undef CFG_FLASH_PROTECTION
+#undef CFG_DIRECT_FLASH_TFTP
+
+/* R8A66597 */
+#define LITTLEENDIAN                   /* for include/usb.h */
+#define CONFIG_USB_R8A66597_HCD
+#define CONFIG_R8A66597_BASE_ADDR      SH7785LCR_USB_BASE
+#define CONFIG_R8A66597_XTAL           0x0000  /* 12MHz */
+#define CONFIG_R8A66597_LDRV           0x8000  /* 3.3V */
+#define CONFIG_R8A66597_ENDIAN         0x0000  /* little */
+
+/* PCI Controller */
+#define CONFIG_PCI
+#define CONFIG_SH4_PCI
+#define CONFIG_SH7780_PCI
+#define CONFIG_PCI_PNP
+#define CONFIG_PCI_SCAN_SHOW   1
+
+#define CONFIG_PCI_MEM_BUS     0xFD000000      /* Memory space base addr */
+#define CONFIG_PCI_MEM_PHYS    CONFIG_PCI_MEM_BUS
+#define CONFIG_PCI_MEM_SIZE    0x01000000      /* Size of Memory window */
+
+#define CONFIG_PCI_IO_BUS      0xFE200000      /* IO space base address */
+#define CONFIG_PCI_IO_PHYS     CONFIG_PCI_IO_BUS
+#define CONFIG_PCI_IO_SIZE     0x00200000      /* Size of IO window */
+
+/* Network device (RTL8169) support */
+#define CONFIG_NET_MULTI
+#define CONFIG_RTL8169
+
+/* ENV setting */
+#define CFG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_OVERWRITE   1
+#define CFG_ENV_SECT_SIZE      (256 * 1024)
+#define CFG_ENV_SIZE           (CFG_ENV_SECT_SIZE)
+#define CFG_ENV_ADDR           (CFG_FLASH_BASE + CFG_MONITOR_LEN)
+#define CFG_ENV_OFFSET         (CFG_ENV_ADDR - CFG_FLASH_BASE)
+#define CFG_ENV_SIZE_REDUND    (CFG_ENV_SECT_SIZE)
+
+/* Board Clock */
+/* The SCIF used external clock. system clock only used timer. */
+#define CONFIG_SYS_CLK_FREQ    50000000
+#define TMU_CLK_DIVIDER                4
+#define CFG_HZ                 (CONFIG_SYS_CLK_FREQ / TMU_CLK_DIVIDER)
+
+#endif /* __SH7785LCR_H */
diff --git a/include/configs/smdk6400.h b/include/configs/smdk6400.h
new file mode 100644 (file)
index 0000000..f0c146e
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ * Gary Jennejohn <gj@denx.de>
+ * David Mueller <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
+ *
+ * Configuation settings for the SAMSUNG SMDK6400(mDirac-III) board.
+ *
+ * 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
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_S3C6400         1       /* in a SAMSUNG S3C6400 SoC     */
+#define CONFIG_S3C64XX         1       /* in a SAMSUNG S3C64XX Family  */
+#define CONFIG_SMDK6400                1       /* on a SAMSUNG SMDK6400 Board  */
+
+#define CFG_SDRAM_BASE 0x50000000
+
+/* input clock of PLL: SMDK6400 has 12MHz input clock */
+#define CONFIG_SYS_CLK_FREQ    12000000
+
+#if !defined(CONFIG_NAND_SPL) && (TEXT_BASE >= 0xc0000000)
+#define CONFIG_ENABLE_MMU
+#endif
+
+#define CONFIG_MEMORY_UPPER_CODE
+
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_INITRD_TAG
+
+/*
+ * Architecture magic and machine type
+ */
+#define MACH_TYPE              1270
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#undef CONFIG_SKIP_RELOCATE_UBOOT
+
+/*
+ * Size of malloc() pool
+ */
+#define CFG_MALLOC_LEN         (CFG_ENV_SIZE + 1024 * 1024)
+#define CFG_GBL_DATA_SIZE      128     /* size in bytes for initial data */
+
+/*
+ * Hardware drivers
+ */
+#define CONFIG_DRIVER_CS8900   1       /* we have a CS8900 on-board    */
+#define CS8900_BASE            0x18800300
+#define CS8900_BUS16           1       /* follow the Linux driver      */
+
+/*
+ * select serial console configuration
+ */
+#define CONFIG_SERIAL1          1      /* we use SERIAL 1 on SMDK6400  */
+
+#define CFG_HUSH_PARSER                        /* use "hush" command parser    */
+#ifdef CFG_HUSH_PARSER
+#define CFG_PROMPT_HUSH_PS2    "> "
+#endif
+
+#define CONFIG_CMDLINE_EDITING
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_BAUDRATE                115200
+
+/***********************************************************
+ * Command definition
+ ***********************************************************/
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_REGINFO
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_NAND
+#if defined(CONFIG_BOOT_ONENAND)
+#define CONFIG_CMD_ONENAND
+#endif
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_ELF
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_EXT2
+
+#define CONFIG_BOOTDELAY       3
+
+#define CONFIG_ZERO_BOOTDELAY_CHECK
+
+#if (CONFIG_COMMANDS & CONFIG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE   115200  /* speed to run kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX  1       /* which serial port to use      */
+#endif
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP                           /* undef to save memory       */
+#define CFG_PROMPT             "SMDK6400 # "   /* Monitor Command Prompt     */
+#define CFG_CBSIZE             256             /* Console I/O Buffer Size    */
+#define CFG_PBSIZE             384             /* Print Buffer Size          */
+#define CFG_MAXARGS            16              /* max number of command args */
+#define CFG_BARGSIZE           CFG_CBSIZE      /* Boot Argument Buffer Size  */
+
+#define CFG_MEMTEST_START      CFG_SDRAM_BASE  /* memtest works on           */
+#define CFG_MEMTEST_END                (CFG_SDRAM_BASE + 0x7e00000) /* 126MB in DRAM */
+
+#define CFG_LOAD_ADDR          CFG_SDRAM_BASE  /* default load address */
+
+#define CFG_HZ                 1000
+
+/* valid baudrates */
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE       0x40000         /* regular stack 256KB */
+
+/**********************************
+ Support Clock Settings
+ **********************************
+ Setting       SYNC    ASYNC
+ ----------------------------------
+ 667_133_66     X        O
+ 533_133_66     O        O
+ 400_133_66     X        O
+ 400_100_50     O        O
+ **********************************/
+
+/*#define CONFIG_CLK_667_133_66*/
+#define CONFIG_CLK_533_133_66
+/*
+#define CONFIG_CLK_400_100_50
+#define CONFIG_CLK_400_133_66
+#define CONFIG_SYNC_MODE
+*/
+
+/* SMDK6400 has 2 banks of DRAM, but we use only one in U-Boot */
+#define CONFIG_NR_DRAM_BANKS   1
+#define PHYS_SDRAM_1           CFG_SDRAM_BASE  /* SDRAM Bank #1        */
+#define PHYS_SDRAM_1_SIZE      0x08000000      /* 128 MB in Bank #1    */
+
+#define CFG_FLASH_BASE         0x10000000
+#define CFG_MONITOR_BASE       0x00000000
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks   */
+/* AM29LV160B has 35 sectors, AM29LV800B - 19 */
+#define CFG_MAX_FLASH_SECT     40
+
+#define CONFIG_AMD_LV800
+#define CFG_FLASH_CFI          1       /* Use CFI parameters (needed?) */
+/* Use drivers/cfi_flash.c, even though the flash is not CFI-compliant */
+#define CONFIG_FLASH_CFI_DRIVER        1
+#define CFG_FLASH_CFI_WIDTH    FLASH_CFI_16BIT
+#define CONFIG_FLASH_CFI_LEGACY
+#define CFG_FLASH_LEGACY_512Kx16
+
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT   (5 * CFG_HZ) /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT   (5 * CFG_HZ) /* Timeout for Flash Write */
+
+#define CFG_ENV_SIZE           0x4000  /* Total Size of Environment Sector */
+
+/*
+ * SMDK6400 board specific data
+ */
+
+#define CONFIG_IDENT_STRING    " for SMDK6400"
+
+/* base address for uboot */
+#define CFG_PHY_UBOOT_BASE     (CFG_SDRAM_BASE + 0x07e00000)
+/* total memory available to uboot */
+#define CFG_UBOOT_SIZE         (1024 * 1024)
+
+#ifdef CONFIG_ENABLE_MMU
+#define CFG_MAPPED_RAM_BASE    0xc0000000
+#define CONFIG_BOOTCOMMAND     "nand read 0xc0018000 0x60000 0x1c0000;" \
+                               "bootm 0xc0018000"
+#else
+#define CFG_MAPPED_RAM_BASE    CFG_SDRAM_BASE
+#define CONFIG_BOOTCOMMAND     "nand read 0x50018000 0x60000 0x1c0000;" \
+                               "bootm 0x50018000"
+#endif
+
+/* NAND U-Boot load and start address */
+#define CFG_UBOOT_BASE         (CFG_MAPPED_RAM_BASE + 0x07e00000)
+
+#define CFG_ENV_OFFSET         0x0040000
+
+/* NAND configuration */
+#define CFG_MAX_NAND_DEVICE    1
+#define CFG_NAND_BASE          0x70200010
+#define NAND_MAX_CHIPS         1
+#define CFG_S3C_NAND_HWECC
+
+#define CFG_NAND_SKIP_BAD_DOT_I        1  /* ".i" read skips bad blocks              */
+#define CFG_NAND_WP            1
+#define CFG_NAND_YAFFS_WRITE   1  /* support yaffs write                     */
+#define CFG_NAND_BBT_2NDPAGE   1  /* bad-block markers in 1st and 2nd pages  */
+
+#define CFG_NAND_U_BOOT_DST    CFG_PHY_UBOOT_BASE      /* NUB load-addr      */
+#define CFG_NAND_U_BOOT_START  CFG_NAND_U_BOOT_DST     /* NUB start-addr     */
+
+#define CFG_NAND_U_BOOT_OFFS   (4 * 1024)      /* Offset to RAM U-Boot image */
+#define CFG_NAND_U_BOOT_SIZE   (252 * 1024)    /* Size of RAM U-Boot image   */
+
+/* NAND chip page size         */
+#define CFG_NAND_PAGE_SIZE     2048
+/* NAND chip block size                */
+#define CFG_NAND_BLOCK_SIZE    (128 * 1024)
+/* NAND chip page per block count  */
+#define CFG_NAND_PAGE_COUNT    64
+/* Location of the bad-block label */
+#define CFG_NAND_BAD_BLOCK_POS 0
+/* Extra address cycle for > 128MiB */
+#define CFG_NAND_5_ADDR_CYCLE
+
+/* Size of the block protected by one OOB (Spare Area in Samsung terminology) */
+#define CFG_NAND_ECCSIZE       CFG_NAND_PAGE_SIZE
+/* Number of ECC bytes per OOB - S3C6400 calculates 4 bytes ECC in 1-bit mode */
+#define CFG_NAND_ECCBYTES      4
+/* Number of ECC-blocks per NAND page */
+#define CFG_NAND_ECCSTEPS      (CFG_NAND_PAGE_SIZE / CFG_NAND_ECCSIZE)
+/* Size of a single OOB region */
+#define CFG_NAND_OOBSIZE       64
+/* Number of ECC bytes per page */
+#define CFG_NAND_ECCTOTAL      (CFG_NAND_ECCBYTES * CFG_NAND_ECCSTEPS)
+/* ECC byte positions */
+#define CFG_NAND_ECCPOS                {40, 41, 42, 43, 44, 45, 46, 47, \
+                                48, 49, 50, 51, 52, 53, 54, 55, \
+                                56, 57, 58, 59, 60, 61, 62, 63}
+
+/* Boot configuration (define only one of next 3) */
+#define CONFIG_BOOT_NAND
+/* None of these are currently implemented. Left from the original Samsung
+ * version for reference
+#define CONFIG_BOOT_NOR
+#define CONFIG_BOOT_MOVINAND
+#define CONFIG_BOOT_ONENAND
+*/
+
+#define CONFIG_NAND
+#define CONFIG_NAND_S3C64XX
+/* Unimplemented or unsupported. See comment above.
+#define CONFIG_ONENAND
+#define CONFIG_MOVINAND
+*/
+
+/* Settings as above boot configuration */
+#define CFG_ENV_IS_IN_NAND
+#define CONFIG_BOOTARGS                "console=ttySAC,115200"
+
+#if !defined(CONFIG_ENABLE_MMU)
+#define CONFIG_CMD_USB                 1
+#define CONFIG_USB_OHCI_NEW            1
+#define CFG_USB_OHCI_REGS_BASE         0x74300000
+#define CFG_USB_OHCI_SLOT_NAME         "s3c6400"
+#define CFG_USB_OHCI_MAX_ROOT_PORTS    3
+#define CFG_USB_OHCI_CPU_INIT          1
+#define LITTLEENDIAN                   1       /* used by usb_ohci.c   */
+
+#define CONFIG_USB_STORAGE     1
+#endif
+#define CONFIG_DOS_PARTITION   1
+
+#if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_ENABLE_MMU)
+# error "usb_ohci.c is currently broken with MMU enabled."
+#endif
+
+#endif /* __CONFIG_H */
index a76b1ca2143f06d2f94687bea2c9e2d97a1d331f..cb418d1e91fdc03c99a22062d8257938d0129ffd 100644 (file)
@@ -58,6 +58,7 @@
 #define CS5_CONFIG             0x00014
 #define CS6_CONFIG             0x00018
 #define CS7_CONFIG             0x0001C
+#define CS_ALE_TIMING_CONFIG   0x00034
 
 #define CS_CTRL                        0x00020
 #define CS_CTRL_ME             0x01000000      /* CS Master Enable bit */
diff --git a/include/mpc5xxx_sdma.h b/include/mpc5xxx_sdma.h
new file mode 100644 (file)
index 0000000..8b740e4
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * This file is based on code
+ * (C) Copyright Motorola, Inc., 2000
+ *
+ * odin smartdma header file
+ */
+
+#ifndef __MPC5XXX_SDMA_H
+#define __MPC5XXX_SDMA_H
+
+#include <common.h>
+#include <mpc5xxx.h>
+
+/* Task number assignment */
+#define FEC_RECV_TASK_NO            0
+#define FEC_XMIT_TASK_NO            1
+
+/*---------------------------------------------------------------------*/
+
+/* Stuff for Ethernet Tx/Rx tasks                                      */
+
+/*---------------------------------------------------------------------*/
+
+/* Layout of Ethernet controller Parameter SRAM area:
+----------------------------------------------------------------
+0x00: TBD_BASE, base address of TX BD ring
+0x04: TBD_NEXT, address of next TX BD to be processed
+0x08: RBD_BASE, base address of RX BD ring
+0x0C: RBD_NEXT, address of next RX BD to be processed
+---------------------------------------------------------------
+ALL PARAMETERS ARE ALL LONGWORDS (FOUR BYTES EACH).
+*/
+
+/* base address of SRAM area to store parameters used by Ethernet tasks */
+#define FEC_PARAM_BASE         (MPC5XXX_SRAM + 0x0800)
+
+/* base address of SRAM area for buffer descriptors */
+#define FEC_BD_BASE            (MPC5XXX_SRAM + 0x0820)
+
+/*---------------------------------------------------------------------*/
+
+/* common shortcuts  used  by driver C code                            */
+
+/*---------------------------------------------------------------------*/
+
+/* Disable SmartDMA task */
+#define SDMA_TASK_DISABLE(tasknum)                     \
+{                                                      \
+    volatile ushort *tcr = (ushort *)(MPC5XXX_SDMA + 0x0000001c + 2 * tasknum); \
+    *tcr = (*tcr) & (~0x8000);                         \
+}
+
+/* Enable SmartDMA task */
+#define SDMA_TASK_ENABLE(tasknum)                      \
+{                                                      \
+    volatile ushort *tcr = (ushort *) (MPC5XXX_SDMA + 0x0000001c + 2 * tasknum); \
+    *tcr = (*tcr)  | 0x8000;                           \
+}
+
+/* Enable interrupt */
+#define SDMA_INT_ENABLE(tasknum)                       \
+{                                                      \
+    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
+    sdma->IntMask &= ~(1 << tasknum);                  \
+}
+
+/* Disable interrupt */
+#define SDMA_INT_DISABLE(tasknum)   \
+{                                                      \
+    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
+    sdma->IntMask |= (1 << tasknum);                   \
+}
+
+
+/* Clear interrupt pending bits */
+#define SDMA_CLEAR_IEVENT(tasknum)  \
+{                                                      \
+    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
+    sdma->IntPend = (1 << tasknum);                    \
+}
+
+/* get interupt pending bit of a task */
+#define SDMA_GET_PENDINGBIT(tasknum)                   \
+       ((*(vu_long *)(MPC5XXX_SDMA + 0x14)) & (1<<(tasknum)))
+
+/* get interupt mask bit of a task */
+#define SDMA_GET_MASKBIT(tasknum)                      \
+       ((*(vu_long *)(MPC5XXX_SDMA + 0x18)) & (1<<(tasknum)))
+
+#endif /* __MPC5XXX_SDMA_H */
diff --git a/include/s3c6400.h b/include/s3c6400.h
new file mode 100644 (file)
index 0000000..fd3e99b
--- /dev/null
@@ -0,0 +1,894 @@
+/*
+ * (C) Copyright 2007
+ * Byungjae Lee, Samsung Erectronics, bjlee@samsung.com.
+ *      - only support for S3C6400
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@denx.de>
+ *
+ * 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
+ */
+
+/************************************************
+ * NAME            : s3c6400.h
+ *
+ * Based on S3C6400 User's manual Rev 0.0
+ ************************************************/
+
+#ifndef __S3C6400_H__
+#define __S3C6400_H__
+
+#ifndef CONFIG_S3C6400
+#define CONFIG_S3C6400         1
+#endif
+
+#define S3C64XX_UART_CHANNELS  3
+#define S3C64XX_SPI_CHANNELS   2
+
+#include <asm/hardware.h>
+
+#define ELFIN_CLOCK_POWER_BASE 0x7e00f000
+
+/* Clock & Power Controller for mDirac3*/
+#define APLL_LOCK_OFFSET       0x00
+#define MPLL_LOCK_OFFSET       0x04
+#define EPLL_LOCK_OFFSET       0x08
+#define APLL_CON_OFFSET                0x0C
+#define MPLL_CON_OFFSET                0x10
+#define EPLL_CON0_OFFSET       0x14
+#define EPLL_CON1_OFFSET       0x18
+#define CLK_SRC_OFFSET         0x1C
+#define CLK_DIV0_OFFSET                0x20
+#define CLK_DIV1_OFFSET                0x24
+#define CLK_DIV2_OFFSET                0x28
+#define CLK_OUT_OFFSET         0x2C
+#define HCLK_GATE_OFFSET       0x30
+#define PCLK_GATE_OFFSET       0x34
+#define SCLK_GATE_OFFSET       0x38
+#define AHB_CON0_OFFSET                0x100
+#define AHB_CON1_OFFSET                0x104
+#define AHB_CON2_OFFSET                0x108
+#define SELECT_DMA_OFFSET      0x110
+#define SW_RST_OFFSET          0x114
+#define SYS_ID_OFFSET          0x118
+#define MEM_SYS_CFG_OFFSET     0x120
+#define QOS_OVERRIDE0_OFFSET   0x124
+#define QOS_OVERRIDE1_OFFSET   0x128
+#define MEM_CFG_STAT_OFFSET    0x12C
+#define PWR_CFG_OFFSET         0x804
+#define EINT_MASK_OFFSET       0x808
+#define NOR_CFG_OFFSET         0x810
+#define STOP_CFG_OFFSET                0x814
+#define SLEEP_CFG_OFFSET       0x818
+#define OSC_FREQ_OFFSET                0x820
+#define OSC_STABLE_OFFSET      0x824
+#define PWR_STABLE_OFFSET      0x828
+#define FPC_STABLE_OFFSET      0x82C
+#define MTC_STABLE_OFFSET      0x830
+#define OTHERS_OFFSET          0x900
+#define RST_STAT_OFFSET                0x904
+#define WAKEUP_STAT_OFFSET     0x908
+#define BLK_PWR_STAT_OFFSET    0x90C
+#define INF_REG0_OFFSET                0xA00
+#define INF_REG1_OFFSET                0xA04
+#define INF_REG2_OFFSET                0xA08
+#define INF_REG3_OFFSET                0xA0C
+#define INF_REG4_OFFSET                0xA10
+#define INF_REG5_OFFSET                0xA14
+#define INF_REG6_OFFSET                0xA18
+#define INF_REG7_OFFSET                0xA1C
+
+#define OSC_CNT_VAL_OFFSET     0x824
+#define PWR_CNT_VAL_OFFSET     0x828
+#define FPC_CNT_VAL_OFFSET     0x82C
+#define MTC_CNT_VAL_OFFSET     0x830
+
+#define APLL_LOCK_REG          __REG(ELFIN_CLOCK_POWER_BASE + APLL_LOCK_OFFSET)
+#define MPLL_LOCK_REG          __REG(ELFIN_CLOCK_POWER_BASE + MPLL_LOCK_OFFSET)
+#define EPLL_LOCK_REG          __REG(ELFIN_CLOCK_POWER_BASE + EPLL_LOCK_OFFSET)
+#define APLL_CON_REG           __REG(ELFIN_CLOCK_POWER_BASE + APLL_CON_OFFSET)
+#define MPLL_CON_REG           __REG(ELFIN_CLOCK_POWER_BASE + MPLL_CON_OFFSET)
+#define EPLL_CON0_REG          __REG(ELFIN_CLOCK_POWER_BASE + EPLL_CON0_OFFSET)
+#define EPLL_CON1_REG          __REG(ELFIN_CLOCK_POWER_BASE + EPLL_CON1_OFFSET)
+#define CLK_SRC_REG            __REG(ELFIN_CLOCK_POWER_BASE + CLK_SRC_OFFSET)
+#define CLK_DIV0_REG           __REG(ELFIN_CLOCK_POWER_BASE + CLK_DIV0_OFFSET)
+#define CLK_DIV1_REG           __REG(ELFIN_CLOCK_POWER_BASE + CLK_DIV1_OFFSET)
+#define CLK_DIV2_REG           __REG(ELFIN_CLOCK_POWER_BASE + CLK_DIV2_OFFSET)
+#define CLK_OUT_REG            __REG(ELFIN_CLOCK_POWER_BASE + CLK_OUT_OFFSET)
+#define HCLK_GATE_REG          __REG(ELFIN_CLOCK_POWER_BASE + HCLK_GATE_OFFSET)
+#define PCLK_GATE_REG          __REG(ELFIN_CLOCK_POWER_BASE + PCLK_GATE_OFFSET)
+#define SCLK_GATE_REG          __REG(ELFIN_CLOCK_POWER_BASE + SCLK_GATE_OFFSET)
+#define AHB_CON0_REG           __REG(ELFIN_CLOCK_POWER_BASE + AHB_CON0_OFFSET)
+#define AHB_CON1_REG           __REG(ELFIN_CLOCK_POWER_BASE + AHB_CON1_OFFSET)
+#define AHB_CON2_REG           __REG(ELFIN_CLOCK_POWER_BASE + AHB_CON2_OFFSET)
+#define SELECT_DMA_REG         __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     SELECT_DMA_OFFSET)
+#define SW_RST_REG             __REG(ELFIN_CLOCK_POWER_BASE + SW_RST_OFFSET)
+#define SYS_ID_REG             __REG(ELFIN_CLOCK_POWER_BASE + SYS_ID_OFFSET)
+#define MEM_SYS_CFG_REG                __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     MEM_SYS_CFG_OFFSET)
+#define QOS_OVERRIDE0_REG      __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     QOS_OVERRIDE0_OFFSET)
+#define QOS_OVERRIDE1_REG      __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     QOS_OVERRIDE1_OFFSET)
+#define MEM_CFG_STAT_REG       __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     MEM_CFG_STAT_OFFSET)
+#define PWR_CFG_REG            __REG(ELFIN_CLOCK_POWER_BASE + PWR_CFG_OFFSET)
+#define EINT_MASK_REG          __REG(ELFIN_CLOCK_POWER_BASE + EINT_MASK_OFFSET)
+#define NOR_CFG_REG            __REG(ELFIN_CLOCK_POWER_BASE + NOR_CFG_OFFSET)
+#define STOP_CFG_REG           __REG(ELFIN_CLOCK_POWER_BASE + STOP_CFG_OFFSET)
+#define SLEEP_CFG_REG          __REG(ELFIN_CLOCK_POWER_BASE + SLEEP_CFG_OFFSET)
+#define OSC_FREQ_REG           __REG(ELFIN_CLOCK_POWER_BASE + OSC_FREQ_OFFSET)
+#define OSC_CNT_VAL_REG                __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     OSC_CNT_VAL_OFFSET)
+#define PWR_CNT_VAL_REG                __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     PWR_CNT_VAL_OFFSET)
+#define FPC_CNT_VAL_REG                __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     FPC_CNT_VAL_OFFSET)
+#define MTC_CNT_VAL_REG                __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     MTC_CNT_VAL_OFFSET)
+#define OTHERS_REG             __REG(ELFIN_CLOCK_POWER_BASE + OTHERS_OFFSET)
+#define RST_STAT_REG           __REG(ELFIN_CLOCK_POWER_BASE + RST_STAT_OFFSET)
+#define WAKEUP_STAT_REG                __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     WAKEUP_STAT_OFFSET)
+#define BLK_PWR_STAT_REG       __REG(ELFIN_CLOCK_POWER_BASE + \
+                                     BLK_PWR_STAT_OFFSET)
+#define INF_REG0_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG0_OFFSET)
+#define INF_REG1_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG1_OFFSET)
+#define INF_REG2_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG2_OFFSET)
+#define INF_REG3_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG3_OFFSET)
+#define INF_REG4_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG4_OFFSET)
+#define INF_REG5_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG5_OFFSET)
+#define INF_REG6_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG6_OFFSET)
+#define INF_REG7_REG           __REG(ELFIN_CLOCK_POWER_BASE + INF_REG7_OFFSET)
+
+#define APLL_LOCK      (ELFIN_CLOCK_POWER_BASE + APLL_LOCK_OFFSET)
+#define MPLL_LOCK      (ELFIN_CLOCK_POWER_BASE + MPLL_LOCK_OFFSET)
+#define EPLL_LOCK      (ELFIN_CLOCK_POWER_BASE + EPLL_LOCK_OFFSET)
+#define APLL_CON       (ELFIN_CLOCK_POWER_BASE + APLL_CON_OFFSET)
+#define MPLL_CON       (ELFIN_CLOCK_POWER_BASE + MPLL_CON_OFFSET)
+#define EPLL_CON0      (ELFIN_CLOCK_POWER_BASE + EPLL_CON0_OFFSET)
+#define EPLL_CON1      (ELFIN_CLOCK_POWER_BASE + EPLL_CON1_OFFSET)
+#define CLK_SRC                (ELFIN_CLOCK_POWER_BASE + CLK_SRC_OFFSET)
+#define CLK_DIV0       (ELFIN_CLOCK_POWER_BASE + CLK_DIV0_OFFSET)
+#define CLK_DIV1       (ELFIN_CLOCK_POWER_BASE + CLK_DIV1_OFFSET)
+#define CLK_DIV2       (ELFIN_CLOCK_POWER_BASE + CLK_DIV2_OFFSET)
+#define CLK_OUT                (ELFIN_CLOCK_POWER_BASE + CLK_OUT_OFFSET)
+#define HCLK_GATE      (ELFIN_CLOCK_POWER_BASE + HCLK_GATE_OFFSET)
+#define PCLK_GATE      (ELFIN_CLOCK_POWER_BASE + PCLK_GATE_OFFSET)
+#define SCLK_GATE      (ELFIN_CLOCK_POWER_BASE + SCLK_GATE_OFFSET)
+#define AHB_CON0       (ELFIN_CLOCK_POWER_BASE + AHB_CON0_OFFSET)
+#define AHB_CON1       (ELFIN_CLOCK_POWER_BASE + AHB_CON1_OFFSET)
+#define AHB_CON2       (ELFIN_CLOCK_POWER_BASE + AHB_CON2_OFFSET)
+#define SELECT_DMA     (ELFIN_CLOCK_POWER_BASE + SELECT_DMA_OFFSET)
+#define SW_RST         (ELFIN_CLOCK_POWER_BASE + SW_RST_OFFSET)
+#define SYS_ID         (ELFIN_CLOCK_POWER_BASE + SYS_ID_OFFSET)
+#define MEM_SYS_CFG    (ELFIN_CLOCK_POWER_BASE + MEM_SYS_CFG_OFFSET)
+#define QOS_OVERRIDE0  (ELFIN_CLOCK_POWER_BASE + QOS_OVERRIDE0_OFFSET)
+#define QOS_OVERRIDE1  (ELFIN_CLOCK_POWER_BASE + QOS_OVERRIDE1_OFFSET)
+#define MEM_CFG_STAT   (ELFIN_CLOCK_POWER_BASE + MEM_CFG_STAT_OFFSET)
+#define PWR_CFG                (ELFIN_CLOCK_POWER_BASE + PWR_CFG_OFFSET)
+#define EINT_MASK      (ELFIN_CLOCK_POWER_BASE + EINT_MASK_OFFSET)
+#define NOR_CFG                (ELFIN_CLOCK_POWER_BASE + NOR_CFG_OFFSET)
+#define STOP_CFG       (ELFIN_CLOCK_POWER_BASE + STOP_CFG_OFFSET)
+#define SLEEP_CFG      (ELFIN_CLOCK_POWER_BASE + SLEEP_CFG_OFFSET)
+#define OSC_FREQ       (ELFIN_CLOCK_POWER_BASE + OSC_FREQ_OFFSET)
+#define OSC_CNT_VAL    (ELFIN_CLOCK_POWER_BASE + OSC_CNT_VAL_OFFSET)
+#define PWR_CNT_VAL    (ELFIN_CLOCK_POWER_BASE + PWR_CNT_VAL_OFFSET)
+#define FPC_CNT_VAL    (ELFIN_CLOCK_POWER_BASE + FPC_CNT_VAL_OFFSET)
+#define MTC_CNT_VAL    (ELFIN_CLOCK_POWER_BASE + MTC_CNT_VAL_OFFSET)
+#define OTHERS         (ELFIN_CLOCK_POWER_BASE + OTHERS_OFFSET)
+#define RST_STAT       (ELFIN_CLOCK_POWER_BASE + RST_STAT_OFFSET)
+#define WAKEUP_STAT    (ELFIN_CLOCK_POWER_BASE + WAKEUP_STAT_OFFSET)
+#define BLK_PWR_STAT   (ELFIN_CLOCK_POWER_BASE + BLK_PWR_STAT_OFFSET)
+#define INF_REG0       (ELFIN_CLOCK_POWER_BASE + INF_REG0_OFFSET)
+#define INF_REG1       (ELFIN_CLOCK_POWER_BASE + INF_REG1_OFFSET)
+#define INF_REG2       (ELFIN_CLOCK_POWER_BASE + INF_REG2_OFFSET)
+#define INF_REG3       (ELFIN_CLOCK_POWER_BASE + INF_REG3_OFFSET)
+#define INF_REG4       (ELFIN_CLOCK_POWER_BASE + INF_REG4_OFFSET)
+#define INF_REG5       (ELFIN_CLOCK_POWER_BASE + INF_REG5_OFFSET)
+#define INF_REG6       (ELFIN_CLOCK_POWER_BASE + INF_REG6_OFFSET)
+#define INF_REG7       (ELFIN_CLOCK_POWER_BASE + INF_REG7_OFFSET)
+
+
+/*
+ * GPIO
+ */
+#define ELFIN_GPIO_BASE                0x7f008000
+
+#define GPACON_OFFSET          0x00
+#define GPADAT_OFFSET          0x04
+#define GPAPUD_OFFSET          0x08
+#define GPACONSLP_OFFSET       0x0C
+#define GPAPUDSLP_OFFSET       0x10
+#define GPBCON_OFFSET          0x20
+#define GPBDAT_OFFSET          0x04
+#define GPBPUD_OFFSET          0x08
+#define GPBCONSLP_OFFSET       0x0C
+#define GPBPUDSLP_OFFSET       0x30
+#define GPCCON_OFFSET          0x40
+#define GPCDAT_OFFSET          0x44
+#define GPCPUD_OFFSET          0x48
+#define GPCCONSLP_OFFSET       0x4C
+#define GPCPUDSLP_OFFSET       0x50
+#define GPDCON_OFFSET          0x60
+#define GPDDAT_OFFSET          0x64
+#define GPDPUD_OFFSET          0x68
+#define GPDCONSLP_OFFSET       0x6C
+#define GPDPUDSLP_OFFSET       0x70
+#define GPECON_OFFSET          0x80
+#define GPEDAT_OFFSET          0x84
+#define GPEPUD_OFFSET          0x88
+#define GPECONSLP_OFFSET       0x8C
+#define GPEPUDSLP_OFFSET       0x90
+#define GPFCON_OFFSET          0xA0
+#define GPFDAT_OFFSET          0xA4
+#define GPFPUD_OFFSET          0xA8
+#define GPFCONSLP_OFFSET       0xAC
+#define GPFPUDSLP_OFFSET       0xB0
+#define GPGCON_OFFSET          0xC0
+#define GPGDAT_OFFSET          0xC4
+#define GPGPUD_OFFSET          0xC8
+#define GPGCONSLP_OFFSET       0xCC
+#define GPGPUDSLP_OFFSET       0xD0
+#define GPHCON0_OFFSET         0xE0
+#define GPHCON1_OFFSET         0xE4
+#define GPHDAT_OFFSET          0xE8
+#define GPHPUD_OFFSET          0xEC
+#define GPHCONSLP_OFFSET       0xF0
+#define GPHPUDSLP_OFFSET       0xF4
+#define GPICON_OFFSET          0x100
+#define GPIDAT_OFFSET          0x104
+#define GPIPUD_OFFSET          0x108
+#define GPICONSLP_OFFSET       0x10C
+#define GPIPUDSLP_OFFSET       0x110
+#define GPJCON_OFFSET          0x120
+#define GPJDAT_OFFSET          0x124
+#define GPJPUD_OFFSET          0x128
+#define GPJCONSLP_OFFSET       0x12C
+#define GPJPUDSLP_OFFSET       0x130
+#define MEM0DRVCON_OFFSET      0x1D0
+#define MEM1DRVCON_OFFSET      0x1D4
+#define GPKCON0_OFFSET         0x800
+#define GPKCON1_OFFSET         0x804
+#define GPKDAT_OFFSET          0x808
+#define GPKPUD_OFFSET          0x80C
+#define GPLCON0_OFFSET         0x810
+#define GPLCON1_OFFSET         0x814
+#define GPLDAT_OFFSET          0x818
+#define GPLPUD_OFFSET          0x81C
+#define GPMCON_OFFSET          0x820
+#define GPMDAT_OFFSET          0x824
+#define GPMPUD_OFFSET          0x828
+#define GPNCON_OFFSET          0x830
+#define GPNDAT_OFFSET          0x834
+#define GPNPUD_OFFSET          0x838
+#define GPOCON_OFFSET          0x140
+#define GPODAT_OFFSET          0x144
+#define GPOPUD_OFFSET          0x148
+#define GPOCONSLP_OFFSET       0x14C
+#define GPOPUDSLP_OFFSET       0x150
+#define GPPCON_OFFSET          0x160
+#define GPPDAT_OFFSET          0x164
+#define GPPPUD_OFFSET          0x168
+#define GPPCONSLP_OFFSET       0x16C
+#define GPPPUDSLP_OFFSET       0x170
+#define GPQCON_OFFSET          0x180
+#define GPQDAT_OFFSET          0x184
+#define GPQPUD_OFFSET          0x188
+#define GPQCONSLP_OFFSET       0x18C
+#define GPQPUDSLP_OFFSET       0x190
+
+#define EINTPEND_OFFSET                0x924
+
+#define GPACON_REG             __REG(ELFIN_GPIO_BASE + GPACON_OFFSET)
+#define GPADAT_REG             __REG(ELFIN_GPIO_BASE + GPADAT_OFFSET)
+#define GPAPUD_REG             __REG(ELFIN_GPIO_BASE + GPAPUD_OFFSET)
+#define GPACONSLP_REG          __REG(ELFIN_GPIO_BASE + GPACONSLP_OFFSET)
+#define GPAPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPAPUDSLP_OFFSET)
+#define GPBCON_REG             __REG(ELFIN_GPIO_BASE + GPBCON_OFFSET)
+#define GPBDAT_REG             __REG(ELFIN_GPIO_BASE + GPBDAT_OFFSET)
+#define GPBPUD_REG             __REG(ELFIN_GPIO_BASE + GPBPUD_OFFSET)
+#define GPBCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPBCONSLP_OFFSET)
+#define GPBPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPBPUDSLP_OFFSET)
+#define GPCCON_REG             __REG(ELFIN_GPIO_BASE + GPCCON_OFFSET)
+#define GPCDAT_REG             __REG(ELFIN_GPIO_BASE + GPCDAT_OFFSET)
+#define GPCPUD_REG             __REG(ELFIN_GPIO_BASE + GPCPUD_OFFSET)
+#define GPCCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPCCONSLP_OFFSET)
+#define GPCPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPCPUDSLP_OFFSET)
+#define GPDCON_REG             __REG(ELFIN_GPIO_BASE + GPDCON_OFFSET)
+#define GPDDAT_REG             __REG(ELFIN_GPIO_BASE + GPDDAT_OFFSET)
+#define GPDPUD_REG             __REG(ELFIN_GPIO_BASE + GPDPUD_OFFSET)
+#define GPDCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPDCONSLP_OFFSET)
+#define GPDPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPDPUDSLP_OFFSET)
+#define GPECON_REG             __REG(ELFIN_GPIO_BASE + GPECON_OFFSET)
+#define GPEDAT_REG             __REG(ELFIN_GPIO_BASE + GPEDAT_OFFSET)
+#define GPEPUD_REG             __REG(ELFIN_GPIO_BASE + GPEPUD_OFFSET)
+#define GPECONSLP_REG          __REG(ELFIN_GPIO_BASE + GPECONSLP_OFFSET)
+#define GPEPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPEPUDSLP_OFFSET)
+#define GPFCON_REG             __REG(ELFIN_GPIO_BASE + GPFCON_OFFSET)
+#define GPFDAT_REG             __REG(ELFIN_GPIO_BASE + GPFDAT_OFFSET)
+#define GPFPUD_REG             __REG(ELFIN_GPIO_BASE + GPFPUD_OFFSET)
+#define GPFCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPFCONSLP_OFFSET)
+#define GPFPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPFPUDSLP_OFFSET)
+#define GPGCON_REG             __REG(ELFIN_GPIO_BASE + GPGCON_OFFSET)
+#define GPGDAT_REG             __REG(ELFIN_GPIO_BASE + GPGDAT_OFFSET)
+#define GPGPUD_REG             __REG(ELFIN_GPIO_BASE + GPGPUD_OFFSET)
+#define GPGCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPGCONSLP_OFFSET)
+#define GPGPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPGPUDSLP_OFFSET)
+#define GPHCON0_REG            __REG(ELFIN_GPIO_BASE + GPHCON0_OFFSET)
+#define GPHCON1_REG            __REG(ELFIN_GPIO_BASE + GPHCON1_OFFSET)
+#define GPHDAT_REG             __REG(ELFIN_GPIO_BASE + GPHDAT_OFFSET)
+#define GPHPUD_REG             __REG(ELFIN_GPIO_BASE + GPHPUD_OFFSET)
+#define GPHCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPHCONSLP_OFFSET)
+#define GPHPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPHPUDSLP_OFFSET)
+#define GPICON_REG             __REG(ELFIN_GPIO_BASE + GPICON_OFFSET)
+#define GPIDAT_REG             __REG(ELFIN_GPIO_BASE + GPIDAT_OFFSET)
+#define GPIPUD_REG             __REG(ELFIN_GPIO_BASE + GPIPUD_OFFSET)
+#define GPICONSLP_REG          __REG(ELFIN_GPIO_BASE + GPICONSLP_OFFSET)
+#define GPIPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPIPUDSLP_OFFSET)
+#define GPJCON_REG             __REG(ELFIN_GPIO_BASE + GPJCON_OFFSET)
+#define GPJDAT_REG             __REG(ELFIN_GPIO_BASE + GPJDAT_OFFSET)
+#define GPJPUD_REG             __REG(ELFIN_GPIO_BASE + GPJPUD_OFFSET)
+#define GPJCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPJCONSLP_OFFSET)
+#define GPJPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPJPUDSLP_OFFSET)
+#define GPKCON0_REG            __REG(ELFIN_GPIO_BASE + GPKCON0_OFFSET)
+#define GPKCON1_REG            __REG(ELFIN_GPIO_BASE + GPKCON1_OFFSET)
+#define GPKDAT_REG             __REG(ELFIN_GPIO_BASE + GPKDAT_OFFSET)
+#define GPKPUD_REG             __REG(ELFIN_GPIO_BASE + GPKPUD_OFFSET)
+#define GPLCON0_REG            __REG(ELFIN_GPIO_BASE + GPLCON0_OFFSET)
+#define GPLCON1_REG            __REG(ELFIN_GPIO_BASE + GPLCON1_OFFSET)
+#define GPLDAT_REG             __REG(ELFIN_GPIO_BASE + GPLDAT_OFFSET)
+#define GPLPUD_REG             __REG(ELFIN_GPIO_BASE + GPLPUD_OFFSET)
+#define GPMCON_REG             __REG(ELFIN_GPIO_BASE + GPMCON_OFFSET)
+#define GPMDAT_REG             __REG(ELFIN_GPIO_BASE + GPMDAT_OFFSET)
+#define GPMPUD_REG             __REG(ELFIN_GPIO_BASE + GPMPUD_OFFSET)
+#define GPNCON_REG             __REG(ELFIN_GPIO_BASE + GPNCON_OFFSET)
+#define GPNDAT_REG             __REG(ELFIN_GPIO_BASE + GPNDAT_OFFSET)
+#define GPNPUD_REG             __REG(ELFIN_GPIO_BASE + GPNPUD_OFFSET)
+#define GPOCON_REG             __REG(ELFIN_GPIO_BASE + GPOCON_OFFSET)
+#define GPODAT_REG             __REG(ELFIN_GPIO_BASE + GPODAT_OFFSET)
+#define GPOPUD_REG             __REG(ELFIN_GPIO_BASE + GPOPUD_OFFSET)
+#define GPOCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPOCONSLP_OFFSET)
+#define GPOPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPOPUDSLP_OFFSET)
+#define GPPCON_REG             __REG(ELFIN_GPIO_BASE + GPPCON_OFFSET)
+#define GPPDAT_REG             __REG(ELFIN_GPIO_BASE + GPPDAT_OFFSET)
+#define GPPPUD_REG             __REG(ELFIN_GPIO_BASE + GPPPUD_OFFSET)
+#define GPPCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPPCONSLP_OFFSET)
+#define GPPPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPPPUDSLP_OFFSET)
+#define GPQCON_REG             __REG(ELFIN_GPIO_BASE + GPQCON_OFFSET)
+#define GPQDAT_REG             __REG(ELFIN_GPIO_BASE + GPQDAT_OFFSET)
+#define GPQPUD_REG             __REG(ELFIN_GPIO_BASE + GPQPUD_OFFSET)
+#define GPQCONSLP_REG          __REG(ELFIN_GPIO_BASE + GPQCONSLP_OFFSET)
+#define GPQPUDSLP_REG          __REG(ELFIN_GPIO_BASE + GPQPUDSLP_OFFSET)
+
+/*
+ * Bus Matrix
+ */
+#define ELFIN_MEM_SYS_CFG      0x7e00f120
+
+#define GPACON         (ELFIN_GPIO_BASE + GPACON_OFFSET)
+#define GPADAT         (ELFIN_GPIO_BASE + GPADAT_OFFSET)
+#define GPAPUD         (ELFIN_GPIO_BASE + GPAPUD_OFFSET)
+#define GPACONSLP      (ELFIN_GPIO_BASE + GPACONSLP_OFFSET)
+#define GPAPUDSLP      (ELFIN_GPIO_BASE + GPAPUDSLP_OFFSET)
+#define GPBCON         (ELFIN_GPIO_BASE + GPBCON_OFFSET)
+#define GPBDAT         (ELFIN_GPIO_BASE + GPBDAT_OFFSET)
+#define GPBPUD         (ELFIN_GPIO_BASE + GPBPUD_OFFSET)
+#define GPBCONSLP      (ELFIN_GPIO_BASE + GPBCONSLP_OFFSET)
+#define GPBPUDSLP      (ELFIN_GPIO_BASE + GPBPUDSLP_OFFSET)
+#define GPCCON         (ELFIN_GPIO_BASE + GPCCON_OFFSET)
+#define GPCDAT         (ELFIN_GPIO_BASE + GPCDAT_OFFSET)
+#define GPCPUD         (ELFIN_GPIO_BASE + GPCPUD_OFFSET)
+#define GPCCONSLP      (ELFIN_GPIO_BASE + GPCCONSLP_OFFSET)
+#define GPCPUDSLP      (ELFIN_GPIO_BASE + GPCPUDSLP_OFFSET)
+#define GPDCON         (ELFIN_GPIO_BASE + GPDCON_OFFSET)
+#define GPDDAT         (ELFIN_GPIO_BASE + GPDDAT_OFFSET)
+#define GPDPUD         (ELFIN_GPIO_BASE + GPDPUD_OFFSET)
+#define GPDCONSLP      (ELFIN_GPIO_BASE + GPDCONSLP_OFFSET)
+#define GPDPUDSLP      (ELFIN_GPIO_BASE + GPDPUDSLP_OFFSET)
+#define GPECON         (ELFIN_GPIO_BASE + GPECON_OFFSET)
+#define GPEDAT         (ELFIN_GPIO_BASE + GPEDAT_OFFSET)
+#define GPEPUD         (ELFIN_GPIO_BASE + GPEPUD_OFFSET)
+#define GPECONSLP      (ELFIN_GPIO_BASE + GPECONSLP_OFFSET)
+#define GPEPUDSLP      (ELFIN_GPIO_BASE + GPEPUDSLP_OFFSET)
+#define GPFCON         (ELFIN_GPIO_BASE + GPFCON_OFFSET)
+#define GPFDAT         (ELFIN_GPIO_BASE + GPFDAT_OFFSET)
+#define GPFPUD         (ELFIN_GPIO_BASE + GPFPUD_OFFSET)
+#define GPFCONSLP      (ELFIN_GPIO_BASE + GPFCONSLP_OFFSET)
+#define GPFPUDSLP      (ELFIN_GPIO_BASE + GPFPUDSLP_OFFSET)
+#define GPGCON         (ELFIN_GPIO_BASE + GPGCON_OFFSET)
+#define GPGDAT         (ELFIN_GPIO_BASE + GPGDAT_OFFSET)
+#define GPGPUD         (ELFIN_GPIO_BASE + GPGPUD_OFFSET)
+#define GPGCONSLP      (ELFIN_GPIO_BASE + GPGCONSLP_OFFSET)
+#define GPGPUDSLP      (ELFIN_GPIO_BASE + GPGPUDSLP_OFFSET)
+#define GPHCON0                (ELFIN_GPIO_BASE + GPHCON0_OFFSET)
+#define GPHCON1                (ELFIN_GPIO_BASE + GPHCON1_OFFSET)
+#define GPHDAT         (ELFIN_GPIO_BASE + GPHDAT_OFFSET)
+#define GPHPUD         (ELFIN_GPIO_BASE + GPHPUD_OFFSET)
+#define GPHCONSLP      (ELFIN_GPIO_BASE + GPHCONSLP_OFFSET)
+#define GPHPUDSLP      (ELFIN_GPIO_BASE + GPHPUDSLP_OFFSET)
+#define GPICON         (ELFIN_GPIO_BASE + GPICON_OFFSET)
+#define GPIDAT         (ELFIN_GPIO_BASE + GPIDAT_OFFSET)
+#define GPIPUD         (ELFIN_GPIO_BASE + GPIPUD_OFFSET)
+#define GPICONSLP      (ELFIN_GPIO_BASE + GPICONSLP_OFFSET)
+#define GPIPUDSLP      (ELFIN_GPIO_BASE + GPIPUDSLP_OFFSET)
+#define GPJCON         (ELFIN_GPIO_BASE + GPJCON_OFFSET)
+#define GPJDAT         (ELFIN_GPIO_BASE + GPJDAT_OFFSET)
+#define GPJPUD         (ELFIN_GPIO_BASE + GPJPUD_OFFSET)
+#define GPJCONSLP      (ELFIN_GPIO_BASE + GPJCONSLP_OFFSET)
+#define GPJPUDSLP      (ELFIN_GPIO_BASE + GPJPUDSLP_OFFSET)
+#define GPKCON0                (ELFIN_GPIO_BASE + GPKCON0_OFFSET)
+#define GPKCON1                (ELFIN_GPIO_BASE + GPKCON1_OFFSET)
+#define GPKDAT         (ELFIN_GPIO_BASE + GPKDAT_OFFSET)
+#define GPKPUD         (ELFIN_GPIO_BASE + GPKPUD_OFFSET)
+#define GPLCON0                (ELFIN_GPIO_BASE + GPLCON0_OFFSET)
+#define GPLCON1                (ELFIN_GPIO_BASE + GPLCON1_OFFSET)
+#define GPLDAT         (ELFIN_GPIO_BASE + GPLDAT_OFFSET)
+#define GPLPUD         (ELFIN_GPIO_BASE + GPLPUD_OFFSET)
+#define GPMCON         (ELFIN_GPIO_BASE + GPMCON_OFFSET)
+#define GPMDAT         (ELFIN_GPIO_BASE + GPMDAT_OFFSET)
+#define GPMPUD         (ELFIN_GPIO_BASE + GPMPUD_OFFSET)
+#define GPNCON         (ELFIN_GPIO_BASE + GPNCON_OFFSET)
+#define GPNDAT         (ELFIN_GPIO_BASE + GPNDAT_OFFSET)
+#define GPNPUD         (ELFIN_GPIO_BASE + GPNPUD_OFFSET)
+#define GPOCON         (ELFIN_GPIO_BASE + GPOCON_OFFSET)
+#define GPODAT         (ELFIN_GPIO_BASE + GPODAT_OFFSET)
+#define GPOPUD         (ELFIN_GPIO_BASE + GPOPUD_OFFSET)
+#define GPOCONSLP      (ELFIN_GPIO_BASE + GPOCONSLP_OFFSET)
+#define GPOPUDSLP      (ELFIN_GPIO_BASE + GPOPUDSLP_OFFSET)
+#define GPPCON         (ELFIN_GPIO_BASE + GPPCON_OFFSET)
+#define GPPDAT         (ELFIN_GPIO_BASE + GPPDAT_OFFSET)
+#define GPPPUD         (ELFIN_GPIO_BASE + GPPPUD_OFFSET)
+#define GPPCONSLP      (ELFIN_GPIO_BASE + GPPCONSLP_OFFSET)
+#define GPPPUDSLP      (ELFIN_GPIO_BASE + GPPPUDSLP_OFFSET)
+#define GPQCON         (ELFIN_GPIO_BASE + GPQCON_OFFSET)
+#define GPQDAT         (ELFIN_GPIO_BASE + GPQDAT_OFFSET)
+#define GPQPUD         (ELFIN_GPIO_BASE + GPQPUD_OFFSET)
+#define GPQCONSLP      (ELFIN_GPIO_BASE + GPQCONSLP_OFFSET)
+#define GPQPUDSLP      (ELFIN_GPIO_BASE + GPQPUDSLP_OFFSET)
+
+/*
+ * Memory controller
+ */
+#define ELFIN_SROM_BASE                0x70000000
+
+#define SROM_BW_REG    __REG(ELFIN_SROM_BASE + 0x0)
+#define SROM_BC0_REG   __REG(ELFIN_SROM_BASE + 0x4)
+#define SROM_BC1_REG   __REG(ELFIN_SROM_BASE + 0x8)
+#define SROM_BC2_REG   __REG(ELFIN_SROM_BASE + 0xC)
+#define SROM_BC3_REG   __REG(ELFIN_SROM_BASE + 0x10)
+#define SROM_BC4_REG   __REG(ELFIN_SROM_BASE + 0x14)
+#define SROM_BC5_REG   __REG(ELFIN_SROM_BASE + 0x18)
+
+/*
+ * SDRAM Controller
+ */
+#define ELFIN_DMC0_BASE                0x7e000000
+#define ELFIN_DMC1_BASE                0x7e001000
+
+#define INDEX_DMC_MEMC_STATUS  0x00
+#define INDEX_DMC_MEMC_CMD     0x04
+#define INDEX_DMC_DIRECT_CMD   0x08
+#define INDEX_DMC_MEMORY_CFG   0x0C
+#define INDEX_DMC_REFRESH_PRD  0x10
+#define INDEX_DMC_CAS_LATENCY  0x14
+#define INDEX_DMC_T_DQSS       0x18
+#define INDEX_DMC_T_MRD                0x1C
+#define INDEX_DMC_T_RAS                0x20
+#define INDEX_DMC_T_RC         0x24
+#define INDEX_DMC_T_RCD                0x28
+#define INDEX_DMC_T_RFC                0x2C
+#define INDEX_DMC_T_RP         0x30
+#define INDEX_DMC_T_RRD                0x34
+#define INDEX_DMC_T_WR         0x38
+#define INDEX_DMC_T_WTR                0x3C
+#define INDEX_DMC_T_XP         0x40
+#define INDEX_DMC_T_XSR                0x44
+#define INDEX_DMC_T_ESR                0x48
+#define INDEX_DMC_MEMORY_CFG2  0x4C
+#define INDEX_DMC_CHIP_0_CFG   0x200
+#define INDEX_DMC_CHIP_1_CFG   0x204
+#define INDEX_DMC_CHIP_2_CFG   0x208
+#define INDEX_DMC_CHIP_3_CFG   0x20C
+#define INDEX_DMC_USER_STATUS  0x300
+#define INDEX_DMC_USER_CONFIG  0x304
+
+/*
+ * Memory Chip direct command
+ */
+#define DMC_NOP0       0x0c0000
+#define DMC_NOP1       0x1c0000
+#define DMC_PA0                0x000000        /* Precharge all */
+#define DMC_PA1                0x100000
+#define DMC_AR0                0x040000        /* Autorefresh */
+#define DMC_AR1                0x140000
+#define DMC_SDR_MR0    0x080032        /* MRS, CAS 3,  Burst Length 4 */
+#define DMC_SDR_MR1    0x180032
+#define DMC_DDR_MR0    0x080162
+#define DMC_DDR_MR1    0x180162
+#define DMC_mDDR_MR0   0x080032        /* CAS 3, Burst Length 4 */
+#define DMC_mDDR_MR1   0x180032
+#define DMC_mSDR_EMR0  0x0a0000        /* EMRS, DS:Full, PASR:Full Array */
+#define DMC_mSDR_EMR1  0x1a0000
+#define DMC_DDR_EMR0   0x090000
+#define DMC_DDR_EMR1   0x190000
+#define DMC_mDDR_EMR0  0x0a0000        /*  DS:Full, PASR:Full Array */
+#define DMC_mDDR_EMR1  0x1a0000
+
+/*
+ * Definitions for memory configuration
+ * Set memory configuration
+ *     active_chips    = 1'b0 (1 chip)
+ *     qos_master_chip = 3'b000(ARID[3:0])
+ *     memory burst    = 3'b010(burst 4)
+ *     stop_mem_clock  = 1'b0(disable dynamical stop)
+ *     auto_power_down = 1'b0(disable auto power-down mode)
+ *     power_down_prd  = 6'b00_0000(0 cycle for auto power-down)
+ *     ap_bit          = 1'b0 (bit position of auto-precharge is 10)
+ *     row_bits        = 3'b010(# row address 13)
+ *     column_bits     = 3'b010(# column address 10 )
+ *
+ * Set user configuration
+ *     2'b10=SDRAM/mSDRAM, 2'b11=DDR, 2'b01=mDDR
+ *
+ * Set chip select for chip [n]
+ *      row bank control, bank address 0x3000_0000 ~ 0x37ff_ffff
+ *      CHIP_[n]_CFG=0x30F8,  30: ADDR[31:24], F8: Mask[31:24]
+ */
+
+/*
+ * Nand flash controller
+ */
+#define ELFIN_NAND_BASE                0x70200000
+
+#define NFCONF_OFFSET          0x00
+#define NFCONT_OFFSET          0x04
+#define NFCMMD_OFFSET          0x08
+#define NFADDR_OFFSET          0x0c
+#define NFDATA_OFFSET          0x10
+#define NFMECCDATA0_OFFSET     0x14
+#define NFMECCDATA1_OFFSET     0x18
+#define NFSECCDATA0_OFFSET     0x1c
+#define NFSBLK_OFFSET          0x20
+#define NFEBLK_OFFSET          0x24
+#define NFSTAT_OFFSET          0x28
+#define NFESTAT0_OFFSET                0x2c
+#define NFESTAT1_OFFSET                0x30
+#define NFMECC0_OFFSET         0x34
+#define NFMECC1_OFFSET         0x38
+#define NFSECC_OFFSET          0x3c
+#define NFMLCBITPT_OFFSET      0x40
+
+#define NFCONF                 (ELFIN_NAND_BASE + NFCONF_OFFSET)
+#define NFCONT                 (ELFIN_NAND_BASE + NFCONT_OFFSET)
+#define NFCMMD                 (ELFIN_NAND_BASE + NFCMMD_OFFSET)
+#define NFADDR                 (ELFIN_NAND_BASE + NFADDR_OFFSET)
+#define NFDATA                 (ELFIN_NAND_BASE + NFDATA_OFFSET)
+#define NFMECCDATA0            (ELFIN_NAND_BASE + NFMECCDATA0_OFFSET)
+#define NFMECCDATA1            (ELFIN_NAND_BASE + NFMECCDATA1_OFFSET)
+#define NFSECCDATA0            (ELFIN_NAND_BASE + NFSECCDATA0_OFFSET)
+#define NFSBLK                 (ELFIN_NAND_BASE + NFSBLK_OFFSET)
+#define NFEBLK                 (ELFIN_NAND_BASE + NFEBLK_OFFSET)
+#define NFSTAT                 (ELFIN_NAND_BASE + NFSTAT_OFFSET)
+#define NFESTAT0               (ELFIN_NAND_BASE + NFESTAT0_OFFSET)
+#define NFESTAT1               (ELFIN_NAND_BASE + NFESTAT1_OFFSET)
+#define NFMECC0                        (ELFIN_NAND_BASE + NFMECC0_OFFSET)
+#define NFMECC1                        (ELFIN_NAND_BASE + NFMECC1_OFFSET)
+#define NFSECC                 (ELFIN_NAND_BASE + NFSECC_OFFSET)
+#define NFMLCBITPT             (ELFIN_NAND_BASE + NFMLCBITPT_OFFSET)
+
+#define NFCONF_REG             __REG(ELFIN_NAND_BASE + NFCONF_OFFSET)
+#define NFCONT_REG             __REG(ELFIN_NAND_BASE + NFCONT_OFFSET)
+#define NFCMD_REG              __REG(ELFIN_NAND_BASE + NFCMMD_OFFSET)
+#define NFADDR_REG             __REG(ELFIN_NAND_BASE + NFADDR_OFFSET)
+#define NFDATA_REG             __REG(ELFIN_NAND_BASE + NFDATA_OFFSET)
+#define NFDATA8_REG            __REGb(ELFIN_NAND_BASE + NFDATA_OFFSET)
+#define NFMECCDATA0_REG                __REG(ELFIN_NAND_BASE + NFMECCDATA0_OFFSET)
+#define NFMECCDATA1_REG                __REG(ELFIN_NAND_BASE + NFMECCDATA1_OFFSET)
+#define NFSECCDATA0_REG                __REG(ELFIN_NAND_BASE + NFSECCDATA0_OFFSET)
+#define NFSBLK_REG             __REG(ELFIN_NAND_BASE + NFSBLK_OFFSET)
+#define NFEBLK_REG             __REG(ELFIN_NAND_BASE + NFEBLK_OFFSET)
+#define NFSTAT_REG             __REG(ELFIN_NAND_BASE + NFSTAT_OFFSET)
+#define NFESTAT0_REG           __REG(ELFIN_NAND_BASE + NFESTAT0_OFFSET)
+#define NFESTAT1_REG           __REG(ELFIN_NAND_BASE + NFESTAT1_OFFSET)
+#define NFMECC0_REG            __REG(ELFIN_NAND_BASE + NFMECC0_OFFSET)
+#define NFMECC1_REG            __REG(ELFIN_NAND_BASE + NFMECC1_OFFSET)
+#define NFSECC_REG             __REG(ELFIN_NAND_BASE + NFSECC_OFFSET)
+#define NFMLCBITPT_REG         __REG(ELFIN_NAND_BASE + NFMLCBITPT_OFFSET)
+
+#define NFCONF_ECC_4BIT                (1<<24)
+
+#define NFCONT_ECC_ENC         (1<<18)
+#define NFCONT_WP              (1<<16)
+#define NFCONT_MECCLOCK                (1<<7)
+#define NFCONT_SECCLOCK                (1<<6)
+#define NFCONT_INITMECC                (1<<5)
+#define NFCONT_INITSECC                (1<<4)
+#define NFCONT_INITECC         (NFCONT_INITMECC | NFCONT_INITSECC)
+#define NFCONT_CS_ALT          (1<<2)
+#define NFCONT_CS              (1<<1)
+#define NFCONT_ENABLE          (1<<0)
+
+#define NFSTAT_ECCENCDONE      (1<<7)
+#define NFSTAT_ECCDECDONE      (1<<6)
+#define NFSTAT_RnB             (1<<0)
+
+#define NFESTAT0_ECCBUSY       (1<<31)
+
+/*
+ * Interrupt
+ */
+#define ELFIN_VIC0_BASE_ADDR   0x71200000
+#define ELFIN_VIC1_BASE_ADDR   0x71300000
+#define oINTMOD                        0x0C    /* VIC INT SELECT (IRQ or FIQ) */
+#define oINTUNMSK              0x10    /* VIC INT EN (write 1 to unmask) */
+#define oINTMSK                        0x14    /* VIC INT EN CLEAR (write 1 to mask) */
+#define oINTSUBMSK             0x1C    /* VIC SOFT INT CLEAR */
+#define oVECTADDR              0xF00 /* VIC ADDRESS */
+
+/*
+ * Watchdog timer
+ */
+#define ELFIN_WATCHDOG_BASE    0x7E004000
+
+#define WTCON_REG              __REG(0x7E004004)
+#define WTDAT_REG              __REG(0x7E004008)
+#define WTCNT_REG              __REG(0x7E00400C)
+
+
+/*
+ * UART
+ */
+#define ELFIN_UART_BASE                0x7F005000
+
+#define ELFIN_UART0_OFFSET     0x0000
+#define ELFIN_UART1_OFFSET     0x0400
+#define ELFIN_UART2_OFFSET     0x0800
+
+#define ULCON_OFFSET           0x00
+#define UCON_OFFSET            0x04
+#define UFCON_OFFSET           0x08
+#define UMCON_OFFSET           0x0C
+#define UTRSTAT_OFFSET         0x10
+#define UERSTAT_OFFSET         0x14
+#define UFSTAT_OFFSET          0x18
+#define UMSTAT_OFFSET          0x1C
+#define UTXH_OFFSET            0x20
+#define URXH_OFFSET            0x24
+#define UBRDIV_OFFSET          0x28
+#define UDIVSLOT_OFFSET                0x2C
+#define UINTP_OFFSET           0x30
+#define UINTSP_OFFSET          0x34
+#define UINTM_OFFSET           0x38
+
+#define ULCON0_REG             __REG(0x7F005000)
+#define UCON0_REG              __REG(0x7F005004)
+#define UFCON0_REG             __REG(0x7F005008)
+#define UMCON0_REG             __REG(0x7F00500C)
+#define UTRSTAT0_REG           __REG(0x7F005010)
+#define UERSTAT0_REG           __REG(0x7F005014)
+#define UFSTAT0_REG            __REG(0x7F005018)
+#define UMSTAT0_REG            __REG(0x7F00501c)
+#define UTXH0_REG              __REG(0x7F005020)
+#define URXH0_REG              __REG(0x7F005024)
+#define UBRDIV0_REG            __REG(0x7F005028)
+#define UDIVSLOT0_REG          __REG(0x7F00502c)
+#define UINTP0_REG             __REG(0x7F005030)
+#define UINTSP0_REG            __REG(0x7F005034)
+#define UINTM0_REG             __REG(0x7F005038)
+
+#define ULCON1_REG             __REG(0x7F005400)
+#define UCON1_REG              __REG(0x7F005404)
+#define UFCON1_REG             __REG(0x7F005408)
+#define UMCON1_REG             __REG(0x7F00540C)
+#define UTRSTAT1_REG           __REG(0x7F005410)
+#define UERSTAT1_REG           __REG(0x7F005414)
+#define UFSTAT1_REG            __REG(0x7F005418)
+#define UMSTAT1_REG            __REG(0x7F00541c)
+#define UTXH1_REG              __REG(0x7F005420)
+#define URXH1_REG              __REG(0x7F005424)
+#define UBRDIV1_REG            __REG(0x7F005428)
+#define UDIVSLOT1_REG          __REG(0x7F00542c)
+#define UINTP1_REG             __REG(0x7F005430)
+#define UINTSP1_REG            __REG(0x7F005434)
+#define UINTM1_REG             __REG(0x7F005438)
+
+#define UTRSTAT_TX_EMPTY       (1 << 2)
+#define UTRSTAT_RX_READY       (1 << 0)
+#define UART_ERR_MASK          0xF
+
+/*
+ * PWM timer
+ */
+#define ELFIN_TIMER_BASE       0x7F006000
+
+#define TCFG0_REG      __REG(0x7F006000)
+#define TCFG1_REG      __REG(0x7F006004)
+#define TCON_REG       __REG(0x7F006008)
+#define TCNTB0_REG     __REG(0x7F00600c)
+#define TCMPB0_REG     __REG(0x7F006010)
+#define TCNTO0_REG     __REG(0x7F006014)
+#define TCNTB1_REG     __REG(0x7F006018)
+#define TCMPB1_REG     __REG(0x7F00601c)
+#define TCNTO1_REG     __REG(0x7F006020)
+#define TCNTB2_REG     __REG(0x7F006024)
+#define TCMPB2_REG     __REG(0x7F006028)
+#define TCNTO2_REG     __REG(0x7F00602c)
+#define TCNTB3_REG     __REG(0x7F006030)
+#define TCMPB3_REG     __REG(0x7F006034)
+#define TCNTO3_REG     __REG(0x7F006038)
+#define TCNTB4_REG     __REG(0x7F00603c)
+#define TCNTO4_REG     __REG(0x7F006040)
+
+/* Fields */
+#define fTCFG0_DZONE           Fld(8, 16) /* the dead zone length (=timer 0) */
+#define fTCFG0_PRE1            Fld(8, 8)  /* prescaler value for time 2,3,4 */
+#define fTCFG0_PRE0            Fld(8, 0)  /* prescaler value for time 0,1 */
+#define fTCFG1_MUX4            Fld(4, 16)
+/* bits */
+#define TCFG0_DZONE(x)         FInsrt((x), fTCFG0_DZONE)
+#define TCFG0_PRE1(x)          FInsrt((x), fTCFG0_PRE1)
+#define TCFG0_PRE0(x)          FInsrt((x), fTCFG0_PRE0)
+#define TCON_4_AUTO            (1 << 22)  /* auto reload on/off for Timer 4 */
+#define TCON_4_UPDATE          (1 << 21)  /* manual Update TCNTB4 */
+#define TCON_4_ONOFF           (1 << 20)  /* 0: Stop, 1: start Timer 4 */
+#define COUNT_4_ON             (TCON_4_ONOFF * 1)
+#define COUNT_4_OFF            (TCON_4_ONOFF * 0)
+#define TCON_3_AUTO            (1 << 19)  /* auto reload on/off for Timer 3 */
+#define TIMER3_ATLOAD_ON       (TCON_3_AUTO * 1)
+#define TIMER3_ATLAOD_OFF      FClrBit(TCON, TCON_3_AUTO)
+#define TCON_3_INVERT          (1 << 18)  /* 1: Inverter on for TOUT3 */
+#define TIMER3_IVT_ON          (TCON_3_INVERT * 1)
+#define TIMER3_IVT_OFF         (FClrBit(TCON, TCON_3_INVERT))
+#define TCON_3_MAN             (1 << 17)  /* manual Update TCNTB3,TCMPB3 */
+#define TIMER3_MANUP           (TCON_3_MAN*1)
+#define TIMER3_NOP             (FClrBit(TCON, TCON_3_MAN))
+#define TCON_3_ONOFF           (1 << 16)  /* 0: Stop, 1: start Timer 3 */
+#define TIMER3_ON              (TCON_3_ONOFF * 1)
+#define TIMER3_OFF             (FClrBit(TCON, TCON_3_ONOFF))
+
+#if defined(CONFIG_CLK_400_100_50)
+#define STARTUP_AMDIV          400
+#define STARTUP_MDIV           400
+#define STARTUP_PDIV           6
+#define STARTUP_SDIV           1
+#elif defined(CONFIG_CLK_400_133_66)
+#define STARTUP_AMDIV          400
+#define STARTUP_MDIV           533
+#define STARTUP_PDIV           6
+#define STARTUP_SDIV           1
+#elif defined(CONFIG_CLK_533_133_66)
+#define STARTUP_AMDIV          533
+#define STARTUP_MDIV           533
+#define STARTUP_PDIV           6
+#define STARTUP_SDIV           1
+#elif defined(CONFIG_CLK_667_133_66)
+#define STARTUP_AMDIV          667
+#define STARTUP_MDIV           533
+#define STARTUP_PDIV           6
+#define STARTUP_SDIV           1
+#endif
+
+#define        STARTUP_PCLKDIV         3
+#define STARTUP_HCLKX2DIV      1
+#define STARTUP_HCLKDIV                1
+#define STARTUP_MPLLDIV                1
+#define STARTUP_APLLDIV                0
+
+#define CLK_DIV_VAL    ((STARTUP_PCLKDIV << 12) | (STARTUP_HCLKX2DIV << 9) | \
+       (STARTUP_HCLKDIV << 8) | (STARTUP_MPLLDIV<<4) | STARTUP_APLLDIV)
+#define MPLL_VAL       ((1 << 31) | (STARTUP_MDIV << 16) | \
+       (STARTUP_PDIV << 8) | STARTUP_SDIV)
+#define STARTUP_MPLL   (((CONFIG_SYS_CLK_FREQ >> STARTUP_SDIV) / \
+       STARTUP_PDIV) * STARTUP_MDIV)
+
+#if defined(CONFIG_SYNC_MODE)
+#define APLL_VAL       ((1 << 31) | (STARTUP_MDIV << 16) | \
+       (STARTUP_PDIV << 8) | STARTUP_SDIV)
+#define STARTUP_APLL   (((CONFIG_SYS_CLK_FREQ >> STARTUP_SDIV) / \
+       STARTUP_PDIV) * STARTUP_MDIV)
+#define STARTUP_HCLK   (STARTUP_MPLL / (STARTUP_HCLKX2DIV + 1) / \
+       (STARTUP_HCLKDIV + 1))
+#else
+#define APLL_VAL       ((1 << 31) | (STARTUP_AMDIV << 16) | \
+       (STARTUP_PDIV << 8) | STARTUP_SDIV)
+#define STARTUP_APLL   (((CONFIG_SYS_CLK_FREQ >> STARTUP_SDIV) / \
+       STARTUP_PDIV) * STARTUP_AMDIV)
+#define STARTUP_HCLK   (STARTUP_MPLL / (STARTUP_HCLKX2DIV + 1) / \
+       (STARTUP_HCLKDIV + 1))
+#endif
+
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define DMC1_MEM_CFG   0x80010012      /* Chip1, Burst4, Row/Column bit */
+#define DMC1_MEM_CFG2  0xB45
+#define DMC1_CHIP0_CFG 0x150F8         /* 0x4000_0000 ~ 0x43ff_ffff (64MB) */
+#define DMC_DDR_32_CFG 0x0             /* 32bit, DDR */
+
+/* Memory Parameters */
+/* DDR Parameters */
+#define DDR_tREFRESH           7800    /* ns */
+#define DDR_tRAS               45      /* ns (min: 45ns)*/
+#define DDR_tRC                68      /* ns (min: 67.5ns)*/
+#define DDR_tRCD               23      /* ns (min: 22.5ns)*/
+#define DDR_tRFC               80      /* ns (min: 80ns)*/
+#define DDR_tRP                23      /* ns (min: 22.5ns)*/
+#define DDR_tRRD               15      /* ns (min: 15ns)*/
+#define DDR_tWR                15      /* ns (min: 15ns)*/
+#define DDR_tXSR               120     /* ns (min: 120ns)*/
+#define DDR_CASL               3       /* CAS Latency 3 */
+
+/*
+ * mDDR memory configuration
+ */
+
+#define NS_TO_CLK(t)           ((STARTUP_HCLK / 1000 * (t) - 1) / 1000000)
+
+#define DMC_DDR_BA_EMRS        2
+#define DMC_DDR_MEM_CASLAT     3
+/* 6   Set Cas Latency to 3 */
+#define DMC_DDR_CAS_LATENCY    (DDR_CASL << 1)
+/* Min 0.75 ~ 1.25 */
+#define DMC_DDR_t_DQSS         1
+/* Min 2 tck */
+#define DMC_DDR_t_MRD          2
+/* 7, Min 45ns */
+#define DMC_DDR_t_RAS          (NS_TO_CLK(DDR_tRAS) + 1)
+/* 10, Min 67.5ns */
+#define DMC_DDR_t_RC           (NS_TO_CLK(DDR_tRC) + 1)
+/* 4,5(TRM), Min 22.5ns */
+#define DMC_DDR_t_RCD          (NS_TO_CLK(DDR_tRCD) + 1)
+#define DMC_DDR_schedule_RCD   ((DMC_DDR_t_RCD - 3) << 3)
+/* 11,18(TRM) Min 80ns */
+#define DMC_DDR_t_RFC          (NS_TO_CLK(DDR_tRFC) + 1)
+#define DMC_DDR_schedule_RFC   ((DMC_DDR_t_RFC - 3) << 5)
+/* 4, 5(TRM) Min 22.5ns */
+#define DMC_DDR_t_RP           (NS_TO_CLK(DDR_tRP) + 1)
+#define DMC_DDR_schedule_RP    ((DMC_DDR_t_RP - 3) << 3)
+/* 3, Min 15ns */
+#define DMC_DDR_t_RRD          (NS_TO_CLK(DDR_tRRD) + 1)
+/* Min 15ns */
+#define DMC_DDR_t_WR           (NS_TO_CLK(DDR_tWR) + 1)
+#define DMC_DDR_t_WTR          2
+/* 1tck + tIS(1.5ns) */
+#define DMC_DDR_t_XP           2
+/* 17, Min 120ns */
+#define DMC_DDR_t_XSR          (NS_TO_CLK(DDR_tXSR) + 1)
+#define DMC_DDR_t_ESR          DMC_DDR_t_XSR
+/* TRM 2656 */
+#define DMC_DDR_REFRESH_PRD    (NS_TO_CLK(DDR_tREFRESH))
+/* 2b01 : mDDR */
+#define DMC_DDR_USER_CONFIG    1
+
+#ifndef __ASSEMBLY__
+enum s3c64xx_uarts_nr {
+       S3C64XX_UART0,
+       S3C64XX_UART1,
+       S3C64XX_UART2,
+};
+
+#include "s3c64x0.h"
+
+static inline s3c64xx_uart *s3c64xx_get_base_uart(enum s3c64xx_uarts_nr nr)
+{
+       return (s3c64xx_uart *)(ELFIN_UART_BASE + (nr * 0x400));
+}
+#endif
+
+#endif /*__S3C6400_H__*/
diff --git a/include/s3c64x0.h b/include/s3c64x0.h
new file mode 100644 (file)
index 0000000..0bbf1d0
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * (C) Copyright 2003
+ * David MÃŒller ELSOFT AG Switzerland. d.mueller@elsoft.ch
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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
+ */
+
+/************************************************
+ * NAME            : S3C64XX.h
+ * Version  : 31.3.2003
+ *
+ * common stuff for SAMSUNG S3C64XX SoC
+ ************************************************/
+
+#ifndef __S3C64XX_H__
+#define __S3C64XX_H__
+
+#if defined(CONFIG_SYNC_MODE) && defined(CONFIG_S3C6400)
+#error CONFIG_SYNC_MODE unavailable on S3C6400, please, fix your configuration!
+#endif
+
+#include <asm/types.h>
+
+/* UART (see manual chapter 11) */
+typedef struct {
+       volatile u32    ULCON;
+       volatile u32    UCON;
+       volatile u32    UFCON;
+       volatile u32    UMCON;
+       volatile u32    UTRSTAT;
+       volatile u32    UERSTAT;
+       volatile u32    UFSTAT;
+       volatile u32    UMSTAT;
+#ifdef __BIG_ENDIAN
+       volatile u8     res1[3];
+       volatile u8     UTXH;
+       volatile u8     res2[3];
+       volatile u8     URXH;
+#else /* Little Endian */
+       volatile u8     UTXH;
+       volatile u8     res1[3];
+       volatile u8     URXH;
+       volatile u8     res2[3];
+#endif
+       volatile u32    UBRDIV;
+#ifdef __BIG_ENDIAN
+       volatile u8     res3[2];
+       volatile u16    UDIVSLOT;
+#else
+       volatile u16    UDIVSLOT;
+       volatile u8     res3[2];
+#endif
+} s3c64xx_uart;
+
+/* PWM TIMER (see manual chapter 10) */
+typedef struct {
+       volatile u32    TCNTB;
+       volatile u32    TCMPB;
+       volatile u32    TCNTO;
+} s3c64xx_timer;
+
+typedef struct {
+       volatile u32    TCFG0;
+       volatile u32    TCFG1;
+       volatile u32    TCON;
+       s3c64xx_timer   ch[4];
+       volatile u32    TCNTB4;
+       volatile u32    TCNTO4;
+} s3c64xx_timers;
+
+#endif /*__S3C64XX_H__*/
index 6e3ef088001862cfd3a79b0cc11446e145d5f4f8..5ade882a97e9d19527e025d846f7f77327c8516d 100644 (file)
@@ -430,9 +430,9 @@ void start_armboot (void)
 
        /* Perform network card initialisation if necessary */
 #ifdef CONFIG_DRIVER_TI_EMAC
-extern void dm644x_eth_set_mac_addr (const u_int8_t *addr);
+extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
        if (getenv ("ethaddr")) {
-               dm644x_eth_set_mac_addr(gd->bd->bi_enetaddr);
+               davinci_eth_set_mac_addr(gd->bd->bi_enetaddr);
        }
 #endif
 
index e59c6b0859b03bc9f0027f7deafc5fdb39c0bb63..4fee35aeabff926dc3dfcd2934416f1b45ff3d3b 100644 (file)
@@ -63,6 +63,8 @@
 #include <spi.h>
 #endif
 
+#include <nand.h>
+
 DECLARE_GLOBAL_DATA_PTR;
 
 static char *failed = "*** failed ***\n";
diff --git a/nand_spl/board/samsung/smdk6400/Makefile b/nand_spl/board/samsung/smdk6400/Makefile
new file mode 100644 (file)
index 0000000..ae9eb2a
--- /dev/null
@@ -0,0 +1,106 @@
+#
+# (C) Copyright 2006-2007
+# Stefan Roese, DENX Software Engineering, sr@denx.de.
+#
+# (C) Copyright 2008
+# Guennadi Liakhovetki, DENX Software Engineering, <lg@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
+#
+
+CONFIG_NAND_SPL        = y
+
+include $(TOPDIR)/config.mk
+include $(TOPDIR)/nand_spl/board/$(BOARDDIR)/config.mk
+
+LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
+LDFLAGS        = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
+AFLAGS += -DCONFIG_NAND_SPL
+CFLAGS += -DCONFIG_NAND_SPL
+
+SOBJS  = start.o cpu_init.o lowlevel_init.o
+COBJS  = nand_boot.o nand_ecc.o s3c64xx.o
+
+SRCS   := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+__OBJS := $(SOBJS) $(COBJS)
+LNDIR  := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
+
+nandobj        := $(OBJTREE)/nand_spl/
+
+ALL    = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
+
+all:   $(obj).depend $(ALL)
+
+$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl
+       $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(PAD_TO) -O binary $< $@
+
+$(nandobj)u-boot-spl.bin:      $(nandobj)u-boot-spl
+       $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+
+$(nandobj)u-boot-spl:  $(OBJS)
+       cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) \
+               -Map $(nandobj)u-boot-spl.map \
+               -o $(nandobj)u-boot-spl
+
+# create symbolic links for common files
+
+# from cpu directory
+$(obj)start.S:
+       @rm -f $@
+       @ln -s $(TOPDIR)/cpu/arm1176/start.S $@
+
+# from SoC directory
+$(obj)cpu_init.S:
+       @rm -f $@
+       @ln -s $(TOPDIR)/cpu/arm1176/s3c64xx/cpu_init.S $@
+
+# from board directory
+$(obj)lowlevel_init.S:
+       @rm -f $@
+       @ln -s $(TOPDIR)/board/samsung/smdk6400/lowlevel_init.S $@
+
+# from nand_spl directory
+$(obj)nand_boot.c:
+       @rm -f $@
+       @ln -s $(TOPDIR)/nand_spl/nand_boot.c $@
+
+# from drivers/mtd/nand directory
+$(obj)nand_ecc.c:
+       @rm -f $@
+       @ln -s $(TOPDIR)/drivers/mtd/nand/nand_ecc.c $@
+
+$(obj)s3c64xx.c:
+       @rm -f $@
+       @ln -s $(TOPDIR)/drivers/mtd/nand/s3c64xx.c $@
+
+#########################################################################
+
+$(obj)%.o:     $(obj)%.S
+       $(CC) $(AFLAGS) -c -o $@ $<
+
+$(obj)%.o:     $(obj)%.c
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/nand_spl/board/samsung/smdk6400/config.mk b/nand_spl/board/samsung/smdk6400/config.mk
new file mode 100644 (file)
index 0000000..4b16230
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# (C) Copyright 2006
+# Stefan Roese, DENX Software Engineering, sr@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
+#
+#
+# Samsung S3C64xx Reference Platform (smdk6400) board
+
+# TEXT_BASE for SPL:
+#
+# On S3C64xx platforms the SPL is located in SRAM at 0.
+#
+# TEXT_BASE = 0
+
+include $(TOPDIR)/board/$(BOARDDIR)/config.mk
+
+# PAD_TO used to generate a 4kByte binary needed for the combined image
+# -> PAD_TO = TEXT_BASE + 4096
+PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096])
+
+ifeq ($(debug),1)
+PLATFORM_CPPFLAGS += -DDEBUG
+endif
diff --git a/nand_spl/board/samsung/smdk6400/u-boot.lds b/nand_spl/board/samsung/smdk6400/u-boot.lds
new file mode 100644 (file)
index 0000000..1bf022c
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
+ *
+ * (C) Copyright 2008
+ * Guennadi Liakhovetki, DENX Software Engineering, <lg@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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         start.o       (.text)
+         cpu_init.o    (.text)
+         nand_boot.o   (.text)
+
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       __u_boot_cmd_start = .;
+       .u_boot_cmd : { *(.u_boot_cmd) }
+       __u_boot_cmd_end = .;
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss : { *(.bss) }
+       _end = .;
+}
index 4e508a0f91b72ffee374c4326f843a1ce993f468..85fa0da2375fdb785884073956a8c5c81ed25961 100644 (file)
--- a/net/eth.c
+++ b/net/eth.c
@@ -576,7 +576,7 @@ extern int at91rm9200_miiphy_initialize(bd_t *bis);
 extern int emac4xx_miiphy_initialize(bd_t *bis);
 extern int mcf52x2_miiphy_initialize(bd_t *bis);
 extern int ns7520_miiphy_initialize(bd_t *bis);
-extern int dm644x_eth_miiphy_initialize(bd_t *bis);
+extern int davinci_eth_miiphy_initialize(bd_t *bis);
 
 
 int eth_initialize(bd_t *bis)
@@ -599,7 +599,7 @@ int eth_initialize(bd_t *bis)
        ns7520_miiphy_initialize(bis);
 #endif
 #if defined(CONFIG_DRIVER_TI_EMAC)
-       dm644x_eth_miiphy_initialize(bis);
+       davinci_eth_miiphy_initialize(bis);
 #endif
        return 0;
 }