Merge with /home/hs/MAN/u-boot-dev
authorWolfgang Denk <wd@pollux.denx.de>
Mon, 15 Jan 2007 11:56:52 +0000 (12:56 +0100)
committerWolfgang Denk <wd@denx.de>
Mon, 15 Jan 2007 11:56:52 +0000 (12:56 +0100)
69 files changed:
CHANGELOG
MAKEALL
Makefile
board/amcc/sequoia/init.S
board/amcc/sequoia/sdram.c
board/amcc/sequoia/sdram.h [new file with mode: 0644]
board/amcc/sequoia/sequoia.c
board/amcc/yellowstone/yellowstone.c
board/amcc/yosemite/yosemite.c
board/dave/PPChameleonEVB/nand.c
board/delta/nand.c
board/idmr/Makefile [new file with mode: 0644]
board/idmr/config.mk [new file with mode: 0644]
board/idmr/flash.c [new file with mode: 0644]
board/idmr/idmr.c [new file with mode: 0644]
board/idmr/u-boot.lds [new file with mode: 0644]
board/mcc200/auto_update.c
board/mcc200/mcc200.c
board/nc650/nand.c
board/netstar/nand.c
board/prodrive/alpr/alpr.c
board/prodrive/alpr/nand.c
board/prodrive/pdnb3/nand.c
board/spc1920/Makefile
board/spc1920/hpi.c [new file with mode: 0644]
board/spc1920/hpi.h [new file with mode: 0644]
board/spc1920/pld.h
board/spc1920/spc1920.c
board/tqm5200/cam5200_flash.c
board/tqm8272/Makefile [new file with mode: 0644]
board/tqm8272/config.mk [new file with mode: 0644]
board/tqm8272/tqm8272.c [new file with mode: 0644]
board/tqm8272/u-boot.lds [new file with mode: 0644]
board/v38b/v38b.c
board/zylonite/nand.c
common/cmd_boot.c
common/cmd_nvedit.c
common/environment.c
cpu/mcf52x2/start.S
cpu/mpc8260/cpu.c
cpu/mpc8260/cpu_init.c
cpu/mpc8260/pci.c
cpu/mpc8260/speed.c
cpu/mpc8xx/serial.c
cpu/ppc4xx/cpu.c
cpu/ppc4xx/cpu_init.c
cpu/ppc4xx/ndfc.c
cpu/ppc4xx/sdram.c
drivers/cfi_flash.c
drivers/nand/nand.c
drivers/nand/nand_base.c
include/asm-ppc/processor.h
include/configs/TQM5200.h
include/configs/TQM8272.h [new file with mode: 0644]
include/configs/alpr.h
include/configs/idmr.h [new file with mode: 0644]
include/configs/sequoia.h
include/configs/spc1920.h
include/configs/v38b.h
include/configs/yellowstone.h
include/configs/yosemite.h
include/flash.h
include/mpc8260.h
include/ppc440.h
lib_m68k/time.c
lib_ppc/board.c
nand_spl/board/amcc/sequoia/Makefile
rtc/Makefile
rtc/ds3231.c [new file with mode: 0644]

index b74f53698c3b606de6920e90f25efcdbefecccea..41040ef70d6c14d73e088bbd7eea534bf8665e76 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,235 @@
+commit 787fa15860a57833e50bd30555079a9cd4e519b8
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Wed Jan 10 01:28:39 2007 +0100
+
+    Fix auto_update for MCC200 board.
+
+    The invocation of do_auto_update() is moved to the end of the
+    misc_init_r() function, after the flash mappings have been
+    initialized. Please find attached a patch that implements that
+    change.
+
+    Also correct the decoding of the keypad status. With this update, the
+    key that will trigger the update is Column 2, Row 2.
+
+commit 67fea022fa957f59653b5238c7496f80a6b70432
+Author: Markus Klotzbuecher <mk@denx.de>
+Date:  Tue Jan 9 16:02:48 2007 +0100
+
+    SPC1920: cleanup memory contoller setup
+
+commit 8fc2102faa23593c80381437c09f7745a14deb40
+Author: Markus Klotzbuecher <mk@denx.de>
+Date:  Tue Jan 9 14:57:14 2007 +0100
+
+    Fix the cpu speed setup to work with all boards.
+
+commit 9295acb77481cf099ef9b40e1fa2d145b3c7490c
+Author: Markus Klotzbuecher <mk@denx.de>
+Date:  Tue Jan 9 14:57:13 2007 +0100
+
+    SPC1920: add support for the FM18L08 Ramtron FRAM
+
+commit 38ccd2fdf3364a53fe80e9b365303ecdafc9e223
+Author: Markus Klotzbuecher <mk@denx.de>
+Date:  Tue Jan 9 14:57:13 2007 +0100
+
+    SPC1920: update the HPI register addresses to work with the second
+    generation of hardware
+
+commit 5921e5313fc3eadd42770c2b99badd7fae5ecf1e
+Author: Markus Klotzbuecher <mk@creamnet.de>
+Date:  Tue Jan 9 14:57:13 2007 +0100
+
+    Miscellanious spc1920 related cleanups
+
+commit e4c2d37adc8bb1bf69dcf600cbc6c75f916a6120
+Author: Markus Klotzbuecher <mk@denx.de>
+Date:  Tue Jan 9 14:57:12 2007 +0100
+
+    SPC1920 GO/NOGO led should be set to color red in U-Boot
+
+commit 0be62728aac459ba268d6d752ed49ec0e2bc7348
+Author: Markus Klotzbuecher <mk@creamnet.de>
+Date:  Tue Jan 9 14:57:12 2007 +0100
+
+    Add support for the DS3231 RTC
+
+commit 8139567b60d678584b05f0718a681f2047c5e14f
+Author: Markus Klotzbuecher <mk@creamnet.de>
+Date:  Tue Jan 9 14:57:11 2007 +0100
+
+    SMC1 uses external CLK4 instead of BRG on spc1920
+
+commit d8d9de1a02fbd880b613d607143d1f57342affc7
+Author: Markus Klotzbuecher <mk@creamnet.de>
+Date:  Tue Jan 9 14:57:10 2007 +0100
+
+    Update the SPC1920 CMB PLD driver
+
+commit 3f34f869162750e5e999fd140f884f5de952bcfe
+Author: Markus Klotzbuecher <mk@creamnet.de>
+Date:  Tue Jan 9 14:57:10 2007 +0100
+
+    Add / enable I2C support on the spc1920 board
+
+commit d28707dbce1e9ac2017ad051da4133bf22b4204f
+Author: Markus Klotzbuecher <mk@creamnet.de>
+Date:  Tue Jan 9 14:57:10 2007 +0100
+
+    Add support for the tms320671x host port interface (HPI)
+
+commit f4eb54529bb3664c3a562e488b460fe075f79d67
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Sun Jan 7 00:13:11 2007 +0100
+
+    Prepare for release 1.2.0
+
+commit f07ae7a9daef27a3d0213a4f3fe39d5342173c02
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Jan 6 15:58:09 2007 +0100
+
+    [PATCH] 44x: Fix problem with DDR controller setup (refresh rate)
+
+    This patch fixes a problem with an incorrect setup for the refresh
+    timer of the 44x DDR controller in the file cpu/ppc4xx/sdram.c
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit f16c1da9577f06c5fc08651a4065537407de4635
+Author: Stefan Roese <sr@denx.de>
+Date:  Sat Jan 6 15:56:13 2007 +0100
+
+    [PATCH] Update ALPR board files
+
+    This update brings the ALPR board support to the newest version.
+    It also fixes a problem with the NAND driver.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit cd1d937f90250a32988c37b2b4af8364d25de8ed
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Jan 5 11:46:05 2007 +0100
+
+    [PATCH] nand: Fix problem with oobsize calculation
+
+    Here the description from Brian Brelsford <Brian_Brelsford@dell.com>:
+
+    The Hynix part returns a 0x1d in the 4th ID byte. The Samsung part
+    returns a 0x15. In the code fragment below bits [1:0] determine the
+    page size, it is ANDed via "(extid & 0x3)" then shifted out. The
+    next field is also ANDed with 0x3. However this is a one bit field
+    as defined in the Hynix and Samsung parts in the 4th ID byte that
+    determins the oobsize, not a two bit field. It works on Samsung as
+    bits[3:2] are 01. However for the Hynix there is a 11 in these two
+    bits, so the oob size gets messed up.
+
+    I checked the correct linux code and the suggested fix from Brian is
+    also available in the linux nand mtd driver.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit a78bc443ae5a4a8ba87590587d5e35bf5a787b2e
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Jan 5 10:40:36 2007 +0100
+
+    [PATCH] Clear PLB4A0_ACR[WRP] on Sequoia (440EPx)
+
+    This fix will make the MAL burst disabling patch for the Linux
+    EMAC driver obsolete.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 023889838282b6237b401664f22dd22dfba2c066
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Jan 5 10:38:05 2007 +0100
+
+    [PATCH] Add DDR2 optimization code for Sequoia (440EPx) board
+
+    This code will optimize the DDR2 controller setup on a board specific
+    basis.
+
+    Note: This code doesn't work right now on the NAND booting image for the
+    Sequoia board, since it doesn't fit into the 4kBytes for the SPL image.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit cce4acbb68398634b8d011ed7bb0d12269c84230
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Thu Dec 28 19:08:21 2006 +0100
+
+    Few V38B changes:
+      - fix a typo in V38B config file
+      - move watchdog initialisation earlier in the boot process
+      - add "wdt=off" to default kernel command line (disables kernel watchdog)
+
+commit 92eb729bad876725aeea908d2addba0800620840
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Wed Dec 27 01:26:13 2006 +0100
+
+    Fix bug in adaption of Stefano Babic's CFI driver patch.
+
+commit 9c0f42ecfe25f7ffce8ec7a815f03864d723ffe3
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Sun Dec 24 01:42:57 2006 +0100
+
+    Minor code cleanup.
+
+commit d784fdb05900ada3686d5778783e1fb328e9fb66
+Author: Stefano Babic <sbabic@denx.de>
+Date:  Tue Dec 12 00:22:42 2006 +0100
+
+    Fix cfi failure with Spansion Flash (Spansion Flash Devices have a different offset to go into CFI mode)
+
+commit 1b3c360c235dc684ec06c2d5f183f0a282ce45e2
+Author: Stefan Roese <sr@denx.de>
+Date:  Fri Dec 22 14:29:40 2006 +0100
+
+    [PATCH] Fix sequoia flash autodetection (finally correct)
+
+    Now 32MByte and 64MByte FLASH is know to work and other
+    configurations should work too.
+
+    Signed-off-by: Stefan Roese <sr@denx.de>
+
+commit 82e5236a8b719543643fd26d5827938ab2b94818
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Fri Dec 22 10:30:26 2006 +0100
+
+    Minor code cleanup; update CHANGELOG.
+
+commit fa23044564091f05d9695beb7b5b9a931e7f41a4
+Author: Heiko Schocher <hs@pollux.denx.de>
+Date:  Thu Dec 21 17:17:02 2006 +0100
+
+    Added support for the TQM8272 board from TQ
+
+    Signed-off-by: Heiko Schocher <hs@denx.de>
+
+commit c84bad0ef60e7055ab0bd49b93069509cecc382a
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Wed Dec 20 00:29:43 2006 +0100
+
+    Fix to make the baudrate changes immediate for the MCF52x2 family.
+
+commit daa6e418bcc0c717752e8de939c213c790286096
+Author: Bartlomiej Sieka <tur@semihalf.com>
+Date:  Wed Dec 20 00:27:32 2006 +0100
+
+    Preliminary support for the iDMR board (ColdFire).
+
+commit cdb97a6678826f85e7c69eae6a1c113d034c9b10
+Author: Andrei Safronov <safronov@pollux.denx.de>
+Date:  Fri Dec 8 16:23:08 2006 +0100
+
+    automatic update mechanism
+
+commit dd520bf314c7add4183c5191692180f576f96b60
+Author: Wolfgang Denk <wd@pollux.denx.de>
+Date:  Thu Nov 30 18:02:20 2006 +0100
+
+    Code cleanup.
+
 commit 8d9a8610b8256331132227e9e6585c6bd5742787
 Author: Wolfgang Denk <wd@pollux.denx.de>
 Date:  Thu Nov 30 01:54:07 2006 +0100
@@ -186,7 +418,7 @@ Date:       Mon Nov 27 17:04:06 2006 +0100
     [PATCH] Allow CONFIG_OF_FLAT_TREE to boot a non-arch/powerpc kernel
 
     This patch allows an arch/ppc kernel to be booted by just passing 1 or 2
-    arguments to bootm.         It removes the getenv("disable_of") test that used
+    arguments to bootm.  It removes the getenv("disable_of") test that used
     to be used for this purpose.
 
     Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
@@ -884,7 +1116,7 @@ Date:      Tue Oct 24 23:47:37 2006 -0500
 
     If a Multi-Image file contains a third image we try to use it as a
     device tree.  The device tree image is assumed to be uncompressed in the
-    image file.         We automatically allocate space for the device tree in memory
+    image file.  We automatically allocate space for the device tree in memory
     and provide an 8k pad to allow more than a reasonable amount of growth.
 
     Additionally, a device tree that was contained in flash will now automatically
diff --git a/MAKEALL b/MAKEALL
index 74bf383aa73bc716ac8865f56b1a7111c6508d79..d2159ef0c9bfd26288baaa086438522df405e13b 100755 (executable)
--- a/MAKEALL
+++ b/MAKEALL
@@ -299,8 +299,8 @@ LIST_microblaze="   \
 
 LIST_coldfire="        \
        cobra5272       EB+MCF-EV123    EB+MCF-EV123_internal           \
-       M5271EVB        M5272C3         M5282EVB        TASREG          \
-       r5200           M5271EVB                                        \
+       idmr            M5271EVB        M5272C3         M5282EVB        \
+       TASREG          r5200           M5271EVB                        \
 "
 
 #########################################################################
index 6b1c4793b6bd684bfcac8129d4d3880ac822ec82..aa6266f3f659a70d9d5dcd91eb7ab9695e639336 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -22,8 +22,8 @@
 #
 
 VERSION = 1
-PATCHLEVEL = 1
-SUBLEVEL = 6
+PATCHLEVEL = 2
+SUBLEVEL = 0
 EXTRAVERSION =
 U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 VERSION_FILE = $(obj)include/version_autogenerated.h
@@ -557,6 +557,7 @@ Total5200_Rev2_lowboot_config:      unconfig
        @$(MKCONFIG) -a Total5200 ppc mpc5xxx total5200
 
 cam5200_config \
+cam5200_niosflash_config \
 fo300_config \
 MiniFAP_config \
 TQM5200S_config \
@@ -574,6 +575,10 @@ TQM5200_STK100_config:     unconfig
                  echo "#define CONFIG_TQM5200_B"       >>$(obj)include/config.h ; \
                  echo "... TQM5200S on Cam5200" ; \
                }
+       @[ -z "$(findstring niosflash,$@)" ] || \
+               { echo "#define CONFIG_CAM5200_NIOSFLASH"       >>$(obj)include/config.h ; \
+                 echo "... with NIOS flash driver" ; \
+               }
        @[ -z "$(findstring fo300,$@)" ] || \
                { echo "#define CONFIG_FO300"   >>$(obj)include/config.h ; \
                  echo "... TQM5200 on FO300" ; \
@@ -1541,6 +1546,9 @@ TQM8265_AA_config:  unconfig
        fi
        @$(MKCONFIG) -a TQM8260 ppc mpc8260 tqm8260
 
+TQM8272_config: unconfig
+       @$(MKCONFIG) -a TQM8272 ppc mpc8260 tqm8272
+
 VoVPN-GW_66MHz_config  \
 VoVPN-GW_100MHz_config:                unconfig
        @mkdir -p $(obj)include
@@ -1571,6 +1579,9 @@ EB+MCF-EV123_internal_config :    unconfig
        @echo "TEXT_BASE = 0xF0000000"|tee $(obj)board/BuS/EB+MCF-EV123/textbase.mk
        @$(MKCONFIG) EB+MCF-EV123 m68k mcf52x2 EB+MCF-EV123 BuS
 
+idmr_config :                  unconfig
+       @$(MKCONFIG) $(@:_config=) m68k mcf52x2 idmr
+
 M5271EVB_config :              unconfig
        @$(MKCONFIG) $(@:_config=) m68k mcf52x2 m5271evb
 
index 3d4ac8543d50efafcee75bf08faac60e97f2d276..45bcd4bef759ab385d745ff0120aaebca7b54abb 100644 (file)
@@ -90,7 +90,7 @@ tlbtab:
        /*
         * BOOT_CS (FLASH) must be first. Before relocation SA_I can be off to use the
         * speed up boot process. It is patched after relocation to enable SA_I
-       */
+        */
 #ifndef CONFIG_NAND_SPL
        tlbentry( CFG_BOOT_BASE_ADDR, SZ_256M, CFG_BOOT_BASE_ADDR, 1, AC_R|AC_W|AC_X|SA_G )
 #else
index 53f728def9d576cae7a2af11f728608f7007eaa3..77f1438448099eaa58447bed0c45e08d7b4b15fb 100644 (file)
@@ -1,4 +1,11 @@
 /*
+ * (C) Copyright 2006
+ * Sylvie Gohl,             AMCC/IBM, gohl.sylvie@fr.ibm.com
+ * Jacqueline Pira-Ferriol, AMCC/IBM, jpira-ferriol@fr.ibm.com
+ * Thierry Roman,           AMCC/IBM, thierry_roman@fr.ibm.com
+ * Alain Saurel,            AMCC/IBM, alain.saurel@fr.ibm.com
+ * Robert Snyder,           AMCC/IBM, rob.snyder@fr.ibm.com
+ *
  * (C) Copyright 2006
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * MA 02111-1307 USA
  */
 
+/* define DEBUG for debug output */
+#undef DEBUG
+
 #include <common.h>
 #include <asm/processor.h>
+#include <asm/io.h>
 #include <ppc440.h>
 
+#include "sdram.h"
+
+#if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL) || \
+       defined(CONFIG_DDR_DATA_EYE)
+/*-----------------------------------------------------------------------------+
+ * wait_for_dlllock.
+ +----------------------------------------------------------------------------*/
+static int wait_for_dlllock(void)
+{
+       unsigned long val;
+       int wait = 0;
+
+       /* -----------------------------------------------------------+
+        * Wait for the DCC master delay line to finish calibration
+        * ----------------------------------------------------------*/
+       mtdcr(ddrcfga, DDR0_17);
+       val = DDR0_17_DLLLOCKREG_UNLOCKED;
+
+       while (wait != 0xffff) {
+               val = mfdcr(ddrcfgd);
+               if ((val & DDR0_17_DLLLOCKREG_MASK) == DDR0_17_DLLLOCKREG_LOCKED)
+                       /* dlllockreg bit on */
+                       return 0;
+               else
+                       wait++;
+       }
+       debug("0x%04x: DDR0_17 Value (dlllockreg bit): 0x%08x\n", wait, val);
+       debug("Waiting for dlllockreg bit to raise\n");
+
+       return -1;
+}
+#endif
+
+#if defined(CONFIG_DDR_DATA_EYE)
+/*-----------------------------------------------------------------------------+
+ * wait_for_dram_init_complete.
+ +----------------------------------------------------------------------------*/
+int wait_for_dram_init_complete(void)
+{
+       unsigned long val;
+       int wait = 0;
+
+       /* --------------------------------------------------------------+
+        * Wait for 'DRAM initialization complete' bit in status register
+        * -------------------------------------------------------------*/
+       mtdcr(ddrcfga, DDR0_00);
+
+       while (wait != 0xffff) {
+               val = mfdcr(ddrcfgd);
+               if ((val & DDR0_00_INT_STATUS_BIT6) == DDR0_00_INT_STATUS_BIT6)
+                       /* 'DRAM initialization complete' bit */
+                       return 0;
+               else
+                       wait++;
+       }
+
+       debug("DRAM initialization complete bit in status register did not rise\n");
+
+       return -1;
+}
+
+#define NUM_TRIES 64
+#define NUM_READS 10
+
+/*-----------------------------------------------------------------------------+
+ * denali_core_search_data_eye.
+ +----------------------------------------------------------------------------*/
+void denali_core_search_data_eye(unsigned long memory_size)
+{
+       int k, j;
+       u32 val;
+       u32 wr_dqs_shift, dqs_out_shift, dll_dqs_delay_X;
+       u32 max_passing_cases = 0, wr_dqs_shift_with_max_passing_cases = 0;
+       u32 passing_cases = 0, dll_dqs_delay_X_sw_val = 0;
+       u32 dll_dqs_delay_X_start_window = 0, dll_dqs_delay_X_end_window = 0;
+       volatile u32 *ram_pointer;
+       u32 test[NUM_TRIES] = {
+               0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+               0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+               0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+               0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+               0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
+               0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
+               0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
+               0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
+               0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
+               0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
+               0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
+               0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
+               0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
+               0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
+               0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
+               0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55 };
+
+       ram_pointer = (volatile u32 *)(CFG_SDRAM_BASE);
+
+       for (wr_dqs_shift = 64; wr_dqs_shift < 96; wr_dqs_shift++) {
+               /*for (wr_dqs_shift=1; wr_dqs_shift<96; wr_dqs_shift++) {*/
+
+               /* -----------------------------------------------------------+
+                * De-assert 'start' parameter.
+                * ----------------------------------------------------------*/
+               mtdcr(ddrcfga, DDR0_02);
+               val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_OFF;
+               mtdcr(ddrcfgd, val);
+
+               /* -----------------------------------------------------------+
+                * Set 'wr_dqs_shift'
+                * ----------------------------------------------------------*/
+               mtdcr(ddrcfga, DDR0_09);
+               val = (mfdcr(ddrcfgd) & ~DDR0_09_WR_DQS_SHIFT_MASK)
+                       | DDR0_09_WR_DQS_SHIFT_ENCODE(wr_dqs_shift);
+               mtdcr(ddrcfgd, val);
+
+               /* -----------------------------------------------------------+
+                * Set 'dqs_out_shift' = wr_dqs_shift + 32
+                * ----------------------------------------------------------*/
+               dqs_out_shift = wr_dqs_shift + 32;
+               mtdcr(ddrcfga, DDR0_22);
+               val = (mfdcr(ddrcfgd) & ~DDR0_22_DQS_OUT_SHIFT_MASK)
+                       | DDR0_22_DQS_OUT_SHIFT_ENCODE(dqs_out_shift);
+               mtdcr(ddrcfgd, val);
+
+               passing_cases = 0;
+
+               for (dll_dqs_delay_X = 1; dll_dqs_delay_X < 64; dll_dqs_delay_X++) {
+                       /*for (dll_dqs_delay_X=1; dll_dqs_delay_X<128; dll_dqs_delay_X++) {*/
+                       /* -----------------------------------------------------------+
+                        * Set 'dll_dqs_delay_X'.
+                        * ----------------------------------------------------------*/
+                       /* dll_dqs_delay_0 */
+                       mtdcr(ddrcfga, DDR0_17);
+                       val = (mfdcr(ddrcfgd) & ~DDR0_17_DLL_DQS_DELAY_0_MASK)
+                               | DDR0_17_DLL_DQS_DELAY_0_ENCODE(dll_dqs_delay_X);
+                       mtdcr(ddrcfgd, val);
+                       /* dll_dqs_delay_1 to dll_dqs_delay_4 */
+                       mtdcr(ddrcfga, DDR0_18);
+                       val = (mfdcr(ddrcfgd) & ~DDR0_18_DLL_DQS_DELAY_X_MASK)
+                               | DDR0_18_DLL_DQS_DELAY_4_ENCODE(dll_dqs_delay_X)
+                               | DDR0_18_DLL_DQS_DELAY_3_ENCODE(dll_dqs_delay_X)
+                               | DDR0_18_DLL_DQS_DELAY_2_ENCODE(dll_dqs_delay_X)
+                               | DDR0_18_DLL_DQS_DELAY_1_ENCODE(dll_dqs_delay_X);
+                       mtdcr(ddrcfgd, val);
+                       /* dll_dqs_delay_5 to dll_dqs_delay_8 */
+                       mtdcr(ddrcfga, DDR0_19);
+                       val = (mfdcr(ddrcfgd) & ~DDR0_19_DLL_DQS_DELAY_X_MASK)
+                               | DDR0_19_DLL_DQS_DELAY_8_ENCODE(dll_dqs_delay_X)
+                               | DDR0_19_DLL_DQS_DELAY_7_ENCODE(dll_dqs_delay_X)
+                               | DDR0_19_DLL_DQS_DELAY_6_ENCODE(dll_dqs_delay_X)
+                               | DDR0_19_DLL_DQS_DELAY_5_ENCODE(dll_dqs_delay_X);
+                       mtdcr(ddrcfgd, val);
+
+                       ppcMsync();
+                       ppcMbar();
+
+                       /* -----------------------------------------------------------+
+                        * Assert 'start' parameter.
+                        * ----------------------------------------------------------*/
+                       mtdcr(ddrcfga, DDR0_02);
+                       val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_ON;
+                       mtdcr(ddrcfgd, val);
+
+                       ppcMsync();
+                       ppcMbar();
+
+                       /* -----------------------------------------------------------+
+                        * Wait for the DCC master delay line to finish calibration
+                        * ----------------------------------------------------------*/
+                       if (wait_for_dlllock() != 0) {
+                               printf("dlllock did not occur !!!\n");
+                               printf("denali_core_search_data_eye!!!\n");
+                               printf("wr_dqs_shift = %d - dll_dqs_delay_X = %d\n",
+                                      wr_dqs_shift, dll_dqs_delay_X);
+                               hang();
+                       }
+                       ppcMsync();
+                       ppcMbar();
+
+                       if (wait_for_dram_init_complete() != 0) {
+                               printf("dram init complete did not occur !!!\n");
+                               printf("denali_core_search_data_eye!!!\n");
+                               printf("wr_dqs_shift = %d - dll_dqs_delay_X = %d\n",
+                                      wr_dqs_shift, dll_dqs_delay_X);
+                               hang();
+                       }
+                       udelay(100);  /* wait 100us to ensure init is really completed !!! */
+
+                       /* write values */
+                       for (j=0; j<NUM_TRIES; j++) {
+                               ram_pointer[j] = test[j];
+
+                               /* clear any cache at ram location */
+                               __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
+                       }
+
+                       /* read values back */
+                       for (j=0; j<NUM_TRIES; j++) {
+                               for (k=0; k<NUM_READS; k++) {
+                                       /* clear any cache at ram location */
+                                       __asm__("dcbf 0,%0": :"r" (&ram_pointer[j]));
+
+                                       if (ram_pointer[j] != test[j])
+                                               break;
+                               }
+
+                               /* read error */
+                               if (k != NUM_READS)
+                                       break;
+                       }
+
+                       /* See if the dll_dqs_delay_X value passed.*/
+                       if (j < NUM_TRIES) {
+                               /* Failed */
+                               passing_cases = 0;
+                               /* break; */
+                       } else {
+                               /* Passed */
+                               if (passing_cases == 0)
+                                       dll_dqs_delay_X_sw_val = dll_dqs_delay_X;
+                               passing_cases++;
+                               if (passing_cases >= max_passing_cases) {
+                                       max_passing_cases = passing_cases;
+                                       wr_dqs_shift_with_max_passing_cases = wr_dqs_shift;
+                                       dll_dqs_delay_X_start_window = dll_dqs_delay_X_sw_val;
+                                       dll_dqs_delay_X_end_window = dll_dqs_delay_X;
+                               }
+                       }
+
+                       /* -----------------------------------------------------------+
+                        * De-assert 'start' parameter.
+                        * ----------------------------------------------------------*/
+                       mtdcr(ddrcfga, DDR0_02);
+                       val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_OFF;
+                       mtdcr(ddrcfgd, val);
+
+               } /* for (dll_dqs_delay_X=0; dll_dqs_delay_X<128; dll_dqs_delay_X++) */
+
+       } /* for (wr_dqs_shift=0; wr_dqs_shift<96; wr_dqs_shift++) */
+
+       /* -----------------------------------------------------------+
+        * Largest passing window is now detected.
+        * ----------------------------------------------------------*/
+
+       /* Compute dll_dqs_delay_X value */
+       dll_dqs_delay_X = (dll_dqs_delay_X_end_window + dll_dqs_delay_X_start_window) / 2;
+       wr_dqs_shift = wr_dqs_shift_with_max_passing_cases;
+
+       debug("DQS calibration - Window detected:\n");
+       debug("max_passing_cases = %d\n", max_passing_cases);
+       debug("wr_dqs_shift      = %d\n", wr_dqs_shift);
+       debug("dll_dqs_delay_X   = %d\n", dll_dqs_delay_X);
+       debug("dll_dqs_delay_X window = %d - %d\n",
+              dll_dqs_delay_X_start_window, dll_dqs_delay_X_end_window);
+
+       /* -----------------------------------------------------------+
+        * De-assert 'start' parameter.
+        * ----------------------------------------------------------*/
+       mtdcr(ddrcfga, DDR0_02);
+       val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_OFF;
+       mtdcr(ddrcfgd, val);
+
+       /* -----------------------------------------------------------+
+        * Set 'wr_dqs_shift'
+        * ----------------------------------------------------------*/
+       mtdcr(ddrcfga, DDR0_09);
+       val = (mfdcr(ddrcfgd) & ~DDR0_09_WR_DQS_SHIFT_MASK)
+               | DDR0_09_WR_DQS_SHIFT_ENCODE(wr_dqs_shift);
+       mtdcr(ddrcfgd, val);
+       debug("DDR0_09=0x%08lx\n", val);
+
+       /* -----------------------------------------------------------+
+        * Set 'dqs_out_shift' = wr_dqs_shift + 32
+        * ----------------------------------------------------------*/
+       dqs_out_shift = wr_dqs_shift + 32;
+       mtdcr(ddrcfga, DDR0_22);
+       val = (mfdcr(ddrcfgd) & ~DDR0_22_DQS_OUT_SHIFT_MASK)
+               | DDR0_22_DQS_OUT_SHIFT_ENCODE(dqs_out_shift);
+       mtdcr(ddrcfgd, val);
+       debug("DDR0_22=0x%08lx\n", val);
+
+       /* -----------------------------------------------------------+
+        * Set 'dll_dqs_delay_X'.
+        * ----------------------------------------------------------*/
+       /* dll_dqs_delay_0 */
+       mtdcr(ddrcfga, DDR0_17);
+       val = (mfdcr(ddrcfgd) & ~DDR0_17_DLL_DQS_DELAY_0_MASK)
+               | DDR0_17_DLL_DQS_DELAY_0_ENCODE(dll_dqs_delay_X);
+       mtdcr(ddrcfgd, val);
+       debug("DDR0_17=0x%08lx\n", val);
+
+       /* dll_dqs_delay_1 to dll_dqs_delay_4 */
+       mtdcr(ddrcfga, DDR0_18);
+       val = (mfdcr(ddrcfgd) & ~DDR0_18_DLL_DQS_DELAY_X_MASK)
+               | DDR0_18_DLL_DQS_DELAY_4_ENCODE(dll_dqs_delay_X)
+               | DDR0_18_DLL_DQS_DELAY_3_ENCODE(dll_dqs_delay_X)
+               | DDR0_18_DLL_DQS_DELAY_2_ENCODE(dll_dqs_delay_X)
+               | DDR0_18_DLL_DQS_DELAY_1_ENCODE(dll_dqs_delay_X);
+       mtdcr(ddrcfgd, val);
+       debug("DDR0_18=0x%08lx\n", val);
+
+       /* dll_dqs_delay_5 to dll_dqs_delay_8 */
+       mtdcr(ddrcfga, DDR0_19);
+       val = (mfdcr(ddrcfgd) & ~DDR0_19_DLL_DQS_DELAY_X_MASK)
+               | DDR0_19_DLL_DQS_DELAY_8_ENCODE(dll_dqs_delay_X)
+               | DDR0_19_DLL_DQS_DELAY_7_ENCODE(dll_dqs_delay_X)
+               | DDR0_19_DLL_DQS_DELAY_6_ENCODE(dll_dqs_delay_X)
+               | DDR0_19_DLL_DQS_DELAY_5_ENCODE(dll_dqs_delay_X);
+       mtdcr(ddrcfgd, val);
+       debug("DDR0_19=0x%08lx\n", val);
+
+       /* -----------------------------------------------------------+
+        * Assert 'start' parameter.
+        * ----------------------------------------------------------*/
+       mtdcr(ddrcfga, DDR0_02);
+       val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_ON;
+       mtdcr(ddrcfgd, val);
+
+       ppcMsync();
+       ppcMbar();
+
+       /* -----------------------------------------------------------+
+        * Wait for the DCC master delay line to finish calibration
+        * ----------------------------------------------------------*/
+       if (wait_for_dlllock() != 0) {
+               printf("dlllock did not occur !!!\n");
+               hang();
+       }
+       ppcMsync();
+       ppcMbar();
+
+       if (wait_for_dram_init_complete() != 0) {
+               printf("dram init complete did not occur !!!\n");
+               hang();
+       }
+       udelay(100);  /* wait 100us to ensure init is really completed !!! */
+}
+#endif /* CONFIG_DDR_DATA_EYE */
+
 /*************************************************************************
  *
  * initdram -- 440EPx's DDR controller is a DENALI Core
 long int initdram (int board_type)
 {
 #if !defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
-       volatile ulong val;
-
        mtsdram(DDR0_02, 0x00000000);
 
        mtsdram(DDR0_00, 0x0000190A);
@@ -64,14 +411,15 @@ long int initdram (int board_type)
        mtsdram(DDR0_44, 0x00000005);
        mtsdram(DDR0_02, 0x00000001);
 
-       /*
-        * Wait for DCC master delay line to finish calibration
-        */
-       mfsdram(DDR0_17, val);
-       while (((val >> 8) & 0x000007f) == 0) {
-               mfsdram(DDR0_17, val);
-       }
+       wait_for_dlllock();
 #endif /* #ifndef CONFIG_NAND_U_BOOT */
 
+#ifdef CONFIG_DDR_DATA_EYE
+       /* -----------------------------------------------------------+
+        * Perform data eye search if requested.
+        * ----------------------------------------------------------*/
+       denali_core_search_data_eye(CFG_MBYTES_SDRAM << 20);
+#endif
+
        return (CFG_MBYTES_SDRAM << 20);
 }
diff --git a/board/amcc/sequoia/sdram.h b/board/amcc/sequoia/sdram.h
new file mode 100644 (file)
index 0000000..48966cf
--- /dev/null
@@ -0,0 +1,508 @@
+/*
+ * (C) Copyright 2006
+ * Sylvie Gohl,             AMCC/IBM, gohl.sylvie@fr.ibm.com
+ * Jacqueline Pira-Ferriol, AMCC/IBM, jpira-ferriol@fr.ibm.com
+ * Thierry Roman,           AMCC/IBM, thierry_roman@fr.ibm.com
+ * Alain Saurel,            AMCC/IBM, alain.saurel@fr.ibm.com
+ * Robert Snyder,           AMCC/IBM, rob.snyder@fr.ibm.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
+ */
+
+#ifndef _SPD_SDRAM_DENALI_H_
+#define _SPD_SDRAM_DENALI_H_
+
+#define ppcMsync       sync
+#define ppcMbar                eieio
+
+/* General definitions */
+#define MAX_SPD_BYTE        128         /* highest SPD byte # to read */
+#define DENALI_REG_NUMBER   45          /* 45 Regs in PPC440EPx Denali Core */
+#define SUPPORTED_DIMMS_NB  7           /* Number of supported DIMM modules types */
+#define SDRAM_NONE          0           /* No DIMM detected in Slot */
+#define MAXRANKS            2           /* 2 ranks maximum */
+
+/* Supported PLB Frequencies */
+#define PLB_FREQ_133MHZ     133333333
+#define PLB_FREQ_152MHZ     152000000
+#define PLB_FREQ_160MHZ     160000000
+#define PLB_FREQ_166MHZ     166666666
+
+/* Denali Core Registers */
+#define SDRAM_DCR_BASE 0x10
+
+#define DDR_DCR_BASE 0x10
+#define ddrcfga  (DDR_DCR_BASE+0x0)   /* DDR configuration address reg */
+#define ddrcfgd  (DDR_DCR_BASE+0x1)   /* DDR configuration data reg    */
+
+/*-----------------------------------------------------------------------------+
+  | Values for ddrcfga register - indirect addressing of these regs
+  +-----------------------------------------------------------------------------*/
+
+#define DDR0_00                         0x00
+#define DDR0_00_INT_ACK_MASK              0x7F000000 /* Write only */
+#define DDR0_00_INT_ACK_ALL               0x7F000000
+#define DDR0_00_INT_ACK_ENCODE(n)           ((((unsigned long)(n))&0x7F)<<24)
+#define DDR0_00_INT_ACK_DECODE(n)           ((((unsigned long)(n))>>24)&0x7F)
+/* Status */
+#define DDR0_00_INT_STATUS_MASK           0x00FF0000 /* Read only */
+/* Bit0. A single access outside the defined PHYSICAL memory space detected. */
+#define DDR0_00_INT_STATUS_BIT0           0x00010000
+/* Bit1. Multiple accesses outside the defined PHYSICAL memory space detected. */
+#define DDR0_00_INT_STATUS_BIT1           0x00020000
+/* Bit2. Single correctable ECC event detected */
+#define DDR0_00_INT_STATUS_BIT2           0x00040000
+/* Bit3. Multiple correctable ECC events detected. */
+#define DDR0_00_INT_STATUS_BIT3           0x00080000
+/* Bit4. Single uncorrectable ECC event detected. */
+#define DDR0_00_INT_STATUS_BIT4           0x00100000
+/* Bit5. Multiple uncorrectable ECC events detected. */
+#define DDR0_00_INT_STATUS_BIT5           0x00200000
+/* Bit6. DRAM initialization complete. */
+#define DDR0_00_INT_STATUS_BIT6           0x00400000
+/* Bit7. Logical OR of all lower bits. */
+#define DDR0_00_INT_STATUS_BIT7           0x00800000
+
+#define DDR0_00_INT_STATUS_ENCODE(n)        ((((unsigned long)(n))&0xFF)<<16)
+#define DDR0_00_INT_STATUS_DECODE(n)        ((((unsigned long)(n))>>16)&0xFF)
+#define DDR0_00_DLL_INCREMENT_MASK        0x00007F00
+#define DDR0_00_DLL_INCREMENT_ENCODE(n)     ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_00_DLL_INCREMENT_DECODE(n)     ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_00_DLL_START_POINT_MASK      0x0000007F
+#define DDR0_00_DLL_START_POINT_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_00_DLL_START_POINT_DECODE(n)   ((((unsigned long)(n))>>0)&0x7F)
+
+
+
+#define DDR0_01                         0x01
+#define DDR0_01_PLB0_DB_CS_LOWER_MASK     0x1F000000
+#define DDR0_01_PLB0_DB_CS_LOWER_ENCODE(n)  ((((unsigned long)(n))&0x1F)<<24)
+#define DDR0_01_PLB0_DB_CS_LOWER_DECODE(n)  ((((unsigned long)(n))>>24)&0x1F)
+#define DDR0_01_PLB0_DB_CS_UPPER_MASK     0x001F0000
+#define DDR0_01_PLB0_DB_CS_UPPER_ENCODE(n)  ((((unsigned long)(n))&0x1F)<<16)
+#define DDR0_01_PLB0_DB_CS_UPPER_DECODE(n)  ((((unsigned long)(n))>>16)&0x1F)
+#define DDR0_01_OUT_OF_RANGE_TYPE_MASK    0x00000700 /* Read only */
+#define DDR0_01_OUT_OF_RANGE_TYPE_ENCODE(n)               ((((unsigned long)(n))&0x7)<<8)
+#define DDR0_01_OUT_OF_RANGE_TYPE_DECODE(n)               ((((unsigned long)(n))>>8)&0x7)
+#define DDR0_01_INT_MASK_MASK             0x000000FF
+#define DDR0_01_INT_MASK_ENCODE(n)          ((((unsigned long)(n))&0xFF)<<0)
+#define DDR0_01_INT_MASK_DECODE(n)          ((((unsigned long)(n))>>0)&0xFF)
+#define DDR0_01_INT_MASK_ALL_ON           0x000000FF
+#define DDR0_01_INT_MASK_ALL_OFF          0x00000000
+
+#define DDR0_02                         0x02
+#define DDR0_02_MAX_CS_REG_MASK           0x02000000 /* Read only */
+#define DDR0_02_MAX_CS_REG_ENCODE(n)        ((((unsigned long)(n))&0x2)<<24)
+#define DDR0_02_MAX_CS_REG_DECODE(n)        ((((unsigned long)(n))>>24)&0x2)
+#define DDR0_02_MAX_COL_REG_MASK          0x000F0000 /* Read only */
+#define DDR0_02_MAX_COL_REG_ENCODE(n)       ((((unsigned long)(n))&0xF)<<16)
+#define DDR0_02_MAX_COL_REG_DECODE(n)       ((((unsigned long)(n))>>16)&0xF)
+#define DDR0_02_MAX_ROW_REG_MASK          0x00000F00 /* Read only */
+#define DDR0_02_MAX_ROW_REG_ENCODE(n)       ((((unsigned long)(n))&0xF)<<8)
+#define DDR0_02_MAX_ROW_REG_DECODE(n)       ((((unsigned long)(n))>>8)&0xF)
+#define DDR0_02_START_MASK                0x00000001
+#define DDR0_02_START_ENCODE(n)             ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_02_START_DECODE(n)             ((((unsigned long)(n))>>0)&0x1)
+#define DDR0_02_START_OFF                 0x00000000
+#define DDR0_02_START_ON                  0x00000001
+
+#define DDR0_03                         0x03
+#define DDR0_03_BSTLEN_MASK               0x07000000
+#define DDR0_03_BSTLEN_ENCODE(n)            ((((unsigned long)(n))&0x7)<<24)
+#define DDR0_03_BSTLEN_DECODE(n)            ((((unsigned long)(n))>>24)&0x7)
+#define DDR0_03_CASLAT_MASK               0x00070000
+#define DDR0_03_CASLAT_ENCODE(n)            ((((unsigned long)(n))&0x7)<<16)
+#define DDR0_03_CASLAT_DECODE(n)            ((((unsigned long)(n))>>16)&0x7)
+#define DDR0_03_CASLAT_LIN_MASK           0x00000F00
+#define DDR0_03_CASLAT_LIN_ENCODE(n)        ((((unsigned long)(n))&0xF)<<8)
+#define DDR0_03_CASLAT_LIN_DECODE(n)        ((((unsigned long)(n))>>8)&0xF)
+#define DDR0_03_INITAREF_MASK             0x0000000F
+#define DDR0_03_INITAREF_ENCODE(n)          ((((unsigned long)(n))&0xF)<<0)
+#define DDR0_03_INITAREF_DECODE(n)          ((((unsigned long)(n))>>0)&0xF)
+
+#define DDR0_04                         0x04
+#define DDR0_04_TRC_MASK                  0x1F000000
+#define DDR0_04_TRC_ENCODE(n)               ((((unsigned long)(n))&0x1F)<<24)
+#define DDR0_04_TRC_DECODE(n)               ((((unsigned long)(n))>>24)&0x1F)
+#define DDR0_04_TRRD_MASK                 0x00070000
+#define DDR0_04_TRRD_ENCODE(n)              ((((unsigned long)(n))&0x7)<<16)
+#define DDR0_04_TRRD_DECODE(n)              ((((unsigned long)(n))>>16)&0x7)
+#define DDR0_04_TRTP_MASK                 0x00000700
+#define DDR0_04_TRTP_ENCODE(n)              ((((unsigned long)(n))&0x7)<<8)
+#define DDR0_04_TRTP_DECODE(n)              ((((unsigned long)(n))>>8)&0x7)
+
+#define DDR0_05                         0x05
+#define DDR0_05_TMRD_MASK                 0x1F000000
+#define DDR0_05_TMRD_ENCODE(n)              ((((unsigned long)(n))&0x1F)<<24)
+#define DDR0_05_TMRD_DECODE(n)              ((((unsigned long)(n))>>24)&0x1F)
+#define DDR0_05_TEMRS_MASK                0x00070000
+#define DDR0_05_TEMRS_ENCODE(n)             ((((unsigned long)(n))&0x7)<<16)
+#define DDR0_05_TEMRS_DECODE(n)             ((((unsigned long)(n))>>16)&0x7)
+#define DDR0_05_TRP_MASK                  0x00000F00
+#define DDR0_05_TRP_ENCODE(n)               ((((unsigned long)(n))&0xF)<<8)
+#define DDR0_05_TRP_DECODE(n)               ((((unsigned long)(n))>>8)&0xF)
+#define DDR0_05_TRAS_MIN_MASK             0x000000FF
+#define DDR0_05_TRAS_MIN_ENCODE(n)          ((((unsigned long)(n))&0xFF)<<0)
+#define DDR0_05_TRAS_MIN_DECODE(n)          ((((unsigned long)(n))>>0)&0xFF)
+
+#define DDR0_06                         0x06
+#define DDR0_06_WRITEINTERP_MASK          0x01000000
+#define DDR0_06_WRITEINTERP_ENCODE(n)       ((((unsigned long)(n))&0x1)<<24)
+#define DDR0_06_WRITEINTERP_DECODE(n)       ((((unsigned long)(n))>>24)&0x1)
+#define DDR0_06_TWTR_MASK                 0x00070000
+#define DDR0_06_TWTR_ENCODE(n)              ((((unsigned long)(n))&0x7)<<16)
+#define DDR0_06_TWTR_DECODE(n)              ((((unsigned long)(n))>>16)&0x7)
+#define DDR0_06_TDLL_MASK                 0x0000FF00
+#define DDR0_06_TDLL_ENCODE(n)              ((((unsigned long)(n))&0xFF)<<8)
+#define DDR0_06_TDLL_DECODE(n)              ((((unsigned long)(n))>>8)&0xFF)
+#define DDR0_06_TRFC_MASK                 0x0000007F
+#define DDR0_06_TRFC_ENCODE(n)              ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_06_TRFC_DECODE(n)              ((((unsigned long)(n))>>0)&0x7F)
+
+#define DDR0_07                         0x07
+#define DDR0_07_NO_CMD_INIT_MASK          0x01000000
+#define DDR0_07_NO_CMD_INIT_ENCODE(n)       ((((unsigned long)(n))&0x1)<<24)
+#define DDR0_07_NO_CMD_INIT_DECODE(n)       ((((unsigned long)(n))>>24)&0x1)
+#define DDR0_07_TFAW_MASK                 0x001F0000
+#define DDR0_07_TFAW_ENCODE(n)              ((((unsigned long)(n))&0x1F)<<16)
+#define DDR0_07_TFAW_DECODE(n)              ((((unsigned long)(n))>>16)&0x1F)
+#define DDR0_07_AUTO_REFRESH_MODE_MASK    0x00000100
+#define DDR0_07_AUTO_REFRESH_MODE_ENCODE(n) ((((unsigned long)(n))&0x1)<<8)
+#define DDR0_07_AUTO_REFRESH_MODE_DECODE(n) ((((unsigned long)(n))>>8)&0x1)
+#define DDR0_07_AREFRESH_MASK             0x00000001
+#define DDR0_07_AREFRESH_ENCODE(n)          ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_07_AREFRESH_DECODE(n)          ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_08                         0x08
+#define DDR0_08_WRLAT_MASK                0x07000000
+#define DDR0_08_WRLAT_ENCODE(n)             ((((unsigned long)(n))&0x7)<<24)
+#define DDR0_08_WRLAT_DECODE(n)             ((((unsigned long)(n))>>24)&0x7)
+#define DDR0_08_TCPD_MASK                 0x00FF0000
+#define DDR0_08_TCPD_ENCODE(n)              ((((unsigned long)(n))&0xFF)<<16)
+#define DDR0_08_TCPD_DECODE(n)              ((((unsigned long)(n))>>16)&0xFF)
+#define DDR0_08_DQS_N_EN_MASK             0x00000100
+#define DDR0_08_DQS_N_EN_ENCODE(n)          ((((unsigned long)(n))&0x1)<<8)
+#define DDR0_08_DQS_N_EN_DECODE(n)          ((((unsigned long)(n))>>8)&0x1)
+#define DDR0_08_DDRII_SDRAM_MODE_MASK     0x00000001
+#define DDR0_08_DDRII_ENCODE(n)             ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_08_DDRII_DECODE(n)             ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_09                         0x09
+#define DDR0_09_OCD_ADJUST_PDN_CS_0_MASK  0x1F000000
+#define DDR0_09_OCD_ADJUST_PDN_CS_0_ENCODE(n) ((((unsigned long)(n))&0x1F)<<24)
+#define DDR0_09_OCD_ADJUST_PDN_CS_0_DECODE(n) ((((unsigned long)(n))>>24)&0x1F)
+#define DDR0_09_RTT_0_MASK                0x00030000
+#define DDR0_09_RTT_0_ENCODE(n)             ((((unsigned long)(n))&0x3)<<16)
+#define DDR0_09_RTT_0_DECODE(n)             ((((unsigned long)(n))>>16)&0x3)
+#define DDR0_09_WR_DQS_SHIFT_BYPASS_MASK  0x00007F00
+#define DDR0_09_WR_DQS_SHIFT_BYPASS_ENCODE(n) ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_09_WR_DQS_SHIFT_BYPASS_DECODE(n) ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_09_WR_DQS_SHIFT_MASK         0x0000007F
+#define DDR0_09_WR_DQS_SHIFT_ENCODE(n)      ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_09_WR_DQS_SHIFT_DECODE(n)      ((((unsigned long)(n))>>0)&0x7F)
+
+#define DDR0_10                         0x0A
+#define DDR0_10_WRITE_MODEREG_MASK        0x00010000 /* Write only */
+#define DDR0_10_WRITE_MODEREG_ENCODE(n)     ((((unsigned long)(n))&0x1)<<16)
+#define DDR0_10_WRITE_MODEREG_DECODE(n)     ((((unsigned long)(n))>>16)&0x1)
+#define DDR0_10_CS_MAP_MASK               0x00000300
+#define DDR0_10_CS_MAP_NO_MEM             0x00000000
+#define DDR0_10_CS_MAP_RANK0_INSTALLED    0x00000100
+#define DDR0_10_CS_MAP_RANK1_INSTALLED    0x00000200
+#define DDR0_10_CS_MAP_ENCODE(n)            ((((unsigned long)(n))&0x3)<<8)
+#define DDR0_10_CS_MAP_DECODE(n)            ((((unsigned long)(n))>>8)&0x3)
+#define DDR0_10_OCD_ADJUST_PUP_CS_0_MASK  0x0000001F
+#define DDR0_10_OCD_ADJUST_PUP_CS_0_ENCODE(n) ((((unsigned long)(n))&0x1F)<<0)
+#define DDR0_10_OCD_ADJUST_PUP_CS_0_DECODE(n) ((((unsigned long)(n))>>0)&0x1F)
+
+#define DDR0_11                         0x0B
+#define DDR0_11_SREFRESH_MASK             0x01000000
+#define DDR0_11_SREFRESH_ENCODE(n)          ((((unsigned long)(n))&0x1)<<24)
+#define DDR0_11_SREFRESH_DECODE(n)          ((((unsigned long)(n))>>24)&0x1F)
+#define DDR0_11_TXSNR_MASK                0x00FF0000
+#define DDR0_11_TXSNR_ENCODE(n)             ((((unsigned long)(n))&0xFF)<<16)
+#define DDR0_11_TXSNR_DECODE(n)             ((((unsigned long)(n))>>16)&0xFF)
+#define DDR0_11_TXSR_MASK                 0x0000FF00
+#define DDR0_11_TXSR_ENCODE(n)              ((((unsigned long)(n))&0xFF)<<8)
+#define DDR0_11_TXSR_DECODE(n)              ((((unsigned long)(n))>>8)&0xFF)
+
+#define DDR0_12                         0x0C
+#define DDR0_12_TCKE_MASK                 0x0000007
+#define DDR0_12_TCKE_ENCODE(n)              ((((unsigned long)(n))&0x7)<<0)
+#define DDR0_12_TCKE_DECODE(n)              ((((unsigned long)(n))>>0)&0x7)
+
+#define DDR0_13                         0x0D
+
+#define DDR0_14                         0x0E
+#define DDR0_14_DLL_BYPASS_MODE_MASK      0x01000000
+#define DDR0_14_DLL_BYPASS_MODE_ENCODE(n)   ((((unsigned long)(n))&0x1)<<24)
+#define DDR0_14_DLL_BYPASS_MODE_DECODE(n)   ((((unsigned long)(n))>>24)&0x1)
+#define DDR0_14_REDUC_MASK                0x00010000
+#define DDR0_14_REDUC_64BITS              0x00000000
+#define DDR0_14_REDUC_32BITS              0x00010000
+#define DDR0_14_REDUC_ENCODE(n)             ((((unsigned long)(n))&0x1)<<16)
+#define DDR0_14_REDUC_DECODE(n)             ((((unsigned long)(n))>>16)&0x1)
+#define DDR0_14_REG_DIMM_ENABLE_MASK      0x00000100
+#define DDR0_14_REG_DIMM_ENABLE_ENCODE(n)   ((((unsigned long)(n))&0x1)<<8)
+#define DDR0_14_REG_DIMM_ENABLE_DECODE(n)   ((((unsigned long)(n))>>8)&0x1)
+
+#define DDR0_15                         0x0F
+
+#define DDR0_16                         0x10
+
+#define DDR0_17                         0x11
+#define DDR0_17_DLL_DQS_DELAY_0_MASK      0x7F000000
+#define DDR0_17_DLL_DQS_DELAY_0_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<24)
+#define DDR0_17_DLL_DQS_DELAY_0_DECODE(n)   ((((unsigned long)(n))>>24)&0x7F)
+#define DDR0_17_DLLLOCKREG_MASK           0x00010000 /* Read only */
+#define DDR0_17_DLLLOCKREG_LOCKED         0x00010000
+#define DDR0_17_DLLLOCKREG_UNLOCKED       0x00000000
+#define DDR0_17_DLLLOCKREG_ENCODE(n)        ((((unsigned long)(n))&0x1)<<16)
+#define DDR0_17_DLLLOCKREG_DECODE(n)        ((((unsigned long)(n))>>16)&0x1)
+#define DDR0_17_DLL_LOCK_MASK             0x00007F00 /* Read only */
+#define DDR0_17_DLL_LOCK_ENCODE(n)          ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_17_DLL_LOCK_DECODE(n)          ((((unsigned long)(n))>>8)&0x7F)
+
+#define DDR0_18                         0x12
+#define DDR0_18_DLL_DQS_DELAY_X_MASK      0x7F7F7F7F
+#define DDR0_18_DLL_DQS_DELAY_4_MASK      0x7F000000
+#define DDR0_18_DLL_DQS_DELAY_4_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<24)
+#define DDR0_18_DLL_DQS_DELAY_4_DECODE(n)   ((((unsigned long)(n))>>24)&0x7F)
+#define DDR0_18_DLL_DQS_DELAY_3_MASK      0x007F0000
+#define DDR0_18_DLL_DQS_DELAY_3_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<16)
+#define DDR0_18_DLL_DQS_DELAY_3_DECODE(n)   ((((unsigned long)(n))>>16)&0x7F)
+#define DDR0_18_DLL_DQS_DELAY_2_MASK      0x00007F00
+#define DDR0_18_DLL_DQS_DELAY_2_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_18_DLL_DQS_DELAY_2_DECODE(n)   ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_18_DLL_DQS_DELAY_1_MASK      0x0000007F
+#define DDR0_18_DLL_DQS_DELAY_1_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_18_DLL_DQS_DELAY_1_DECODE(n)   ((((unsigned long)(n))>>0)&0x7F)
+
+#define DDR0_19                         0x13
+#define DDR0_19_DLL_DQS_DELAY_X_MASK      0x7F7F7F7F
+#define DDR0_19_DLL_DQS_DELAY_8_MASK      0x7F000000
+#define DDR0_19_DLL_DQS_DELAY_8_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<24)
+#define DDR0_19_DLL_DQS_DELAY_8_DECODE(n)   ((((unsigned long)(n))>>24)&0x7F)
+#define DDR0_19_DLL_DQS_DELAY_7_MASK      0x007F0000
+#define DDR0_19_DLL_DQS_DELAY_7_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<16)
+#define DDR0_19_DLL_DQS_DELAY_7_DECODE(n)   ((((unsigned long)(n))>>16)&0x7F)
+#define DDR0_19_DLL_DQS_DELAY_6_MASK      0x00007F00
+#define DDR0_19_DLL_DQS_DELAY_6_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_19_DLL_DQS_DELAY_6_DECODE(n)   ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_19_DLL_DQS_DELAY_5_MASK      0x0000007F
+#define DDR0_19_DLL_DQS_DELAY_5_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_19_DLL_DQS_DELAY_5_DECODE(n)   ((((unsigned long)(n))>>0)&0x7F)
+
+#define DDR0_20                         0x14
+#define DDR0_20_DLL_DQS_BYPASS_3_MASK      0x7F000000
+#define DDR0_20_DLL_DQS_BYPASS_3_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<24)
+#define DDR0_20_DLL_DQS_BYPASS_3_DECODE(n)   ((((unsigned long)(n))>>24)&0x7F)
+#define DDR0_20_DLL_DQS_BYPASS_2_MASK      0x007F0000
+#define DDR0_20_DLL_DQS_BYPASS_2_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<16)
+#define DDR0_20_DLL_DQS_BYPASS_2_DECODE(n)   ((((unsigned long)(n))>>16)&0x7F)
+#define DDR0_20_DLL_DQS_BYPASS_1_MASK      0x00007F00
+#define DDR0_20_DLL_DQS_BYPASS_1_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_20_DLL_DQS_BYPASS_1_DECODE(n)   ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_20_DLL_DQS_BYPASS_0_MASK      0x0000007F
+#define DDR0_20_DLL_DQS_BYPASS_0_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_20_DLL_DQS_BYPASS_0_DECODE(n)   ((((unsigned long)(n))>>0)&0x7F)
+
+#define DDR0_21                         0x15
+#define DDR0_21_DLL_DQS_BYPASS_7_MASK      0x7F000000
+#define DDR0_21_DLL_DQS_BYPASS_7_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<24)
+#define DDR0_21_DLL_DQS_BYPASS_7_DECODE(n)   ((((unsigned long)(n))>>24)&0x7F)
+#define DDR0_21_DLL_DQS_BYPASS_6_MASK      0x007F0000
+#define DDR0_21_DLL_DQS_BYPASS_6_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<16)
+#define DDR0_21_DLL_DQS_BYPASS_6_DECODE(n)   ((((unsigned long)(n))>>16)&0x7F)
+#define DDR0_21_DLL_DQS_BYPASS_5_MASK      0x00007F00
+#define DDR0_21_DLL_DQS_BYPASS_5_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_21_DLL_DQS_BYPASS_5_DECODE(n)   ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_21_DLL_DQS_BYPASS_4_MASK      0x0000007F
+#define DDR0_21_DLL_DQS_BYPASS_4_ENCODE(n)   ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_21_DLL_DQS_BYPASS_4_DECODE(n)   ((((unsigned long)(n))>>0)&0x7F)
+
+#define DDR0_22                         0x16
+/* ECC */
+#define DDR0_22_CTRL_RAW_MASK             0x03000000
+#define DDR0_22_CTRL_RAW_ECC_DISABLE      0x00000000 /* ECC not being used */
+#define DDR0_22_CTRL_RAW_ECC_CHECK_ONLY   0x01000000 /* ECC checking is on, but no attempts to correct*/
+#define DDR0_22_CTRL_RAW_NO_ECC_RAM       0x02000000 /* No ECC RAM storage available */
+#define DDR0_22_CTRL_RAW_ECC_ENABLE       0x03000000 /* ECC checking and correcting on */
+#define DDR0_22_CTRL_RAW_ENCODE(n)          ((((unsigned long)(n))&0x3)<<24)
+#define DDR0_22_CTRL_RAW_DECODE(n)          ((((unsigned long)(n))>>24)&0x3)
+
+#define DDR0_22_DQS_OUT_SHIFT_BYPASS_MASK 0x007F0000
+#define DDR0_22_DQS_OUT_SHIFT_BYPASS_ENCODE(n) ((((unsigned long)(n))&0x7F)<<16)
+#define DDR0_22_DQS_OUT_SHIFT_BYPASS_DECODE(n) ((((unsigned long)(n))>>16)&0x7F)
+#define DDR0_22_DQS_OUT_SHIFT_MASK        0x00007F00
+#define DDR0_22_DQS_OUT_SHIFT_ENCODE(n)     ((((unsigned long)(n))&0x7F)<<8)
+#define DDR0_22_DQS_OUT_SHIFT_DECODE(n)     ((((unsigned long)(n))>>8)&0x7F)
+#define DDR0_22_DLL_DQS_BYPASS_8_MASK     0x0000007F
+#define DDR0_22_DLL_DQS_BYPASS_8_ENCODE(n)  ((((unsigned long)(n))&0x7F)<<0)
+#define DDR0_22_DLL_DQS_BYPASS_8_DECODE(n)  ((((unsigned long)(n))>>0)&0x7F)
+
+
+
+
+#define DDR0_23                         0x17
+#define DDR0_23_ODT_RD_MAP_CS0_MASK       0x03000000
+#define DDR0_23_ODT_RD_MAP_CS0_ENCODE(n)   ((((unsigned long)(n))&0x3)<<24)
+#define DDR0_23_ODT_RD_MAP_CS0_DECODE(n)   ((((unsigned long)(n))>>24)&0x3)
+#define DDR0_23_ECC_C_SYND_MASK           0x00FF0000 /* Read only */
+#define DDR0_23_ECC_C_SYND_ENCODE(n)        ((((unsigned long)(n))&0xFF)<<16)
+#define DDR0_23_ECC_C_SYND_DECODE(n)        ((((unsigned long)(n))>>16)&0xFF)
+#define DDR0_23_ECC_U_SYND_MASK           0x0000FF00 /* Read only */
+#define DDR0_23_ECC_U_SYND_ENCODE(n)        ((((unsigned long)(n))&0xFF)<<8)
+#define DDR0_23_ECC_U_SYND_DECODE(n)        ((((unsigned long)(n))>>8)&0xFF)
+#define DDR0_23_FWC_MASK                  0x00000001 /* Write only */
+#define DDR0_23_FWC_ENCODE(n)               ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_23_FWC_DECODE(n)               ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_24                         0x18
+#define DDR0_24_RTT_PAD_TERMINATION_MASK  0x03000000
+#define DDR0_24_RTT_PAD_TERMINATION_ENCODE(n) ((((unsigned long)(n))&0x3)<<24)
+#define DDR0_24_RTT_PAD_TERMINATION_DECODE(n) ((((unsigned long)(n))>>24)&0x3)
+#define DDR0_24_ODT_WR_MAP_CS1_MASK       0x00030000
+#define DDR0_24_ODT_WR_MAP_CS1_ENCODE(n)    ((((unsigned long)(n))&0x3)<<16)
+#define DDR0_24_ODT_WR_MAP_CS1_DECODE(n)    ((((unsigned long)(n))>>16)&0x3)
+#define DDR0_24_ODT_RD_MAP_CS1_MASK       0x00000300
+#define DDR0_24_ODT_RD_MAP_CS1_ENCODE(n)    ((((unsigned long)(n))&0x3)<<8)
+#define DDR0_24_ODT_RD_MAP_CS1_DECODE(n)    ((((unsigned long)(n))>>8)&0x3)
+#define DDR0_24_ODT_WR_MAP_CS0_MASK       0x00000003
+#define DDR0_24_ODT_WR_MAP_CS0_ENCODE(n)    ((((unsigned long)(n))&0x3)<<0)
+#define DDR0_24_ODT_WR_MAP_CS0_DECODE(n)    ((((unsigned long)(n))>>0)&0x3)
+
+#define DDR0_25                         0x19
+#define DDR0_25_VERSION_MASK              0xFFFF0000 /* Read only */
+#define DDR0_25_VERSION_ENCODE(n)           ((((unsigned long)(n))&0xFFFF)<<16)
+#define DDR0_25_VERSION_DECODE(n)           ((((unsigned long)(n))>>16)&0xFFFF)
+#define DDR0_25_OUT_OF_RANGE_LENGTH_MASK  0x000003FF /* Read only */
+#define DDR0_25_OUT_OF_RANGE_LENGTH_ENCODE(n) ((((unsigned long)(n))&0x3FF)<<0)
+#define DDR0_25_OUT_OF_RANGE_LENGTH_DECODE(n) ((((unsigned long)(n))>>0)&0x3FF)
+
+#define DDR0_26                         0x1A
+#define DDR0_26_TRAS_MAX_MASK             0xFFFF0000
+#define DDR0_26_TRAS_MAX_ENCODE(n)          ((((unsigned long)(n))&0xFFFF)<<16)
+#define DDR0_26_TRAS_MAX_DECODE(n)          ((((unsigned long)(n))>>16)&0xFFFF)
+#define DDR0_26_TREF_MASK                 0x00003FFF
+#define DDR0_26_TREF_ENCODE(n)              ((((unsigned long)(n))&0x3FF)<<0)
+#define DDR0_26_TREF_DECODE(n)              ((((unsigned long)(n))>>0)&0x3FF)
+
+#define DDR0_27                         0x1B
+#define DDR0_27_EMRS_DATA_MASK            0x3FFF0000
+#define DDR0_27_EMRS_DATA_ENCODE(n)         ((((unsigned long)(n))&0x3FFF)<<16)
+#define DDR0_27_EMRS_DATA_DECODE(n)         ((((unsigned long)(n))>>16)&0x3FFF)
+#define DDR0_27_TINIT_MASK                0x0000FFFF
+#define DDR0_27_TINIT_ENCODE(n)             ((((unsigned long)(n))&0xFFFF)<<0)
+#define DDR0_27_TINIT_DECODE(n)             ((((unsigned long)(n))>>0)&0xFFFF)
+
+#define DDR0_28                         0x1C
+#define DDR0_28_EMRS3_DATA_MASK           0x3FFF0000
+#define DDR0_28_EMRS3_DATA_ENCODE(n)        ((((unsigned long)(n))&0x3FFF)<<16)
+#define DDR0_28_EMRS3_DATA_DECODE(n)        ((((unsigned long)(n))>>16)&0x3FFF)
+#define DDR0_28_EMRS2_DATA_MASK           0x00003FFF
+#define DDR0_28_EMRS2_DATA_ENCODE(n)        ((((unsigned long)(n))&0x3FFF)<<0)
+#define DDR0_28_EMRS2_DATA_DECODE(n)        ((((unsigned long)(n))>>0)&0x3FFF)
+
+#define DDR0_29                         0x1D
+
+#define DDR0_30                         0x1E
+
+#define DDR0_31                         0x1F
+#define DDR0_31_XOR_CHECK_BITS_MASK       0x0000FFFF
+#define DDR0_31_XOR_CHECK_BITS_ENCODE(n)    ((((unsigned long)(n))&0xFFFF)<<0)
+#define DDR0_31_XOR_CHECK_BITS_DECODE(n)    ((((unsigned long)(n))>>0)&0xFFFF)
+
+#define DDR0_32                         0x20
+#define DDR0_32_OUT_OF_RANGE_ADDR_MASK    0xFFFFFFFF /* Read only */
+#define DDR0_32_OUT_OF_RANGE_ADDR_ENCODE(n) ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_32_OUT_OF_RANGE_ADDR_DECODE(n) ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_33                         0x21
+#define DDR0_33_OUT_OF_RANGE_ADDR_MASK    0x00000001 /* Read only */
+#define DDR0_33_OUT_OF_RANGE_ADDR_ENCODE(n) ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_33_OUT_OF_RANGE_ADDR_DECODE(n)               ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_34                         0x22
+#define DDR0_34_ECC_U_ADDR_MASK           0xFFFFFFFF /* Read only */
+#define DDR0_34_ECC_U_ADDR_ENCODE(n)        ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_34_ECC_U_ADDR_DECODE(n)        ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_35                         0x23
+#define DDR0_35_ECC_U_ADDR_MASK           0x00000001 /* Read only */
+#define DDR0_35_ECC_U_ADDR_ENCODE(n)        ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_35_ECC_U_ADDR_DECODE(n)        ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_36                         0x24
+#define DDR0_36_ECC_U_DATA_MASK           0xFFFFFFFF /* Read only */
+#define DDR0_36_ECC_U_DATA_ENCODE(n)        ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_36_ECC_U_DATA_DECODE(n)        ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_37                         0x25
+#define DDR0_37_ECC_U_DATA_MASK           0xFFFFFFFF /* Read only */
+#define DDR0_37_ECC_U_DATA_ENCODE(n)        ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_37_ECC_U_DATA_DECODE(n)        ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_38                         0x26
+#define DDR0_38_ECC_C_ADDR_MASK           0xFFFFFFFF /* Read only */
+#define DDR0_38_ECC_C_ADDR_ENCODE(n)        ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_38_ECC_C_ADDR_DECODE(n)        ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_39                         0x27
+#define DDR0_39_ECC_C_ADDR_MASK           0x00000001 /* Read only */
+#define DDR0_39_ECC_C_ADDR_ENCODE(n)        ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_39_ECC_C_ADDR_DECODE(n)        ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_40                         0x28
+#define DDR0_40_ECC_C_DATA_MASK           0xFFFFFFFF /* Read only */
+#define DDR0_40_ECC_C_DATA_ENCODE(n)        ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_40_ECC_C_DATA_DECODE(n)        ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_41                         0x29
+#define DDR0_41_ECC_C_DATA_MASK           0xFFFFFFFF /* Read only */
+#define DDR0_41_ECC_C_DATA_ENCODE(n)        ((((unsigned long)(n))&0xFFFFFFFF)<<0)
+#define DDR0_41_ECC_C_DATA_DECODE(n)        ((((unsigned long)(n))>>0)&0xFFFFFFFF)
+
+#define DDR0_42                         0x2A
+#define DDR0_42_ADDR_PINS_MASK            0x07000000
+#define DDR0_42_ADDR_PINS_ENCODE(n)         ((((unsigned long)(n))&0x7)<<24)
+#define DDR0_42_ADDR_PINS_DECODE(n)         ((((unsigned long)(n))>>24)&0x7)
+#define DDR0_42_CASLAT_LIN_GATE_MASK      0x0000000F
+#define DDR0_42_CASLAT_LIN_GATE_ENCODE(n)   ((((unsigned long)(n))&0xF)<<0)
+#define DDR0_42_CASLAT_LIN_GATE_DECODE(n)   ((((unsigned long)(n))>>0)&0xF)
+
+#define DDR0_43                         0x2B
+#define DDR0_43_TWR_MASK                  0x07000000
+#define DDR0_43_TWR_ENCODE(n)               ((((unsigned long)(n))&0x7)<<24)
+#define DDR0_43_TWR_DECODE(n)               ((((unsigned long)(n))>>24)&0x7)
+#define DDR0_43_APREBIT_MASK              0x000F0000
+#define DDR0_43_APREBIT_ENCODE(n)           ((((unsigned long)(n))&0xF)<<16)
+#define DDR0_43_APREBIT_DECODE(n)           ((((unsigned long)(n))>>16)&0xF)
+#define DDR0_43_COLUMN_SIZE_MASK          0x00000700
+#define DDR0_43_COLUMN_SIZE_ENCODE(n)       ((((unsigned long)(n))&0x7)<<8)
+#define DDR0_43_COLUMN_SIZE_DECODE(n)       ((((unsigned long)(n))>>8)&0x7)
+#define DDR0_43_EIGHT_BANK_MODE_MASK      0x00000001
+#define DDR0_43_EIGHT_BANK_MODE_8_BANKS     0x00000001
+#define DDR0_43_EIGHT_BANK_MODE_4_BANKS     0x00000000
+#define DDR0_43_EIGHT_BANK_MODE_ENCODE(n)   ((((unsigned long)(n))&0x1)<<0)
+#define DDR0_43_EIGHT_BANK_MODE_DECODE(n)   ((((unsigned long)(n))>>0)&0x1)
+
+#define DDR0_44                         0x2C
+#define DDR0_44_TRCD_MASK                 0x000000FF
+#define DDR0_44_TRCD_ENCODE(n)              ((((unsigned long)(n))&0xFF)<<0)
+#define DDR0_44_TRCD_DECODE(n)              ((((unsigned long)(n))>>0)&0xFF)
+
+#endif /* _SPD_SDRAM_DENALI_H_ */
index ccf6f0c8039bdceb9de6727d60017655888ab72a..b2b82c75954839bd90c36c02583e4bc0fac8e47b 100644 (file)
@@ -31,11 +31,13 @@ DECLARE_GLOBAL_DATA_PTR;
 
 extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips   */
 
+ulong flash_get_size (ulong base, int banknum);
+
 int board_early_init_f(void)
 {
-       unsigned long sdr0_cust0;
-       unsigned long sdr0_pfc1, sdr0_pfc2;
-       register uint reg;
+       u32 sdr0_cust0;
+       u32 sdr0_pfc1, sdr0_pfc2;
+       u32 reg;
 
        mtdcr(ebccfga, xbcfg);
        mtdcr(ebccfgd, 0xb8400000);
@@ -140,6 +142,7 @@ int misc_init_r(void)
 {
        uint pbcr;
        int size_val = 0;
+       u32 reg;
 #ifdef CONFIG_440EPX
        unsigned long usb2d0cr = 0;
        unsigned long usb2phy0cr, usb2h0cr = 0;
@@ -152,6 +155,11 @@ int misc_init_r(void)
         */
 
        /* Re-do sizing to get full correct info */
+
+       /* adjust flash start and offset */
+       gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
+       gd->bd->bi_flashoffset = 0;
+
 #if defined(CONFIG_NAND_U_BOOT) || defined(CONFIG_NAND_SPL)
        mtdcr(ebccfga, pb3cr);
 #else
@@ -192,9 +200,10 @@ int misc_init_r(void)
 #endif
        mtdcr(ebccfgd, pbcr);
 
-       /* adjust flash start and offset */
-       gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
-       gd->bd->bi_flashoffset = 0;
+       /*
+        * Re-check to get correct base address
+        */
+       flash_get_size(gd->bd->bi_flashstart, 0);
 
 #ifdef CFG_ENV_IS_IN_FLASH
        /* Monitor protection ON by default */
@@ -327,18 +336,33 @@ int misc_init_r(void)
        }
 #endif /* CONFIG_440EPX */
 
+       /*
+        * Clear PLB4A0_ACR[WRP]
+        * This fix will make the MAL burst disabling patch for the Linux
+        * EMAC driver obsolete.
+        */
+       reg = mfdcr(plb4_acr) & ~PLB4_ACR_WRP;
+       mtdcr(plb4_acr, reg);
+
        return 0;
 }
 
 int checkboard(void)
 {
        char *s = getenv("serial#");
+       u8 rev;
+       u8 val;
 
 #ifdef CONFIG_440EPX
        printf("Board: Sequoia - AMCC PPC440EPx Evaluation Board");
 #else
        printf("Board: Rainier - AMCC PPC440GRx Evaluation Board");
 #endif
+
+       rev = *(u8 *)(CFG_CPLD + 0);
+       val = *(u8 *)(CFG_CPLD + 5) & 0x01;
+       printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
+
        if (s != NULL) {
                puts(", serial# ");
                puts(s);
index 754ae449c135001a97613273a3b443bf064f635d..04f58e04191da5ea9aff8a79687b426c81ae82c3 100644 (file)
@@ -39,24 +39,6 @@ int board_early_init_f(void)
        reg = mfdcr(ebccfgd);
        mtdcr(ebccfgd, reg | 0x04000000);       /* Set ATC */
 
-       mtebc(pb0ap, 0x03017300);       /* FLASH/SRAM */
-       mtebc(pb0cr, 0xfc0da000);       /* BAS=0xfc0 64MB r/w 16-bit */
-
-       mtebc(pb1ap, 0x00000000);
-       mtebc(pb1cr, 0x00000000);
-
-       mtebc(pb2ap, 0x04814500);
-       /*CPLD*/ mtebc(pb2cr, 0x80018000);      /*BAS=0x800 1MB r/w 8-bit */
-
-       mtebc(pb3ap, 0x00000000);
-       mtebc(pb3cr, 0x00000000);
-
-       mtebc(pb4ap, 0x00000000);
-       mtebc(pb4cr, 0x00000000);
-
-       mtebc(pb5ap, 0x00000000);
-       mtebc(pb5cr, 0x00000000);
-
        /*--------------------------------------------------------------------
         * Setup the GPIO pins
         *-------------------------------------------------------------------*/
@@ -190,8 +172,15 @@ int misc_init_r (void)
 int checkboard(void)
 {
        char *s = getenv("serial#");
+       u8 rev;
+       u8 val;
 
        printf("Board: Yellowstone - AMCC PPC440GR Evaluation Board");
+
+       rev = *(u8 *)(CFG_CPLD + 0);
+       val = *(u8 *)(CFG_CPLD + 5) & 0x01;
+       printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
+
        if (s != NULL) {
                puts(", serial# ");
                puts(s);
index 588ee900dad878ad61fea38d69879ae9f50b4c2c..d47219cb6f8746e3e4c30f1118d8ca84d305e2e5 100644 (file)
@@ -39,24 +39,6 @@ int board_early_init_f(void)
        reg = mfdcr(ebccfgd);
        mtdcr(ebccfgd, reg | 0x04000000);       /* Set ATC */
 
-       mtebc(pb0ap, 0x03017300);       /* FLASH/SRAM */
-       mtebc(pb0cr, 0xfc0da000);       /* BAS=0xfc0 64MB r/w 16-bit */
-
-       mtebc(pb1ap, 0x00000000);
-       mtebc(pb1cr, 0x00000000);
-
-       mtebc(pb2ap, 0x04814500);
-       /*CPLD*/ mtebc(pb2cr, 0x80018000);      /*BAS=0x800 1MB r/w 8-bit */
-
-       mtebc(pb3ap, 0x00000000);
-       mtebc(pb3cr, 0x00000000);
-
-       mtebc(pb4ap, 0x00000000);
-       mtebc(pb4cr, 0x00000000);
-
-       mtebc(pb5ap, 0x00000000);
-       mtebc(pb5cr, 0x00000000);
-
        /*--------------------------------------------------------------------
         * Setup the GPIO pins
         *-------------------------------------------------------------------*/
@@ -186,8 +168,15 @@ int misc_init_r (void)
 int checkboard(void)
 {
        char *s = getenv("serial#");
+       u8 rev;
+       u8 val;
 
        printf("Board: Yosemite - AMCC PPC440EP Evaluation Board");
+
+       rev = *(u8 *)(CFG_CPLD + 0);
+       val = *(u8 *)(CFG_CPLD + 5) & 0x01;
+       printf(", Rev. %X, PCI=%d MHz", rev, val ? 66 : 33);
+
        if (s != NULL) {
                puts(", serial# ");
                puts(s);
index 40a827c3e2c3f4322294933322cc5e11474f9fc0..f5c3dd9edc70e9d0e9836d214e2cf0baf6c7dfc1 100644 (file)
@@ -105,7 +105,7 @@ static int ppchameleonevb_device_ready(struct mtd_info *mtdinfo)
  * Members with a "?" were not set in the merged testing-NAND branch,
  * so they are not set here either.
  */
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
 
        nand->hwcontrol = ppchameleonevb_hwcontrol;
@@ -113,5 +113,6 @@ void board_nand_init(struct nand_chip *nand)
        nand->eccmode = NAND_ECC_SOFT;
        nand->chip_delay = NAND_BIG_DELAY_US;
        nand->options = NAND_SAMSUNG_LP_OPTIONS;
+       return 0;
 }
 #endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */
index fe648fc1ff89ba2428d118d40b43af253c7beb18..d170938c02058f57e275ae49918fddfcddb2af3c 100644 (file)
@@ -448,7 +448,7 @@ static void dfc_gpio_init(void)
  * Members with a "?" were not set in the merged testing-NAND branch,
  * so they are not set here either.
  */
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
        unsigned long tCH, tCS, tWH, tWP, tRH, tRP, tRP_high, tR, tWHR, tAR;
 
@@ -576,6 +576,7 @@ void board_nand_init(struct nand_chip *nand)
        nand->cmdfunc = dfc_cmdfunc;
        nand->autooob = &delta_oob;
        nand->badblock_pattern = &delta_bbt_descr;
+       return 0;
 }
 
 #else
diff --git a/board/idmr/Makefile b/board/idmr/Makefile
new file mode 100644 (file)
index 0000000..cf07cf4
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# (C) Copyright 2000-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
+
+LIB    = $(obj)lib$(BOARD).a
+
+COBJS  = $(BOARD).o flash.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/idmr/config.mk b/board/idmr/config.mk
new file mode 100644 (file)
index 0000000..f7c2258
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+# Coldfire contribution by Bernhard Kuhn <bkuhn@metrowerks.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
+#
+
+TEXT_BASE = 0xff800000
diff --git a/board/idmr/flash.c b/board/idmr/flash.c
new file mode 100644 (file)
index 0000000..ba9b009
--- /dev/null
@@ -0,0 +1,356 @@
+/*
+ * (C) Copyright 2000-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 <common.h>
+
+#define PHYS_FLASH_1 CFG_FLASH_BASE
+#define FLASH_BANK_SIZE 0x800000
+#define EN29LV640 0x227e227e
+
+flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
+
+void flash_print_info (flash_info_t * info)
+{
+       int i;
+
+       switch (info->flash_id & FLASH_VENDMASK) {
+       case (AMD_MANUFACT & FLASH_VENDMASK):
+               printf ("AMD: ");
+               break;
+       default:
+               printf ("Unknown Vendor ");
+               break;
+       }
+
+       switch (info->flash_id & FLASH_TYPEMASK) {
+       case (EN29LV640 & FLASH_TYPEMASK):
+               printf ("EN29LV640 (16Mbit)\n");
+               break;
+       default:
+               printf ("Unknown Chip Type\n");
+               goto Done;
+               break;
+       }
+
+       printf ("  Size: %ld MB in %d Sectors\n",
+               info->size >> 20, info->sector_count);
+
+       printf ("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; i++) {
+               if ((i % 5) == 0) {
+                       printf ("\n   ");
+               }
+               printf (" %08lX%s", info->start[i],
+                       info->protect[i] ? " (RO)" : "     ");
+       }
+       printf ("\n");
+
+      Done:
+       return;
+}
+
+
+unsigned long flash_init (void)
+{
+       int i, j;
+       ulong size = 0;
+
+       for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
+               ulong flashbase = 0;
+
+               flash_info[i].flash_id =
+                       (AMD_MANUFACT & FLASH_VENDMASK) |
+                       (EN29LV640 & FLASH_TYPEMASK);
+               flash_info[i].size = FLASH_BANK_SIZE;
+               flash_info[i].sector_count = CFG_MAX_FLASH_SECT;
+               memset (flash_info[i].protect, 0, CFG_MAX_FLASH_SECT);
+               if (i == 0)
+                       flashbase = PHYS_FLASH_1;
+               else
+                       panic ("configured to many flash banks!\n");
+
+               for (j = 0; j < flash_info[i].sector_count; j++) {
+                       flash_info[i].start[j] = flashbase + 0x10000 * j;
+               }
+               size += flash_info[i].size;
+       }
+
+       flash_protect (FLAG_PROTECT_SET,
+                      CFG_FLASH_BASE,
+                      CFG_FLASH_BASE + 0x30000, &flash_info[0]);
+
+       return size;
+}
+
+
+#define CMD_READ_ARRAY         0x00F0
+#define CMD_UNLOCK1            0x00AA
+#define CMD_UNLOCK2            0x0055
+#define CMD_ERASE_SETUP                0x0080
+#define CMD_ERASE_CONFIRM      0x0030
+#define CMD_PROGRAM            0x00A0
+#define CMD_UNLOCK_BYPASS      0x0020
+
+#define MEM_FLASH_ADDR1                (*(volatile u16 *)(CFG_FLASH_BASE + (0x00000555<<1)))
+#define MEM_FLASH_ADDR2                (*(volatile u16 *)(CFG_FLASH_BASE + (0x000002AA<<1)))
+
+#define BIT_ERASE_DONE         0x0080
+#define BIT_RDY_MASK           0x0080
+#define BIT_PROGRAM_ERROR      0x0020
+#define BIT_TIMEOUT            0x80000000      /* our flag */
+
+#define READY 1
+#define ERR   2
+#define TMO   4
+
+
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+       ulong result;
+       int iflag, prot, sect;
+       int rc = ERR_OK;
+       int chip1;
+
+       /* first look for protection bits */
+
+       if (info->flash_id == FLASH_UNKNOWN)
+               return ERR_UNKNOWN_FLASH_TYPE;
+
+       if ((s_first < 0) || (s_first > s_last)) {
+               return ERR_INVAL;
+       }
+
+       if ((info->flash_id & FLASH_VENDMASK) !=
+           (AMD_MANUFACT & FLASH_VENDMASK)) {
+               return ERR_UNKNOWN_FLASH_VENDOR;
+       }
+
+       prot = 0;
+       for (sect = s_first; sect <= s_last; ++sect) {
+               if (info->protect[sect]) {
+                       prot++;
+               }
+       }
+       if (prot)
+               return ERR_PROTECTED;
+
+       /*
+        * Disable interrupts which might cause a timeout
+        * here. Remember that our exception vectors are
+        * at address 0 in the flash, and we don't want a
+        * (ticker) exception to happen while the flash
+        * chip is in programming mode.
+        */
+       iflag = disable_interrupts ();
+
+       printf ("\n");
+
+       /* Start erase on unprotected sectors */
+       for (sect = s_first; sect <= s_last && !ctrlc (); sect++) {
+               printf ("Erasing sector %2d ... ", sect);
+
+               /* arm simple, non interrupt dependent timer */
+               set_timer (0);
+
+               if (info->protect[sect] == 0) { /* not protected */
+                       volatile u16 *addr =
+                               (volatile u16 *) (info->start[sect]);
+
+                       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+                       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
+                       MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;
+
+                       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+                       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
+                       *addr = CMD_ERASE_CONFIRM;
+
+                       /* wait until flash is ready */
+                       chip1 = 0;
+
+                       do {
+                               result = *addr;
+
+                               /* check timeout */
+                               if (get_timer (0) > CFG_FLASH_ERASE_TOUT * CFG_HZ / 1000) {
+                                       MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
+                                       chip1 = TMO;
+                                       break;
+                               }
+
+                               if (!chip1
+                                   && (result & 0xFFFF) & BIT_ERASE_DONE)
+                                       chip1 = READY;
+
+                       } while (!chip1);
+
+                       MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
+
+                       if (chip1 == ERR) {
+                               rc = ERR_PROG_ERROR;
+                               goto outahere;
+                       }
+                       if (chip1 == TMO) {
+                               rc = ERR_TIMOUT;
+                               goto outahere;
+                       }
+
+                       printf ("ok.\n");
+               } else {        /* it was protected */
+
+                       printf ("protected!\n");
+               }
+       }
+
+       if (ctrlc ())
+               printf ("User Interrupt!\n");
+
+      outahere:
+       /* allow flash to settle - wait 10 ms */
+       printf("Waiting 10 ms...");
+        udelay (10000);
+
+/*     for (i = 0; i < 10 * 1000 * 1000; ++i)
+               asm(" nop");
+*/
+
+       printf("done\n");
+       if (iflag)
+               enable_interrupts ();
+
+
+       return rc;
+}
+
+static int write_word (flash_info_t * info, ulong dest, ulong data)
+{
+       volatile u16 *addr = (volatile u16 *) dest;
+       ulong result;
+       int rc = ERR_OK;
+       int iflag;
+       int chip1;
+
+       /*
+        * Check if Flash is (sufficiently) erased
+        */
+       result = *addr;
+       if ((result & data) != data)
+               return ERR_NOT_ERASED;
+
+
+       /*
+        * Disable interrupts which might cause a timeout
+        * here. Remember that our exception vectors are
+        * at address 0 in the flash, and we don't want a
+        * (ticker) exception to happen while the flash
+        * chip is in programming mode.
+        */
+       iflag = disable_interrupts ();
+
+       MEM_FLASH_ADDR1 = CMD_UNLOCK1;
+       MEM_FLASH_ADDR2 = CMD_UNLOCK2;
+       MEM_FLASH_ADDR1 = CMD_PROGRAM;
+       *addr = data;
+
+       /* arm simple, non interrupt dependent timer */
+       set_timer (0);
+
+       /* wait until flash is ready */
+       chip1 = 0;
+       do {
+               result = *addr;
+
+               /* check timeout */
+               if (get_timer (0) > CFG_FLASH_ERASE_TOUT * CFG_HZ / 1000) {
+                       chip1 = ERR | TMO;
+                       break;
+               }
+               if (!chip1 && ((result & 0x80) == (data & 0x80)))
+                       chip1 = READY;
+
+       } while (!chip1);
+
+       *addr = CMD_READ_ARRAY;
+
+       if (chip1 == ERR || *addr != data)
+               rc = ERR_PROG_ERROR;
+
+       if (iflag)
+               enable_interrupts ();
+
+       return rc;
+}
+
+
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+       ulong wp, data;
+       int rc;
+
+       if (addr & 1) {
+               printf ("unaligned destination not supported\n");
+               return ERR_ALIGN;
+       }
+
+#if 0
+       if (cnt & 1) {
+               printf ("odd transfer sizes not supported\n");
+               return ERR_ALIGN;
+       }
+#endif
+
+       wp = addr;
+
+       if (addr & 1) {
+               data = (*((volatile u8 *) addr) << 8) | *((volatile u8 *)
+                                                         src);
+               if ((rc = write_word (info, wp - 1, data)) != 0) {
+                       return (rc);
+               }
+               src += 1;
+               wp += 1;
+               cnt -= 1;
+       }
+
+       while (cnt >= 2) {
+               data = *((volatile u16 *) src);
+               if ((rc = write_word (info, wp, data)) != 0) {
+                       return (rc);
+               }
+               src += 2;
+               wp += 2;
+               cnt -= 2;
+       }
+
+       if (cnt == 1) {
+               data = (*((volatile u8 *) src) << 8) |
+                       *((volatile u8 *) (wp + 1));
+               if ((rc = write_word (info, wp, data)) != 0) {
+                       return (rc);
+               }
+               src += 1;
+               wp += 1;
+               cnt -= 1;
+       }
+
+       return ERR_OK;
+}
diff --git a/board/idmr/idmr.c b/board/idmr/idmr.c
new file mode 100644 (file)
index 0000000..58cdba1
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * (C) Copyright 2000-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 <common.h>
+#include <asm/m5271.h>
+#include <asm/immap_5271.h>
+
+int checkboard (void) {
+       puts ("Board: iDMR\n");
+       return 0;
+};
+
+long int initdram (int board_type) {
+       int i;
+
+       /*
+        * After reset, CS0 is configured to cover entire address space. We
+        * need to configure it to its proper values, so that writes to
+        * CFG_SDRAM_BASE and vicinity during SDRAM controller setup below do
+        * now fall under CS0 (see 16.3.1 of the MCF5271 Reference Manual).
+        */
+
+       /* Flash chipselect, CS0 */
+       /* ;CSAR0: Flash at 0xFF800000 */
+       mbar_writeShort(0x0080, 0xFF80);
+
+       /* CSCR0: Flash 6 waits, 16bit */
+       mbar_writeShort(0x008A, 0x1980);
+
+       /* CSMR0: Flash 8MB, R/W, valid */
+       mbar_writeLong(0x0084, 0x007F0001);
+
+
+       /*
+        * SDRAM configuration proper
+        */
+
+       /*
+        * Address/Data Pin Assignment Reg.: enable address lines 23-21; do
+        * not enable data pins D[15:0], as we have 16 bit port to SDRAM
+        */
+       mbar_writeByte(MCF_GPIO_PAR_AD,
+                       MCF_GPIO_AD_ADDR23 |
+                       MCF_GPIO_AD_ADDR22 |
+                       MCF_GPIO_AD_ADDR21);
+
+       /* No need to configure BS pins - reset values are OK */
+
+       /* Chip Select Pin Assignment Reg.: set CS[1-7] to GPIO */
+       mbar_writeByte(MCF_GPIO_PAR_CS, 0x00);
+
+       /* SDRAM Control Pin Assignment Reg. */
+       mbar_writeByte(MCF_GPIO_PAR_SDRAM,
+                       MCF_GPIO_SDRAM_CSSDCS_00 | /* no matter: PAR_CS=0 */
+                       MCF_GPIO_SDRAM_SDWE |
+                       MCF_GPIO_SDRAM_SCAS |
+                       MCF_GPIO_SDRAM_SRAS |
+                       MCF_GPIO_SDRAM_SCKE |
+                       MCF_GPIO_SDRAM_SDCS_01);
+
+       /*
+        * Wait 100us.  We run the bus at 50Mhz, one cycle is 20ns. So 5
+        * iterations will do, but we do 10 just to be safe.
+        */
+       for (i = 0; i < 10; ++i)
+               asm(" nop");
+
+
+       /* 1. Initialize DRAM Control Register: DCR */
+       mbar_writeShort(MCF_SDRAMC_DCR,
+                       MCF_SDRAMC_DCR_RTIM(0x10) |     /* 65ns */
+                       MCF_SDRAMC_DCR_RC(0x60));       /* 1562 cycles */
+
+
+       /*
+        * 2. Initialize DACR0
+        *
+        * CL: 11 (CL=3: 0x03, 0x02; CL=2: 0x1)
+        * CBM: cmd at A20, bank select bits 21 and up
+        * PS: 16 bit
+        */
+       mbar_writeLong(MCF_SDRAMC_DACR0,
+                       MCF_SDRAMC_DACRn_BA(CFG_SDRAM_BASE>>18) |
+                       MCF_SDRAMC_DACRn_BA(0x00) |
+                       MCF_SDRAMC_DACRn_CASL(0x03) |
+                       MCF_SDRAMC_DACRn_CBM(0x03) |
+                       MCF_SDRAMC_DACRn_PS(0x03));
+
+       /* Initialize DMR0 */
+       mbar_writeLong(MCF_SDRAMC_DMR0,
+                       MCF_SDRAMC_DMRn_BAM_16M |
+                       MCF_SDRAMC_DMRn_V);
+
+
+       /* 3. Set IP bit in DACR to initiate PALL command */
+       mbar_writeLong(MCF_SDRAMC_DACR0,
+                       mbar_readLong(MCF_SDRAMC_DACR0) |
+                       MCF_SDRAMC_DACRn_IP);
+
+       /* Write to this block to initiate precharge */
+       *(volatile u16 *)(CFG_SDRAM_BASE) = 0xa5a5;
+
+       /*
+        * Wait at least 20ns to allow banks to precharge (t_RP = 20ns). We
+        * wait a wee longer, just to be safe.
+        */
+       for (i = 0; i < 5; ++i)
+               asm(" nop");
+
+
+       /* 4. Set RE bit in DACR */
+       mbar_writeLong(MCF_SDRAMC_DACR0,
+                       mbar_readLong(MCF_SDRAMC_DACR0) |
+                       MCF_SDRAMC_DACRn_RE);
+
+       /*
+        * Wait for at least 8 auto refresh cycles to occur, i.e. at least
+        * 781 bus cycles.
+        */
+       for (i = 0; i < 1000; ++i)
+               asm(" nop");
+
+       /* Finish the configuration by issuing the MRS */
+       mbar_writeLong(MCF_SDRAMC_DACR0,
+                       mbar_readLong(MCF_SDRAMC_DACR0) |
+                       MCF_SDRAMC_DACRn_MRS);
+
+       /*
+        * Write to the SDRAM Mode Register A0-A11 = 0x400
+        *
+        * Write Burst Mode = Programmed Burst Length
+        * Op Mode = Standard Op
+        * CAS Latency = 3
+        * Burst Type = Sequential
+        * Burst Length = 1
+        */
+       *(volatile u32 *)(CFG_SDRAM_BASE + 0x1800) = 0xa5a5a5a5;
+
+       return CFG_SDRAM_SIZE * 1024 * 1024;
+};
+
+
+int testdram (void) {
+
+       /* TODO: XXX XXX XXX */
+       printf ("DRAM test not implemented!\n");
+
+       return (0);
+}
diff --git a/board/idmr/u-boot.lds b/board/idmr/u-boot.lds
new file mode 100644 (file)
index 0000000..69f3179
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(m68k)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+GROUP(libgcc.a)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    /* WARNING - the following is hand-optimized to fit within */
+    /* the sector layout of our flash chips!   XXX FIXME XXX   */
+
+    cpu/mcf52x2/start.o                (.text)
+    lib_m68k/traps.o           (.text)
+    cpu/mcf52x2/interrupts.o   (.text)
+    common/dlmalloc.o          (.text)
+    lib_generic/zlib.o         (.text)
+
+    . = DEFINED(env_offset) ? env_offset : .;
+    common/environment.o       (.ppcenv)
+
+    *(.text)
+    *(.fixup)
+    *(.got1)
+  }
+  _etext = .;
+  PROVIDE (etext = .);
+  .rodata    :
+  {
+    *(.rodata)
+    *(.rodata1)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x00FF) & 0xFFFFFF00;
+  _erotext = .;
+  PROVIDE (erotext = .);
+
+  .reloc   :
+  {
+    __got_start = .;
+    *(.got)
+    __got_end = .;
+    _GOT2_TABLE_ = .;
+    *(.got2)
+    _FIXUP_TABLE_ = .;
+    *(.fixup)
+  }
+  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
+  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
+
+  .data    :
+  {
+    *(.data)
+    *(.data1)
+    *(.sdata)
+    *(.sdata2)
+    *(.dynamic)
+    CONSTRUCTORS
+  }
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  . = .;
+  __u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) }
+  __u_boot_cmd_end = .;
+
+
+  . = .;
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  . = ALIGN(256);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(256);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   _sbss = .;
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+   . = ALIGN(4);
+   _ebss = .;
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
index 786543e5dba6c93855f9c74c9addd5a4409a49db..f1bb72128480d1fc4c91d5030ee83f1ca473e433 100644 (file)
@@ -79,8 +79,7 @@
 #define AU_FIRMWARE    "u-boot.img"
 #define AU_KERNEL      "kernel.img"
 
-struct flash_layout
-{
+struct flash_layout {
        long start;
        long end;
 };
@@ -122,10 +121,10 @@ struct flash_layout aufl_layout[AU_MAXFILES] = { \
 #define I2C_PSOC_KEYPAD_ADDR   0x53
 
 /* keypad mask */
-#define KEYPAD_ROW     3
-#define KEYPAD_COL     3
-#define KEYPAD_MASK_LO ((1<<(KEYPAD_COL-1+(KEYPAD_ROW*4-4)))&0xFF)
-#define KEYPAD_MASK_HI ((1<<(KEYPAD_COL-1+(KEYPAD_ROW*4-4)))>>8)
+#define KEYPAD_ROW     2
+#define KEYPAD_COL     2
+#define KEYPAD_MASK_LO ((1<<(KEYPAD_COL-1+(KEYPAD_ROW*3-3)))&0xFF)
+#define KEYPAD_MASK_HI ((1<<(KEYPAD_COL-1+(KEYPAD_ROW*3-3)))>>8)
 
 /* externals */
 extern int fat_register_device(block_dev_desc_t *, int);
@@ -139,33 +138,28 @@ extern int flash_write (char *, ulong, ulong);
 extern block_dev_desc_t *get_dev (char*, int);
 extern int u_boot_hush_start(void);
 
-int
-au_check_cksum_valid(int idx, long nbytes)
+int au_check_cksum_valid(int idx, long nbytes)
 {
        image_header_t *hdr;
        unsigned long checksum;
 
        hdr = (image_header_t *)LOAD_ADDR;
 
-       if (nbytes != (sizeof(*hdr) + ntohl(hdr->ih_size)))
-       {
+       if (nbytes != (sizeof(*hdr) + ntohl(hdr->ih_size))) {
                printf ("Image %s bad total SIZE\n", aufile[idx]);
                return -1;
        }
        /* check the data CRC */
        checksum = ntohl(hdr->ih_dcrc);
 
-       if (crc32 (0, (uchar *)(LOAD_ADDR + sizeof(*hdr)), ntohl(hdr->ih_size))
-               != checksum)
-       {
+       if (crc32 (0, (uchar *)(LOAD_ADDR + sizeof(*hdr)), ntohl(hdr->ih_size)) != checksum) {
                printf ("Image %s bad data checksum\n", aufile[idx]);
                return -1;
        }
        return 0;
 }
 
-int
-au_check_header_valid(int idx, long nbytes)
+int au_check_header_valid(int idx, long nbytes)
 {
        image_header_t *hdr;
        unsigned long checksum;
@@ -180,13 +174,11 @@ au_check_header_valid(int idx, long nbytes)
        printf("size %#x %#lx ", ntohl(hdr->ih_size), nbytes);
        printf("type %#x %#x ", hdr->ih_type, IH_TYPE_KERNEL);
 #endif
-       if (nbytes < sizeof(*hdr))
-       {
+       if (nbytes < sizeof(*hdr)) {
                printf ("Image %s bad header SIZE\n", aufile[idx]);
                return -1;
        }
-       if (ntohl(hdr->ih_magic) != IH_MAGIC || hdr->ih_arch != IH_CPU_PPC)
-       {
+       if (ntohl(hdr->ih_magic) != IH_MAGIC || hdr->ih_arch != IH_CPU_PPC) {
                printf ("Image %s bad MAGIC or ARCH\n", aufile[idx]);
                return -1;
        }
@@ -222,9 +214,7 @@ au_check_header_valid(int idx, long nbytes)
        return 0;
 }
 
-
-int
-au_do_update(int idx, long sz)
+int au_do_update(int idx, long sz)
 {
        image_header_t *hdr;
        char *addr;
@@ -303,14 +293,12 @@ au_do_update(int idx, long sz)
        return 0;
 }
 
-
 /*
  * this is called from board_init() after the hardware has been set up
  * and is usable. That seems like a good time to do this.
  * Right now the return value is ignored.
  */
-int 
-do_auto_update(void)
+int do_auto_update(void)
 {
        block_dev_desc_t *stor_dev;
        long sz;
index 67969a601092c273c8678f6783117048e9f71c44..554c51d93fa29726951c37a869ef373cd6c9ca21 100644 (file)
@@ -228,10 +228,6 @@ int misc_init_r (void)
 {
        ulong flash_sup_end, snum;
 
-#ifdef CONFIG_AUTO_UPDATE
-       /* this has priority over all else */
-       do_auto_update();
-#endif
        /*
         * Adjust flash start and offset to detected values
         */
@@ -294,6 +290,9 @@ int misc_init_r (void)
                flash_info[0].sector_count = snum;
        }
 
+#ifdef CONFIG_AUTO_UPDATE
+        do_auto_update();
+#endif
        return (0);
 }
 
index de54386ddd5c72cecf6aa6798219d8feee83e689..6bb7c31437586ff52ae5ce79c6b9c9aa1113ac72 100644 (file)
@@ -106,12 +106,13 @@ static void nc650_hwcontrol(struct mtd_info *mtd, int cmd)
  * Members with a "?" were not set in the merged testing-NAND branch,
  * so they are not set here either.
  */
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
 
        nand->hwcontrol = nc650_hwcontrol;
        nand->eccmode = NAND_ECC_SOFT;
        nand->chip_delay = 12;
 /*     nand->options = NAND_SAMSUNG_LP_OPTIONS;*/
+       return 0;
 }
 #endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */
index f470c1a01e05f72f5988188b0222356203e795c4..78523654eb95316361d16b7172c72bbb3f414fb8 100644 (file)
@@ -55,12 +55,13 @@ static int netstar_nand_ready(struct mtd_info *mtd)
 }
 ***/
 
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
        nand->options = NAND_SAMSUNG_LP_OPTIONS;
        nand->eccmode = NAND_ECC_SOFT;
        nand->hwcontrol = netstar_nand_hwcontrol;
 /*     nand->dev_ready = netstar_nand_ready; */
        nand->chip_delay = 18;
+       return 0;
 }
 #endif
index 2389561271a24ccb3ffde38e411a296659c24de3..5abc87dde64b7c3e50ae01b876b15b6e403474df 100644 (file)
@@ -77,8 +77,12 @@ int board_early_init_f (void)
        mtdcr (uicb0tr, 0x00000000); /* */
        mtdcr (uicb0vr, 0x00000001); /* */
 
+       /* Setup shutdown/SSD empty interrupt as inputs */
+       out32(GPIO0_TCR, in32(GPIO0_TCR) & ~(CFG_GPIO_SHUTDOWN | CFG_GPIO_SSD_EMPTY));
+       out32(GPIO0_ODR, in32(GPIO0_ODR) & ~(CFG_GPIO_SHUTDOWN | CFG_GPIO_SSD_EMPTY));
+
        /* Setup GPIO/IRQ multiplexing */
-       mtsdr(sdr_pfc0, 0x01a03e00);
+       mtsdr(sdr_pfc0, 0x01a33e00);
 
        return 0;
 }
@@ -105,26 +109,11 @@ int last_stage_init(void)
 
 static int board_rev(void)
 {
-       int rev;
-       u32 pfc0;
-
-       /* Setup GPIO14 & 15 as GPIO */
-       mfsdr(sdr_pfc0, pfc0);
-       pfc0 |= CFG_GPIO_REV0 | CFG_GPIO_REV1;
-       mtsdr(sdr_pfc0, pfc0);
-
        /* Setup as input */
-       out32(GPIO0_TCR, in32(GPIO0_TCR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV0));
-       out32(GPIO0_ODR, in32(GPIO0_ODR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV0));
-
-       rev = (in32(GPIO0_IR) >> 16) & 0x3;
-
-       /* Setup GPIO14 & 15 as non GPIO again */
-       mfsdr(sdr_pfc0, pfc0);
-       pfc0 &= ~(CFG_GPIO_REV0 | CFG_GPIO_REV1);
-       mtsdr(sdr_pfc0, pfc0);
+       out32(GPIO0_TCR, in32(GPIO0_TCR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV1));
+       out32(GPIO0_ODR, in32(GPIO0_ODR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV1));
 
-       return rev;
+       return (in32(GPIO0_IR) >> 16) & 0x3;
 }
 
 int checkboard (void)
index e63c921eff592a347b8306e79c9c75d3b3459f4f..d66b08847a59b8e0d912c0307f47962227d37d72 100644 (file)
@@ -154,7 +154,7 @@ static int alpr_nand_dev_ready(struct mtd_info *mtd)
        return 1;
 }
 
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
        alpr_ndfc = (struct alpr_ndfc_regs *)CFG_NAND_BASE;
 
@@ -169,5 +169,7 @@ void board_nand_init(struct nand_chip *nand)
        nand->read_buf   = alpr_nand_read_buf;
        nand->verify_buf = alpr_nand_verify_buf;
        nand->dev_ready  = alpr_nand_dev_ready;
+
+       return 0;
 }
 #endif
index 1931d64de0c47b67c90eb2209b79814628e1781f..92f9c0190238cf7c63f4c9bd9b281663fc379294 100644 (file)
@@ -148,7 +148,7 @@ static int pdnb3_nand_dev_ready(struct mtd_info *mtd)
        return 1;
 }
 
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
        pdnb3_ndfc = (struct pdnb3_ndfc_regs *)CFG_NAND_BASE;
 
@@ -167,5 +167,6 @@ void board_nand_init(struct nand_chip *nand)
        nand->read_buf   = pdnb3_nand_read_buf;
        nand->verify_buf = pdnb3_nand_verify_buf;
        nand->dev_ready  = pdnb3_nand_dev_ready;
+       return 0;
 }
 #endif
index 424ab1cf9e3251575e95a3faf767cfc87b765cf2..0c48c3aeeccd231704a097d5b930512389fa48ac 100644 (file)
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).a
 
-COBJS  = $(BOARD).o
+COBJS  = $(BOARD).o hpi.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
diff --git a/board/spc1920/hpi.c b/board/spc1920/hpi.c
new file mode 100644 (file)
index 0000000..3c36f79
--- /dev/null
@@ -0,0 +1,603 @@
+/*
+ * (C) Copyright 2006
+ * Markus Klotzbuecher, DENX Software Engineering, mk@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
+ */
+
+/*
+ * Host Port Interface (HPI)
+ */
+
+/* debug levels:
+ *  0 : errors
+ *  1 : usefull info
+ *  2 : lots of info
+ *  3 : noisy
+ */
+
+#define DEBUG 0
+
+#include <config.h>
+#include <common.h>
+#include <mpc8xx.h>
+
+#include "pld.h"
+#include "hpi.h"
+
+#define        _NOT_USED_      0xFFFFFFFF
+
+/* original table:
+ * - inserted loops to achieve long CS low and high Periods (~217ns)
+ * - move cs high 2/4 to the right
+ */
+const uint dsp_table_slow[] =
+{
+       /* single read   (offset  0x00 in upm ram) */
+       0x8fffdc04, 0x0fffdc84, 0x0fffdc84, 0x0fffdc00,
+       0x3fffdc04, 0xffffdc84, 0xffffdc84, 0xffffdc05,
+
+       /* burst read    (offset 0x08 in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+
+       /* single write  (offset 0x18 in upm ram) */
+       0x8fffd004, 0x0fffd084, 0x0fffd084, 0x3fffd000,
+       0xffffd084, 0xffffd084, 0xffffd005, _NOT_USED_,
+
+       /* burst write   (offset 0x20 in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       /* refresh       (offset 0x30 in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       /* exception     (offset 0x3C in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+};
+
+/* dsp hpi upm ram table
+ * works fine for noninc access, failes on incremental.
+ * - removed first word
+ */
+const uint dsp_table_fast[] =
+{
+       /* single read   (offset  0x00 in upm ram) */
+       0x8fffdc04, 0x0fffdc04, 0x0fffdc00, 0x3fffdc04,
+       0xffffdc05, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+
+       /* burst read    (offset 0x08 in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+
+       /* single write  (offset 0x18 in upm ram) */
+       0x8fffd004, 0x0fffd004, 0x3fffd000, 0xffffd005,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+
+       /* burst write   (offset 0x20 in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       /* refresh       (offset 0x30 in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+       /* exception     (offset 0x3C in upm ram) */
+       _NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
+};
+
+
+#ifdef CONFIG_SPC1920_HPI_TEST
+#undef HPI_TEST_OSZI
+
+#define HPI_TEST_CHUNKSIZE     0x1000
+#define HPI_TEST_PATTERN       0x00000000
+#define HPI_TEST_START         0x0
+#define HPI_TEST_END           0x30000
+
+#define TINY_AUTOINC_DATA_SIZE 16 /* 32bit words */
+#define TINY_AUTOINC_BASE_ADDR 0x0
+
+static int hpi_activate(void);
+static void hpi_inactivate(void);
+static void dsp_reset(void);
+
+static int hpi_write_inc(u32 addr, u32 *data, u32 count);
+static int hpi_read_inc(u32 addr, u32 *buf, u32 count);
+static int hpi_write_noinc(u32 addr, u32 data);
+static u32 hpi_read_noinc(u32 addr);
+
+int hpi_test(void);
+static int hpi_write_addr_test(u32 addr);
+static int hpi_read_write_test(u32 addr, u32 data);
+static int hpi_tiny_autoinc_test(void);
+#endif /* CONFIG_SPC1920_HPI_TEST */
+
+
+/* init the host port interface on UPMA */
+int hpi_init(void)
+{
+       volatile immap_t *immr = (immap_t *) CFG_IMMR;
+       volatile memctl8xx_t *memctl = &immr->im_memctl;
+       volatile spc1920_pld_t *pld = (spc1920_pld_t *) CFG_SPC1920_PLD_BASE;
+
+       upmconfig(UPMA, (uint *)dsp_table_slow, sizeof(dsp_table_slow)/sizeof(uint));
+       udelay(100);
+
+       memctl->memc_mamr = CFG_MAMR;
+       memctl->memc_or3 = CFG_OR3;
+       memctl->memc_br3 = CFG_BR3;
+
+       /* reset dsp */
+       dsp_reset();
+
+       /* activate hpi switch*/
+       pld->dsp_hpi_on = 0x1;
+
+       udelay(100);
+
+       return 0;
+}
+
+#ifdef CONFIG_SPC1920_HPI_TEST
+/* activate the Host Port interface */
+static int hpi_activate(void)
+{
+       volatile spc1920_pld_t *pld = (spc1920_pld_t *) CFG_SPC1920_PLD_BASE;
+
+       /* turn on hpi */
+       pld->dsp_hpi_on = 0x1;
+
+       udelay(5);
+
+       /* turn on the power EN_DSP_POWER high*/
+       /* currently always on TBD */
+
+       /* setup hpi control register */
+       HPI_HPIC_1 = (u16) 0x0008;
+       HPI_HPIC_2 = (u16) 0x0008;
+
+       udelay(100);
+
+       return 0;
+}
+
+/* turn off the host port interface */
+static void hpi_inactivate(void)
+{
+       volatile spc1920_pld_t *pld = (spc1920_pld_t *) CFG_SPC1920_PLD_BASE;
+
+       /* deactivate hpi */
+       pld->dsp_hpi_on = 0x0;
+
+       /* reset the dsp */
+       /* pld->dsp_reset = 0x0; */
+
+       /* turn off the power EN_DSP_POWER# high*/
+       /* currently always on TBD */
+
+}
+
+/* reset the DSP */
+static void dsp_reset(void)
+{
+       volatile spc1920_pld_t *pld = (spc1920_pld_t *) CFG_SPC1920_PLD_BASE;
+       pld->dsp_reset = 0x1;
+       pld->dsp_hpi_on = 0x0;
+
+       udelay(300000);
+
+       pld->dsp_reset = 0x0;
+       pld->dsp_hpi_on = 0x1;
+}
+
+
+/* write using autoinc (count is number of 32bit words) */
+static int hpi_write_inc(u32 addr, u32 *data, u32 count)
+{
+       int i;
+       u16 addr1, addr2;
+
+       addr1 = (u16) ((addr >> 16) & 0xffff); /* First HW is most significant */
+       addr2 = (u16) (addr & 0xffff);
+
+       /* write address */
+       HPI_HPIA_1 = addr1;
+       HPI_HPIA_2 = addr2;
+
+       debugX(4, "writing from data=0x%x to 0x%x\n", data, (data+count));
+
+       for(i=0; i<count; i++) {
+               HPI_HPID_INC_1 = (u16) ((data[i] >> 16) & 0xffff);
+               HPI_HPID_INC_2 = (u16) (data[i] & 0xffff);
+               debugX(4, "hpi_write_inc: data1=0x%x, data2=0x%x\n",
+                      (u16) ((data[i] >> 16) & 0xffff),
+                      (u16) (data[i] & 0xffff));
+       }
+#if 0
+       while(data_ptr < (u16*) (data + count)) {
+               HPI_HPID_INC_1 = *(data_ptr++);
+               HPI_HPID_INC_2 = *(data_ptr++);
+       }
+#endif
+
+       /* return number of bytes written */
+       return count;
+}
+
+/*
+ * read using autoinc (count is number of 32bit words)
+ */
+static int hpi_read_inc(u32 addr, u32 *buf, u32 count)
+{
+       int i;
+       u16 addr1, addr2, data1, data2;
+
+       addr1 = (u16) ((addr >> 16) & 0xffff); /* First HW is most significant */
+       addr2 = (u16) (addr & 0xffff);
+
+       /* write address */
+       HPI_HPIA_1 = addr1;
+       HPI_HPIA_2 = addr2;
+
+       for(i=0; i<count; i++) {
+               data1 = HPI_HPID_INC_1;
+               data2 = HPI_HPID_INC_2;
+               debugX(4, "hpi_read_inc: data1=0x%x, data2=0x%x\n", data1, data2);
+               buf[i] = (((u32) data1) << 16) | (data2 & 0xffff);
+       }
+
+#if 0
+       while(buf_ptr < (u16*) (buf + count)) {
+               *(buf_ptr++) = HPI_HPID_INC_1;
+               *(buf_ptr++) = HPI_HPID_INC_2;
+       }
+#endif
+
+       /* return number of bytes read */
+       return count;
+}
+
+
+/* write to non- auto inc regs */
+static int hpi_write_noinc(u32 addr, u32 data)
+{
+
+       u16 addr1, addr2, data1, data2;
+
+       addr1 = (u16) ((addr >> 16) & 0xffff); /* First HW is most significant */
+       addr2 = (u16) (addr & 0xffff);
+
+       /* printf("hpi_write_noinc: addr1=0x%x, addr2=0x%x\n", addr1, addr2); */
+
+       HPI_HPIA_1 = addr1;
+       HPI_HPIA_2 = addr2;
+
+       data1 = (u16) ((data >> 16) & 0xffff);
+       data2 = (u16) (data & 0xffff);
+
+       /* printf("hpi_write_noinc: data1=0x%x, data2=0x%x\n", data1, data2); */
+
+       HPI_HPID_NOINC_1 = data1;
+       HPI_HPID_NOINC_2 = data2;
+
+       return 0;
+}
+
+/* read from non- auto inc regs */
+static u32 hpi_read_noinc(u32 addr)
+{
+       u16 addr1, addr2, data1, data2;
+       u32 ret;
+
+       addr1 = (u16) ((addr >> 16) & 0xffff); /* First HW is most significant */
+       addr2 = (u16) (addr & 0xffff);
+
+       HPI_HPIA_1 = addr1;
+       HPI_HPIA_2 = addr2;
+
+       /* printf("hpi_read_noinc: addr1=0x%x, addr2=0x%x\n", addr1, addr2); */
+
+       data1 = HPI_HPID_NOINC_1;
+       data2 = HPI_HPID_NOINC_2;
+
+       /* printf("hpi_read_noinc: data1=0x%x, data2=0x%x\n", data1, data2); */
+
+       ret = (((u32) data1) << 16) | (data2 & 0xffff);
+       return ret;
+
+}
+
+/*
+ * Host Port Interface Tests
+ */
+
+#ifndef HPI_TEST_OSZI
+/* main test function */
+int hpi_test(void)
+{
+       int err = 0;
+       u32 i, ii, pattern, tmp;
+
+       pattern = HPI_TEST_PATTERN;
+
+       u32 test_data[HPI_TEST_CHUNKSIZE];
+       u32 read_data[HPI_TEST_CHUNKSIZE];
+
+       debugX(2, "hpi_test: activating hpi...");
+       hpi_activate();
+       debugX(2, "OK.\n");
+
+#if 0
+       /* Dump the first 1024 bytes
+        *
+        */
+       for(i=0; i<1024; i+=4) {
+               if(i%16==0)
+                       printf("\n0x%08x: ", i);
+               printf("0x%08x ", hpi_read_noinc(i));
+       }
+#endif
+
+       /* HPIA read-write test
+        *
+        */
+       debugX(1, "hpi_test: starting HPIA read-write tests...\n");
+       err |= hpi_write_addr_test(0xdeadc0de);
+       err |= hpi_write_addr_test(0xbeefd00d);
+       err |= hpi_write_addr_test(0xabcd1234);
+       err |= hpi_write_addr_test(0xaaaaaaaa);
+       if(err) {
+               debugX(1, "hpi_test: HPIA read-write tests: *** FAILED ***\n");
+               return -1;
+       }
+       debugX(1, "hpi_test: HPIA read-write tests: OK\n");
+
+
+       /* read write test using nonincremental data regs
+        *
+        */
+       debugX(1, "hpi_test: starting nonincremental tests...\n");
+       for(i=HPI_TEST_START; i<HPI_TEST_END; i+=4) {
+               err |= hpi_read_write_test(i, pattern);
+
+               /* stolen from cmd_mem.c */
+               if(pattern & 0x80000000) {
+                       pattern = -pattern;     /* complement & increment */
+               } else {
+                       pattern = ~pattern;
+               }
+               err |= hpi_read_write_test(i, pattern);
+
+               if(err) {
+                       debugX(1, "hpi_test: nonincremental tests *** FAILED ***\n");
+                       return -1;
+               }
+       }
+       debugX(1, "hpi_test: nonincremental test OK\n");
+
+       /* read write a chunk of data using nonincremental data regs
+        *
+        */
+       debugX(1, "hpi_test: starting nonincremental chunk tests...\n");
+       pattern = HPI_TEST_PATTERN;
+       for(i=HPI_TEST_START; i<HPI_TEST_END; i+=4) {
+               hpi_write_noinc(i, pattern);
+
+               /* stolen from cmd_mem.c */
+               if(pattern & 0x80000000) {
+                       pattern = -pattern;     /* complement & increment */
+               } else {
+                       pattern = ~pattern;
+               }
+       }
+       pattern = HPI_TEST_PATTERN;
+       for(i=HPI_TEST_START; i<HPI_TEST_END; i+=4) {
+               tmp = hpi_read_noinc(i);
+
+               if(tmp != pattern) {
+                       debugX(1, "hpi_test: noninc chunk test *** FAILED *** @ 0x%x, written=0x%x, read=0x%x\n", i, pattern, tmp);
+                       err = -1;
+               }
+               /* stolen from cmd_mem.c */
+               if(pattern & 0x80000000) {
+                       pattern = -pattern;     /* complement & increment */
+               } else {
+                       pattern = ~pattern;
+               }
+       }
+       if(err)
+               return -1;
+       debugX(1, "hpi_test: nonincremental chunk test OK\n");
+
+
+#ifdef DO_TINY_TEST
+       /* small verbose test using autoinc and nonautoinc to compare
+        *
+        */
+       debugX(1, "hpi_test: tiny_autoinc_test...\n");
+       hpi_tiny_autoinc_test();
+       debugX(1, "hpi_test: tiny_autoinc_test done\n");
+#endif /* DO_TINY_TEST */
+
+
+       /* $%& write a chunk of data using the autoincremental regs
+        *
+        */
+       debugX(1, "hpi_test: starting autoinc test %d chunks with 0x%x bytes...\n",
+              ((HPI_TEST_END - HPI_TEST_START) / HPI_TEST_CHUNKSIZE),
+              HPI_TEST_CHUNKSIZE);
+
+       for(i=HPI_TEST_START;
+           i < ((HPI_TEST_END - HPI_TEST_START) / HPI_TEST_CHUNKSIZE);
+           i++) {
+               /* generate the pattern data */
+               debugX(3, "generating pattern data: ");
+               for(ii = 0; ii < HPI_TEST_CHUNKSIZE; ii++) {
+                       debugX(3, "0x%x ", pattern);
+
+                       test_data[ii] = pattern;
+                       read_data[ii] = 0x0; /* zero to be sure */
+
+                       /* stolen from cmd_mem.c */
+                       if(pattern & 0x80000000) {
+                               pattern = -pattern;     /* complement & increment */
+                       } else {
+                               pattern = ~pattern;
+                       }
+               }
+               debugX(3, "done\n");
+
+               debugX(2, "Writing autoinc data @ 0x%x\n", i);
+               hpi_write_inc(i, test_data, HPI_TEST_CHUNKSIZE);
+
+               debugX(2, "Reading autoinc data @ 0x%x\n", i);
+               hpi_read_inc(i, read_data, HPI_TEST_CHUNKSIZE);
+
+               /* compare */
+               for(ii = 0; ii < HPI_TEST_CHUNKSIZE; ii++) {
+                       debugX(3, "hpi_test_autoinc: @ 0x%x, written=0x%x, read=0x%x", i+ii, test_data[ii], read_data[ii]);
+                       if(read_data[ii] != test_data[ii]) {
+                               debugX(0, "hpi_test: autoinc test @ 0x%x, written=0x%x, read=0x%x *** FAILED ***\n", i+ii, test_data[ii], read_data[ii]);
+                               return -1;
+                       }
+               }
+       }
+       debugX(1, "hpi_test: autoinc test OK\n");
+
+       return 0;
+}
+#else /* HPI_TEST_OSZI */
+int hpi_test(void)
+{
+       int i;
+       u32 read_data[TINY_AUTOINC_DATA_SIZE];
+
+       unsigned int dummy_data[TINY_AUTOINC_DATA_SIZE] = {
+               0x11112222, 0x33334444, 0x55556666, 0x77778888,
+               0x9999aaaa, 0xbbbbcccc, 0xddddeeee, 0xffff1111,
+               0x00010002, 0x00030004, 0x00050006, 0x00070008,
+               0x0009000a, 0x000b000c, 0x000d000e, 0x000f0001
+       };
+
+       debugX(0, "hpi_test: activating hpi...");
+       hpi_activate();
+       debugX(0, "OK.\n");
+
+       while(1) {
+               led9(1);
+               debugX(0, " writing to autoinc...\n");
+               hpi_write_inc(TINY_AUTOINC_BASE_ADDR,
+                             dummy_data, TINY_AUTOINC_DATA_SIZE);
+
+               debugX(0, " reading from autoinc...\n");
+               hpi_read_inc(TINY_AUTOINC_BASE_ADDR,
+                            read_data, TINY_AUTOINC_DATA_SIZE);
+
+               for(i=0; i < (TINY_AUTOINC_DATA_SIZE); i++) {
+                       debugX(0, " written=0x%x, read(inc)=0x%x\n",
+                              dummy_data[i], read_data[i]);
+               }
+               led9(0);
+               udelay(2000000);
+       }
+       return 0;
+}
+#endif
+
+/* test if Host Port Address Register can be written correctly */
+static int hpi_write_addr_test(u32 addr)
+{
+       u32 read_back;
+       /* write address */
+       HPI_HPIA_1 = ((u16) (addr >> 16)); /* First HW is most significant */
+       HPI_HPIA_2 = ((u16) addr);
+
+       read_back = (((u32) HPI_HPIA_1)<<16) | ((u32) HPI_HPIA_2);
+
+       if(read_back == addr) {
+               debugX(2, " hpi_write_addr_test OK: written=0x%x, read=0x%x\n",
+                      addr, read_back);
+               return 0;
+       } else {
+               debugX(0, " hpi_write_addr_test *** FAILED ***: written=0x%x, read=0x%x\n",
+                     addr, read_back);
+               return -1;
+       }
+
+       return 0;
+}
+
+/* test if a simple read/write sequence succeeds */
+static int hpi_read_write_test(u32 addr, u32 data)
+{
+       u32 read_back;
+
+       hpi_write_noinc(addr, data);
+       read_back = hpi_read_noinc(addr);
+
+       if(read_back == data) {
+               debugX(2, " hpi_read_write_test: OK, addr=0x%x written=0x%x, read=0x%x\n", addr, data, read_back);
+               return 0;
+       } else {
+               debugX(0, " hpi_read_write_test: *** FAILED ***, addr=0x%x written=0x%x, read=0x%x\n", addr, data, read_back);
+               return -1;
+       }
+
+       return 0;
+}
+
+static int hpi_tiny_autoinc_test(void)
+{
+       int i;
+       u32 read_data[TINY_AUTOINC_DATA_SIZE];
+       u32 read_data_noinc[TINY_AUTOINC_DATA_SIZE];
+
+       unsigned int dummy_data[TINY_AUTOINC_DATA_SIZE] = {
+               0x11112222, 0x33334444, 0x55556666, 0x77778888,
+               0x9999aaaa, 0xbbbbcccc, 0xddddeeee, 0xffff1111,
+               0x00010002, 0x00030004, 0x00050006, 0x00070008,
+               0x0009000a, 0x000b000c, 0x000d000e, 0x000f0001
+       };
+
+       printf(" writing to autoinc...\n");
+       hpi_write_inc(TINY_AUTOINC_BASE_ADDR, dummy_data, TINY_AUTOINC_DATA_SIZE);
+
+       printf(" reading from autoinc...\n");
+       hpi_read_inc(TINY_AUTOINC_BASE_ADDR, read_data, TINY_AUTOINC_DATA_SIZE);
+
+       printf(" reading from noinc for comparison...\n");
+       for(i=0; i < (TINY_AUTOINC_DATA_SIZE); i++)
+               read_data_noinc[i] = hpi_read_noinc(TINY_AUTOINC_BASE_ADDR+i*4);
+
+       for(i=0; i < (TINY_AUTOINC_DATA_SIZE); i++) {
+               printf(" written=0x%x, read(inc)=0x%x, read(noinc)=0x%x\n",
+                      dummy_data[i], read_data[i], read_data_noinc[i]);
+       }
+       return 0;
+}
+
+#endif /* CONFIG_SPC1920_HPI_TEST */
diff --git a/board/spc1920/hpi.h b/board/spc1920/hpi.h
new file mode 100644 (file)
index 0000000..4503873
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * (C) Copyright 2006
+ * Markus Klotzbuecher, DENX Software Engineering, mk@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
+ */
+
+int hpi_init(void);
+
+#ifdef CONFIG_SPC1920_HPI_TEST
+int hpi_test(void);
+#endif
index 3254f820c1e1d597b755059879d7cdb5c15ef46b..5beb71b5ccaab06d76226c2f2f7e0602e642c819 100644 (file)
@@ -5,8 +5,8 @@ typedef struct spc1920_pld {
        uchar com1_en;
        uchar dsp_reset;
        uchar dsp_hpi_on;
+       uchar superv_mode;
        uchar codec_dsp_power_en;
-       uchar clk2_en;
        uchar clk3_select;
        uchar clk4_select;
 } spc1920_pld_t;
index 028f4c635de4825a3572d6ed76e45de785d70ef5..1f5dcb5d3e0e22760f0fa47c8f85296b14141f30 100644 (file)
@@ -27,9 +27,9 @@
 #include <common.h>
 #include <mpc8xx.h>
 #include "pld.h"
+#include "hpi.h"
 
 #define        _NOT_USED_      0xFFFFFFFF
-/* #define debug(fmt,args...)     printf (fmt ,##args) */
 
 static long int dram_size (long int, long int *, long int);
 
@@ -172,10 +172,12 @@ long int initdram (int board_type)
        memctl->memc_br1 = (CFG_SDRAM_BASE & BR_BA_MSK) | BR_MS_UPMB | BR_V;
        udelay (1000);
 
+       /* initalize the DSP Host Port Interface */
+       hpi_init();
 
-       /* PLD Setup */
-       memctl->memc_or5 = CFG_OR5_PRELIM;
-       memctl->memc_br5 = CFG_BR5_PRELIM;
+       /* FRAM Setup */
+       memctl->memc_or4 = CFG_OR4;
+       memctl->memc_br4 = CFG_BR4;
        udelay(1000);
 
        return (size_b0);
@@ -207,13 +209,31 @@ int board_early_init_f(void)
 {
        volatile immap_t *immap = (immap_t *) CFG_IMMR;
 
+       /* Set Go/NoGo led (PA15) to color red */
+       immap->im_ioport.iop_papar &= ~0x1;
+       immap->im_ioport.iop_paodr &= ~0x1;
+       immap->im_ioport.iop_padir |= 0x1;
+       immap->im_ioport.iop_padat |= 0x1;
 
+#if 0
        /* Turn on LED PD9 */
        immap->im_ioport.iop_pdpar &= ~(0x0040);
        immap->im_ioport.iop_pddir |= 0x0040;
        immap->im_ioport.iop_pddat |= 0x0040;
+#endif
+
+       /*
+        * Enable console on SMC1. This requires turning on
+        * the com2_en signal and SMC1_DISABLE
+        */
+
+       /* SMC1_DISABLE: PB17 */
+       immap->im_cpm.cp_pbodr &= ~0x4000;
+       immap->im_cpm.cp_pbpar &= ~0x4000;
+       immap->im_cpm.cp_pbdir |= 0x4000;
+       immap->im_cpm.cp_pbdat &= ~0x4000;
 
-       /* Enable PD10 (COM2_EN) */
+       /* COM2_EN: PD10 */
        immap->im_ioport.iop_pdpar &= ~0x0020;
        immap->im_ioport.iop_pddir &= ~0x4000;
        immap->im_ioport.iop_pddir |= 0x0020;
@@ -228,6 +248,14 @@ int board_early_init_f(void)
        return 0;
 }
 
+int last_stage_init(void)
+{
+#ifdef CONFIG_SPC1920_HPI_TEST
+       printf("CMB1920 Host Port Interface Test: %s\n",
+              hpi_test() ? "Failed!" : "OK");
+#endif
+       return 0;
+}
 
 int checkboard (void)
 {
index 8c3f62e398cef2d15e939498cc3da910e3aa01f4..b3f095d807f3366af1412f6b04f77f94f4602bbc 100644 (file)
@@ -25,7 +25,7 @@
 #include <mpc5xxx.h>
 #include <asm/processor.h>
 
-#ifdef CONFIG_CAM5200
+#if defined(CONFIG_CAM5200) && defined(CONFIG_CAM5200_NIOSFLASH)
 
 #if 0
 #define DEBUGF(x...) printf(x)
@@ -783,4 +783,4 @@ unsigned long flash_init(void)
 
        return total_b;
 }
-#endif /* ifdef CONFIG_CAM5200 */
+#endif /* if defined(CONFIG_CAM5200) && defined(CONFIG_CAM5200_NIOSFLASH) */
diff --git a/board/tqm8272/Makefile b/board/tqm8272/Makefile
new file mode 100644 (file)
index 0000000..3dbf913
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# (C) Copyright 2001
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = lib$(BOARD).a
+
+OBJS   = $(BOARD).o ../tqm8xx/load_sernum_ethaddr.o
+
+$(LIB):        .depend $(OBJS)
+       $(AR) crv $@ $(OBJS)
+
+#########################################################################
+
+.depend:       Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
+
+sinclude .depend
+
+#########################################################################
diff --git a/board/tqm8272/config.mk b/board/tqm8272/config.mk
new file mode 100644 (file)
index 0000000..af7a81e
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# (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
+#
+
+#
+# TQM8272 boards
+#
+
+# This should be equal to the CFG_FLASH_BASE define in config_TQM8260.h
+# for the "final" configuration, with U-Boot in flash, or the address
+# in RAM where U-Boot is loaded at for debugging.
+#
+TEXT_BASE = 0x40000000
+
+PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -I$(TOPDIR)
diff --git a/board/tqm8272/tqm8272.c b/board/tqm8272/tqm8272.c
new file mode 100644 (file)
index 0000000..8257c77
--- /dev/null
@@ -0,0 +1,1234 @@
+/*
+ * (C) Copyright 2006
+ * Heiko Schocher, DENX Software Engineering, hs@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 <ioports.h>
+#include <mpc8260.h>
+
+#include <command.h>
+#ifdef CONFIG_PCI
+#include <pci.h>
+#include <asm/m8260_pci.h>
+#endif
+#if CONFIG_OF_FLAT_TREE
+#include <ft_build.h>
+#include <image.h>
+#endif
+
+#if 0
+#define deb_printf(fmt,arg...) \
+       printf ("TQM8272 %s %s: " fmt,__FILE__, __FUNCTION__, ##arg)
+#else
+#define deb_printf(fmt,arg...) \
+       do { } while (0)
+#endif
+
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+unsigned long board_get_cpu_clk_f (void);
+#endif
+
+/*
+ * I/O Port configuration table
+ *
+ * if conf is 1, then that port pin will be configured at boot time
+ * according to the five values podr/pdir/ppar/psor/pdat for that entry
+ */
+
+const iop_conf_t iop_conf_tab[4][32] = {
+
+    /* Port A configuration */
+    {  /*            conf ppar psor pdir podr pdat */
+       /* PA31 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 *ATMTXEN */
+       /* PA30 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTCA   */
+       /* PA29 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTSOC  */
+       /* PA28 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 *ATMRXEN */
+       /* PA27 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRSOC */
+       /* PA26 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRCA */
+       /* PA25 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[0] */
+       /* PA24 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[1] */
+       /* PA23 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[2] */
+       /* PA22 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[3] */
+       /* PA21 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[4] */
+       /* PA20 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[5] */
+       /* PA19 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[6] */
+       /* PA18 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMTXD[7] */
+       /* PA17 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[7] */
+       /* PA16 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[6] */
+       /* PA15 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[5] */
+       /* PA14 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[4] */
+       /* PA13 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[3] */
+       /* PA12 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[2] */
+       /* PA11 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[1] */
+       /* PA10 */ {   0,   0,   0,   1,   0,   0   }, /* FCC1 ATMRXD[0] */
+       /* PA9  */ {   1,   1,   0,   1,   0,   0   }, /* SMC2 TXD */
+       /* PA8  */ {   1,   1,   0,   0,   0,   0   }, /* SMC2 RXD */
+       /* PA7  */ {   0,   0,   0,   1,   0,   0   }, /* PA7 */
+       /* PA6  */ {   0,   0,   0,   1,   0,   0   }, /* PA6 */
+       /* PA5  */ {   0,   0,   0,   1,   0,   0   }, /* PA5 */
+       /* PA4  */ {   0,   0,   0,   1,   0,   0   }, /* PA4 */
+       /* PA3  */ {   0,   0,   0,   1,   0,   0   }, /* PA3 */
+       /* PA2  */ {   0,   0,   0,   1,   0,   0   }, /* PA2 */
+       /* PA1  */ {   0,   0,   0,   1,   0,   0   }, /* PA1 */
+       /* PA0  */ {   0,   0,   0,   1,   0,   0   }  /* PA0 */
+    },
+
+    /* Port B configuration */
+    {  /*            conf ppar psor pdir podr pdat */
+       /* PB31 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TX_ER */
+       /* PB30 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_DV */
+       /* PB29 */ {   1,   1,   1,   1,   0,   0   }, /* FCC2 MII TX_EN */
+       /* PB28 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_ER */
+       /* PB27 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII COL */
+       /* PB26 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII CRS */
+       /* PB25 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[3] */
+       /* PB24 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[2] */
+       /* PB23 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[1] */
+       /* PB22 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[0] */
+       /* PB21 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[0] */
+       /* PB20 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[1] */
+       /* PB19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[2] */
+       /* PB18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[3] */
+       /* PB17 */ {   0,   0,   0,   0,   0,   0   }, /* PB17 */
+       /* PB16 */ {   0,   0,   0,   0,   0,   0   }, /* PB16 */
+       /* PB15 */ {   0,   0,   0,   0,   0,   0   }, /* PB15 */
+       /* PB14 */ {   0,   0,   0,   0,   0,   0   }, /* PB14 */
+       /* PB13 */ {   0,   0,   0,   0,   0,   0   }, /* PB13 */
+       /* PB12 */ {   0,   0,   0,   0,   0,   0   }, /* PB12 */
+       /* PB11 */ {   0,   0,   0,   0,   0,   0   }, /* PB11 */
+       /* PB10 */ {   0,   0,   0,   0,   0,   0   }, /* PB10 */
+       /* PB9  */ {   0,   0,   0,   0,   0,   0   }, /* PB9 */
+       /* PB8  */ {   0,   0,   0,   0,   0,   0   }, /* PB8 */
+       /* PB7  */ {   0,   0,   0,   0,   0,   0   }, /* PB7 */
+       /* PB6  */ {   0,   0,   0,   0,   0,   0   }, /* PB6 */
+       /* PB5  */ {   0,   0,   0,   0,   0,   0   }, /* PB5 */
+       /* PB4  */ {   0,   0,   0,   0,   0,   0   }, /* PB4 */
+       /* PB3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PB0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
+    },
+
+    /* Port C */
+    {  /*            conf ppar psor pdir podr pdat */
+       /* PC31 */ {   0,   0,   0,   1,   0,   0   }, /* PC31 */
+       /* PC30 */ {   0,   0,   0,   0,   0,   0   }, /* PC30 */
+       /* PC29 */ {   1,   1,   1,   0,   0,   0   }, /* SCC1 EN *CLSN */
+       /* PC28 */ {   0,   0,   0,   1,   0,   0   }, /* PC28 */
+       /* PC27 */ {   0,   0,   0,   1,   0,   0   }, /* PC27 */
+       /* PC26 */ {   0,   0,   0,   1,   0,   0   }, /* PC26 */
+       /* PC25 */ {   0,   0,   0,   1,   0,   0   }, /* PC25 */
+       /* PC24 */ {   0,   0,   0,   1,   0,   0   }, /* PC24 */
+       /* PC23 */ {   0,   1,   0,   1,   0,   0   }, /* ATMTFCLK */
+       /* PC22 */ {   0,   1,   0,   0,   0,   0   }, /* ATMRFCLK */
+       /* PC21 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN RXCLK */
+       /* PC20 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN TXCLK */
+       /* PC19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_CLK */
+       /* PC18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII TX_CLK */
+       /* PC17 */ {   1,   0,   0,   1,   0,   0   }, /* PC17 MDC */
+       /* PC16 */ {   1,   0,   0,   0,   0,   0   }, /* PC16 MDIO*/
+       /* PC15 */ {   0,   0,   0,   1,   0,   0   }, /* PC15 */
+       /* PC14 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN *CD */
+       /* PC13 */ {   0,   0,   0,   1,   0,   0   }, /* PC13 */
+       /* PC12 */ {   0,   0,   0,   1,   0,   0   }, /* PC12 */
+       /* PC11 */ {   0,   0,   0,   1,   0,   0   }, /* PC11 */
+       /* PC10 */ {   0,   0,   0,   1,   0,   0   }, /* PC10 */
+       /* PC9  */ {   0,   0,   0,   1,   0,   0   }, /* PC9 */
+       /* PC8  */ {   0,   0,   0,   1,   0,   0   }, /* PC8 */
+       /* PC7  */ {   0,   0,   0,   1,   0,   0   }, /* PC7 */
+       /* PC6  */ {   0,   0,   0,   1,   0,   0   }, /* PC6 */
+       /* PC5  */ {   1,   1,   0,   1,   0,   0   }, /* PC5 SMC1 TXD */
+       /* PC4  */ {   1,   1,   0,   0,   0,   0   }, /* PC4 SMC1 RXD */
+       /* PC3  */ {   0,   0,   0,   1,   0,   0   }, /* PC3 */
+       /* PC2  */ {   0,   0,   0,   1,   0,   1   }, /* ENET FDE */
+       /* PC1  */ {   0,   0,   0,   1,   0,   0   }, /* ENET DSQE */
+       /* PC0  */ {   0,   0,   0,   1,   0,   0   }, /* ENET LBK */
+    },
+
+    /* Port D */
+    {  /*            conf ppar psor pdir podr pdat */
+       /* PD31 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN RxD */
+       /* PD30 */ {   1,   1,   1,   1,   0,   0   }, /* SCC1 EN TxD */
+       /* PD29 */ {   1,   1,   0,   1,   0,   0   }, /* SCC1 EN TENA */
+       /* PD28 */ {   0,   0,   0,   1,   0,   0   }, /* PD28 */
+       /* PD27 */ {   0,   0,   0,   1,   0,   0   }, /* PD27 */
+       /* PD26 */ {   0,   0,   0,   1,   0,   0   }, /* PD26 */
+       /* PD25 */ {   0,   0,   0,   1,   0,   0   }, /* PD25 */
+       /* PD24 */ {   0,   0,   0,   1,   0,   0   }, /* PD24 */
+       /* PD23 */ {   0,   0,   0,   1,   0,   0   }, /* PD23 */
+       /* PD22 */ {   0,   0,   0,   1,   0,   0   }, /* PD22 */
+       /* PD21 */ {   0,   0,   0,   1,   0,   0   }, /* PD21 */
+       /* PD20 */ {   0,   0,   0,   1,   0,   0   }, /* PD20 */
+       /* PD19 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
+       /* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
+       /* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */
+       /* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */
+#if defined(CONFIG_SOFT_I2C)
+       /* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
+       /* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
+#else
+#if defined(CONFIG_HARD_I2C)
+       /* PD15 */ {   1,   1,   1,   0,   1,   0   }, /* I2C SDA */
+       /* PD14 */ {   1,   1,   1,   0,   1,   0   }, /* I2C SCL */
+#else /* normal I/O port pins */
+       /* PD15 */ {   0,   1,   1,   0,   1,   0   }, /* I2C SDA */
+       /* PD14 */ {   0,   1,   1,   0,   1,   0   }, /* I2C SCL */
+#endif
+#endif
+       /* PD13 */ {   0,   0,   0,   0,   0,   0   }, /* PD13 */
+       /* PD12 */ {   0,   0,   0,   0,   0,   0   }, /* PD12 */
+       /* PD11 */ {   0,   0,   0,   0,   0,   0   }, /* PD11 */
+       /* PD10 */ {   0,   0,   0,   0,   0,   0   }, /* PD10 */
+       /* PD9  */ {   1,   1,   0,   1,   0,   0   }, /* SMC1 TXD */
+       /* PD8  */ {   1,   1,   0,   0,   0,   0   }, /* SMC1 RXD */
+       /* PD7  */ {   0,   0,   0,   1,   0,   1   }, /* PD7 */
+       /* PD6  */ {   0,   0,   0,   1,   0,   1   }, /* PD6 */
+       /* PD5  */ {   0,   0,   0,   1,   0,   0   }, /* PD5 */
+       /* PD4  */ {   0,   0,   0,   1,   0,   1   }, /* PD4 */
+       /* PD3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */
+       /* PD0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */
+    }
+};
+
+#define _NOT_USED_     0xFFFFFFFF
+
+/* UPM pattern for bus clock = 66.7 MHz */
+static const uint upmTable67[] =
+{
+    /* Offset  UPM Read Single RAM array entry -> NAND Read Data */
+    /* 0x00 */ 0x0fa3f100, 0x0fa3b000, 0x0fa33100, 0x0fa33000,
+    /* 0x04 */ 0x0fa33000, 0x0fa33004, 0xfffffc01, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x08 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x0C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x10 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x14 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Write Single RAM array entry -> NAND Write Data, ADDR and CMD */
+    /* 0x18 */ 0x00a3fc00, 0x00a3fc00, 0x00a3fc00, 0x00a3fc00,
+    /* 0x1C */ 0x0fa3fc00, 0x0fa3fc04, 0xfffffc01, 0xfffffc00,
+
+               /* UPM Write Burst RAM array entry -> unused */
+    /* 0x20 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x24 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x28 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x2C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Refresh Timer RAM array entry -> unused */
+    /* 0x30 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x34 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x38 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Exception RAM array entry -> unsused */
+    /* 0x3C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+};
+
+/* UPM pattern for bus clock = 100 MHz */
+static const uint upmTable100[] =
+{
+    /* Offset  UPM Read Single RAM array entry -> NAND Read Data */
+    /* 0x00 */ 0x0fa3f200, 0x0fa3b000, 0x0fa33300, 0x0fa33000,
+    /* 0x04 */ 0x0fa33000, 0x0fa33004, 0xfffffc01, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x08 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x0C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x10 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x14 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Write Single RAM array entry -> NAND Write Data, ADDR and CMD */
+    /* 0x18 */ 0x00a3ff00, 0x00a3fc00, 0x00a3fc00, 0x0fa3fc00,
+    /* 0x1C */ 0x0fa3fc00, 0x0fa3fc04, 0xfffffc01, 0xfffffc00,
+
+               /* UPM Write Burst RAM array entry -> unused */
+    /* 0x20 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x24 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x28 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x2C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Refresh Timer RAM array entry -> unused */
+    /* 0x30 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x34 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x38 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Exception RAM array entry -> unsused */
+    /* 0x3C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+};
+
+/* UPM pattern for bus clock = 133.3 MHz */
+static const uint upmTable133[] =
+{
+    /* Offset  UPM Read Single RAM array entry -> NAND Read Data */
+    /* 0x00 */ 0x0fa3f300, 0x0fa3b000, 0x0fa33300, 0x0fa33000,
+    /* 0x04 */ 0x0fa33200, 0x0fa33004, 0xfffffc01, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x08 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x0C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x10 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x14 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Write Single RAM array entry -> NAND Write Data, ADDR and CMD */
+    /* 0x18 */ 0x00a3ff00, 0x00a3fc00, 0x00a3fd00, 0x0fa3fc00,
+    /* 0x1C */ 0x0fa3fd00, 0x0fa3fc04, 0xfffffc01, 0xfffffc00,
+
+               /* UPM Write Burst RAM array entry -> unused */
+    /* 0x20 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x24 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x28 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x2C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Refresh Timer RAM array entry -> unused */
+    /* 0x30 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x34 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x38 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Exception RAM array entry -> unsused */
+    /* 0x3C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+};
+
+static int     chipsel = 0;
+
+/* UPM pattern for slow init */
+static const uint upmTableSlow[] =
+{
+    /* Offset  UPM Read Single RAM array entry */
+    /* 0x00 */ 0xffffee00, 0x00ffcc80, 0x00ffcf00, 0x00ffdc00,
+    /* 0x04 */ 0x00ffce80, 0x00ffcc00, 0x00ffee00, 0x3fffcc07,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x08 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x0C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x10 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x14 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Write Single RAM array entry */
+    /* 0x18 */ 0xffffee00, 0x00ffec80, 0x00ffef00, 0x00fffc80,
+    /* 0x1C */ 0x00fffe00, 0x00ffec00, 0x0fffef00, 0x3fffec05,
+
+               /* UPM Write Burst RAM array entry -> unused */
+    /* 0x20 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x24 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x28 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x2C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Refresh Timer RAM array entry -> unused */
+    /* 0x30 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x34 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x38 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Exception RAM array entry -> unused */
+    /* 0x3C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+};
+
+/* UPM pattern for fast init */
+static const uint upmTableFast[] =
+{
+    /* Offset  UPM Read Single RAM array entry */
+    /* 0x00 */ 0xffffee00, 0x00ffcc80, 0x00ffcd80, 0x00ffdc00,
+    /* 0x04 */ 0x00ffdc00, 0x00ffcf00, 0x00ffec00, 0x3fffcc07,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x08 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x0C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Read Burst RAM array entry -> unused */
+    /* 0x10 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x14 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+
+               /* UPM Write Single RAM array entry */
+    /* 0x18 */ 0xffffee00, 0x00ffec80, 0x00ffee80, 0x00fffc00,
+    /* 0x1C */ 0x00fffc00, 0x00ffec00, 0x0fffef00, 0x3fffec05,
+
+               /* UPM Write Burst RAM array entry -> unused */
+    /* 0x20 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x24 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x28 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x2C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Refresh Timer RAM array entry -> unused */
+    /* 0x30 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x34 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
+    /* 0x38 */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+
+               /* UPM Exception RAM array entry -> unused */
+    /* 0x3C */ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
+};
+
+
+/* ------------------------------------------------------------------------- */
+
+/* Check Board Identity:
+ */
+int checkboard (void)
+{
+       char *p = (char *) HWIB_INFO_START_ADDR;
+
+       puts ("Board: ");
+       if (*((unsigned long *)p) == (unsigned long)CFG_HWINFO_MAGIC) {
+               puts (p);
+       } else {
+               puts ("No HWIB assuming TQM8272");
+       }
+       putc ('\n');
+
+       return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+static int get_cas_latency (void)
+{
+       /* get it from the option -ts in CIB */
+       /* default is 3 */
+       int     ret = 3;
+       int     pos = 0;
+       char    *p = (char *) CIB_INFO_START_ADDR;
+
+       while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
+               if (*p < ' ' || *p > '~') { /* ASCII strings! */
+                       return ret;
+               }
+               if (*p == '-') {
+                       if ((p[1] == 't') && (p[2] == 's')) {
+                               return (p[4] - '0');
+                       }
+               }
+               p++;
+               pos++;
+       }
+       return ret;
+}
+#endif
+
+static ulong set_sdram_timing (volatile uint *sdmr_ptr, ulong sdmr, int col)
+{
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+       int     clk = board_get_cpu_clk_f ();
+       volatile immap_t *immr = (immap_t *)CFG_IMMR;
+       int     busmode = (immr->im_siu_conf.sc_bcr & BCR_EBM ? 1 : 0);
+       int     cas;
+
+       sdmr = sdmr & ~(PSDMR_RFRC_MSK | PSDMR_PRETOACT_MSK | PSDMR_WRC_MSK | \
+                        PSDMR_BUFCMD);
+       if (busmode) {
+               switch (clk) {
+                       case 66666666:
+                               sdmr |= (PSDMR_RFRC_66MHZ_60X | \
+                                       PSDMR_PRETOACT_66MHZ_60X | \
+                                       PSDMR_WRC_66MHZ_60X | \
+                                       PSDMR_BUFCMD_66MHZ_60X);
+                               break;
+                       case 100000000:
+                               sdmr |= (PSDMR_RFRC_100MHZ_60X | \
+                                       PSDMR_PRETOACT_100MHZ_60X | \
+                                       PSDMR_WRC_100MHZ_60X | \
+                                       PSDMR_BUFCMD_100MHZ_60X);
+                               break;
+
+               }
+       } else {
+               switch (clk) {
+                       case 66666666:
+                               sdmr |= (PSDMR_RFRC_66MHZ_SINGLE | \
+                                       PSDMR_PRETOACT_66MHZ_SINGLE | \
+                                       PSDMR_WRC_66MHZ_SINGLE | \
+                                       PSDMR_BUFCMD_66MHZ_SINGLE);
+                               break;
+                       case 100000000:
+                               sdmr |= (PSDMR_RFRC_100MHZ_SINGLE | \
+                                       PSDMR_PRETOACT_100MHZ_SINGLE | \
+                                       PSDMR_WRC_100MHZ_SINGLE | \
+                                       PSDMR_BUFCMD_100MHZ_SINGLE);
+                               break;
+                       case 133333333:
+                               sdmr |= (PSDMR_RFRC_133MHZ_SINGLE | \
+                                       PSDMR_PRETOACT_133MHZ_SINGLE | \
+                                       PSDMR_WRC_133MHZ_SINGLE | \
+                                       PSDMR_BUFCMD_133MHZ_SINGLE);
+                               break;
+               }
+       }
+       cas = get_cas_latency();
+       sdmr &=~ (PSDMR_CL_MSK | PSDMR_LDOTOPRE_MSK);
+       sdmr |= cas;
+       sdmr |= ((cas - 1) << 6);
+       return sdmr;
+#else
+       return sdmr;
+#endif
+}
+
+/* Try SDRAM initialization with P/LSDMR=sdmr and ORx=orx
+ *
+ * This routine performs standard 8260 initialization sequence
+ * and calculates the available memory size. It may be called
+ * several times to try different SDRAM configurations on both
+ * 60x and local buses.
+ */
+static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,
+                                                 ulong orx, volatile uchar * base, int col)
+{
+       volatile uchar c = 0xff;
+       volatile uint *sdmr_ptr;
+       volatile uint *orx_ptr;
+       ulong maxsize, size;
+       int i;
+
+       /* We must be able to test a location outsize the maximum legal size
+        * to find out THAT we are outside; but this address still has to be
+        * mapped by the controller. That means, that the initial mapping has
+        * to be (at least) twice as large as the maximum expected size.
+        */
+       maxsize = (1 + (~orx | 0x7fff)) / 2;
+
+       /* Since CFG_SDRAM_BASE is always 0 (??), we assume that
+        * we are configuring CS1 if base != 0
+        */
+       sdmr_ptr = base ? &memctl->memc_lsdmr : &memctl->memc_psdmr;
+       orx_ptr = base ? &memctl->memc_or2 : &memctl->memc_or1;
+
+       *orx_ptr = orx;
+       sdmr = set_sdram_timing (sdmr_ptr, sdmr, col);
+       /*
+        * Quote from 8260 UM (10.4.2 SDRAM Power-On Initialization, 10-35):
+        *
+        * "At system reset, initialization software must set up the
+        *  programmable parameters in the memory controller banks registers
+        *  (ORx, BRx, P/LSDMR). After all memory parameters are configured,
+        *  system software should execute the following initialization sequence
+        *  for each SDRAM device.
+        *
+        *  1. Issue a PRECHARGE-ALL-BANKS command
+        *  2. Issue eight CBR REFRESH commands
+        *  3. Issue a MODE-SET command to initialize the mode register
+        *
+        *  The initial commands are executed by setting P/LSDMR[OP] and
+        *  accessing the SDRAM with a single-byte transaction."
+        *
+        * The appropriate BRx/ORx registers have already been set when we
+        * get here. The SDRAM can be accessed at the address CFG_SDRAM_BASE.
+        */
+
+       *sdmr_ptr = sdmr | PSDMR_OP_PREA;
+       *base = c;
+
+       *sdmr_ptr = sdmr | PSDMR_OP_CBRR;
+       for (i = 0; i < 8; i++)
+               *base = c;
+
+       *sdmr_ptr = sdmr | PSDMR_OP_MRW;
+       *(base + CFG_MRS_OFFS) = c;     /* setting MR on address lines */
+
+       *sdmr_ptr = sdmr | PSDMR_OP_NORM | PSDMR_RFEN;
+       *base = c;
+
+       size = get_ram_size((long *)base, maxsize);
+       *orx_ptr = orx | ~(size - 1);
+
+       return (size);
+}
+
+long int initdram (int board_type)
+{
+       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+       volatile memctl8260_t *memctl = &immap->im_memctl;
+
+#ifndef CFG_RAMBOOT
+       long size8, size9;
+#endif
+       long psize, lsize;
+
+       psize = 16 * 1024 * 1024;
+       lsize = 0;
+
+       memctl->memc_psrt = CFG_PSRT;
+       memctl->memc_mptpr = CFG_MPTPR;
+
+#ifndef CFG_RAMBOOT
+       /* 60x SDRAM setup:
+        */
+       size8 = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL,
+                                         (uchar *) CFG_SDRAM_BASE, 8);
+       size9 = try_init (memctl, CFG_PSDMR_9COL, CFG_OR1_9COL,
+                                         (uchar *) CFG_SDRAM_BASE, 9);
+
+       if (size8 < size9) {
+               psize = size9;
+               printf ("(60x:9COL - %ld MB, ", psize >> 20);
+       } else {
+               psize = try_init (memctl, CFG_PSDMR_8COL, CFG_OR1_8COL,
+                                                 (uchar *) CFG_SDRAM_BASE, 8);
+               printf ("(60x:8COL - %ld MB, ", psize >> 20);
+       }
+
+#endif /* CFG_RAMBOOT */
+
+       icache_enable ();
+
+       return (psize);
+}
+
+
+static inline int scanChar (char *p, int len, unsigned long *number)
+{
+       int     akt = 0;
+
+       *number = 0;
+       while (akt < len) {
+               if ((*p >= '0') && (*p <= '9')) {
+                       *number *= 10;
+                       *number += *p - '0';
+                       p += 1;
+               } else {
+                       if (*p == '-')  return akt;
+                       return -1;
+               }
+               akt ++;
+       }
+       return akt;
+}
+
+typedef struct{
+       int     Bus;
+       int     flash;
+       int     flash_nr;
+       int     ram;
+       int     ram_cs;
+       int     nand;
+       int     nand_cs;
+       int     eeprom;
+       int     can;
+       unsigned long   cpunr;
+       unsigned long   option;
+       int     SecEng;
+       int     cpucl;
+       int     cpmcl;
+       int     buscl;
+       int     busclk_real_ok;
+       int     busclk_real;
+       unsigned char   OK;
+       unsigned char  ethaddr[20];
+} HWIB_INFO;
+
+HWIB_INFO      hwinf = {0, 0, 1, 0, 1, 0, 0, 0, 0, 8272, 0 ,0,
+                        0, 0, 0, 0, 0, 0};
+
+static int dump_hwib(void)
+{
+       HWIB_INFO       *hw = &hwinf;
+       volatile immap_t *immr = (immap_t *)CFG_IMMR;
+       char *s = getenv("serial#");
+
+       if (hw->OK) {
+               printf ("HWIB on %x\n", HWIB_INFO_START_ADDR);
+               printf ("serial : %s\n", s);
+               printf ("ethaddr: %s\n", hw->ethaddr);
+               printf ("FLASH  : %x nr:%d\n", hw->flash, hw->flash_nr);
+               printf ("RAM    : %x cs:%d\n", hw->ram, hw->ram_cs);
+               printf ("CPU    : %d\n", hw->cpunr);
+               printf ("CAN    : %d\n", hw->can);
+               if (hw->eeprom) printf ("EEprom : %x\n", hw->eeprom);
+               else printf ("No EEprom\n");
+               if (hw->nand) {
+                       printf ("NAND   : %x\n", hw->nand);
+                       printf ("NAND CS: %d\n", hw->nand_cs);
+               } else { printf ("No NAND\n");}
+               printf ("Bus %s mode.\n", (hw->Bus ? "60x" : "Single PQII"));
+               printf ("  real : %s\n", (immr->im_siu_conf.sc_bcr & BCR_EBM ? \
+                                "60x" : "Single PQII"));
+               printf ("Option : %x\n", hw->option);
+               printf ("%s Security Engine\n", (hw->SecEng ? "with" : "no"));
+               printf ("CPM Clk: %d\n", hw->cpmcl);
+               printf ("CPU Clk: %d\n", hw->cpucl);
+               printf ("Bus Clk: %d\n", hw->buscl);
+               if (hw->busclk_real_ok) {
+                       printf ("  real Clk: %d\n", hw->busclk_real);
+               }
+               printf ("CAS    : %d\n", get_cas_latency());
+       } else {
+               printf("HWIB @%x not OK\n", HWIB_INFO_START_ADDR);
+       }
+       return 0;
+}
+
+static inline int search_real_busclk (int *clk)
+{
+       int     part = 0, pos = 0;
+       char *p = (char *) CIB_INFO_START_ADDR;
+       int     ok = 0;
+
+       while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
+               if (*p < ' ' || *p > '~') { /* ASCII strings! */
+                       return 0;
+               }
+               switch (part) {
+               default:
+                       if (*p == '-') {
+                               ++part;
+                       }
+                       break;
+               case 3:
+                       if (*p == '-') {
+                               ++part;
+                               break;
+                       }
+                       if (*p == 'b') {
+                               ok = 1;
+                               p++;
+                               break;
+                       }
+                       if (ok) {
+                               switch (*p) {
+                               case '6':
+                                       *clk = 66666666;
+                                       return 1;
+                                       break;
+                               case '1':
+                                       if (p[1] == '3') {
+                                               *clk = 133333333;
+                                       } else {
+                                               *clk = 100000000;
+                                       }
+                                       return 1;
+                                       break;
+                               }
+                       }
+                       break;
+               }
+               p++;
+       }
+       return 0;
+}
+
+int analyse_hwib (void)
+{
+       char    *p = (char *) HWIB_INFO_START_ADDR;
+       int     anz;
+       int     part = 1, i = 0, pos = 0;
+       HWIB_INFO       *hw = &hwinf;
+
+       deb_printf(" %s pointer: %p\n", __FUNCTION__, p);
+       /* Head = TQM */
+       if (*((unsigned long *)p) != (unsigned long)CFG_HWINFO_MAGIC) {
+               deb_printf("No HWIB\n");
+               return -1;
+       }
+       p += 3;
+       if (scanChar (p, 4, &hw->cpunr) < 0) {
+               deb_printf("No CPU\n");
+               return -2;
+       }
+       p +=4;
+
+       hw->flash = 0x200000 << (*p - 'A');
+       p++;
+       hw->flash_nr = *p - '0';
+       p++;
+
+       hw->ram = 0x2000000 << (*p - 'A');
+       p++;
+       if (*p == '2') {
+               hw->ram_cs = 2;
+               p++;
+       }
+
+       if (*p == 'A') hw->can = 1;
+       if (*p == 'B') hw->can = 2;
+       p +=1;
+       p +=1;  /* connector */
+       if (*p != '0') {
+               hw->eeprom = 0x100 << (*p - 'A');
+       }
+       p++;
+
+       if ((*p < '0') || (*p > '9')) {
+               /* NAND before z-option */
+               hw->nand = 0x8000000 << (*p - 'A');
+               p++;
+               hw->nand_cs = *p - '0';
+               p += 2;
+       }
+       /* z-option */
+       anz = scanChar (p, 4, &hw->option);
+       if (anz < 0) {
+               deb_printf("No option\n");
+               return -3;
+       }
+       if (hw->option & 0x8) hw->Bus = 1;
+       p += anz;
+       if (*p != '-') {
+               deb_printf("No -\n");
+               return -4;
+       }
+       p++;
+       /* C option */
+       if (*p == 'E') {
+               hw->SecEng = 1;
+               p++;
+       }
+       switch (*p) {
+               case 'M': hw->cpucl = 266666666;
+                       break;
+               case 'P': hw->cpucl = 300000000;
+                       break;
+               case 'T': hw->cpucl = 400000000;
+                       break;
+               default:
+                       deb_printf("No CPU Clk: %c\n", *p);
+                       return -5;
+                       break;
+       }
+       p++;
+       switch (*p) {
+               case 'I': hw->cpmcl = 200000000;
+                       break;
+               case 'M': hw->cpmcl = 300000000;
+                       break;
+               default:
+                       deb_printf("No CPM Clk\n");
+                       return -6;
+                       break;
+       }
+       p++;
+       switch (*p) {
+               case 'B': hw->buscl = 66666666;
+                       break;
+               case 'E': hw->buscl = 100000000;
+                       break;
+               case 'F': hw->buscl = 133333333;
+                       break;
+               default:
+                       deb_printf("No BUS Clk\n");
+                       return -7;
+                       break;
+       }
+       p++;
+
+       hw->OK = 1;
+       /* search MAC Address */
+       while ((*p != '\0') && (pos < CFG_HWINFO_SIZE)) {
+               if (*p < ' ' || *p > '~') { /* ASCII strings! */
+                       return 0;
+               }
+               switch (part) {
+               default:
+                       if (*p == ' ') {
+                               ++part;
+                               i = 0;
+                       }
+                       break;
+               case 3:                 /* Copy MAC address */
+                       if (*p == ' ') {
+                               ++part;
+                               i = 0;
+                               break;
+                       }
+                       hw->ethaddr[i++] = *p;
+                       if ((i % 3) == 2)
+                               hw->ethaddr[i++] = ':';
+                       break;
+
+               }
+               p++;
+       }
+
+       hw->busclk_real_ok = search_real_busclk (&hw->busclk_real);
+       return 0;
+}
+
+#if defined(CONFIG_GET_CPU_STR_F)
+/* !! This routine runs from Flash */
+char get_cpu_str_f (char *buf)
+{
+       char *p = (char *) HWIB_INFO_START_ADDR;
+       int     i = 0;
+
+       buf[i++] = 'M';
+       buf[i++] = 'P';
+       buf[i++] = 'C';
+       if (*((unsigned long *)p) == (unsigned long)CFG_HWINFO_MAGIC) {
+               buf[i++] = *&p[3];
+               buf[i++] = *&p[4];
+               buf[i++] = *&p[5];
+               buf[i++] = *&p[6];
+       } else {
+               buf[i++] = '8';
+               buf[i++] = '2';
+               buf[i++] = '7';
+               buf[i++] = 'x';
+       }
+       buf[i++] = 0;
+       return 0;
+}
+#endif
+
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+/* !! This routine runs from Flash */
+unsigned long board_get_cpu_clk_f (void)
+{
+       char *p = (char *) HWIB_INFO_START_ADDR;
+       int i = 0;
+
+       if (*((unsigned long *)p) == (unsigned long)CFG_HWINFO_MAGIC) {
+               if (search_real_busclk (&i))
+                       return i;
+       }
+       return CONFIG_8260_CLKIN;
+}
+#endif
+
+#if CONFIG_BOARD_EARLY_INIT_R
+
+static int can_test (unsigned long off)
+{
+       volatile unsigned char  *base   = (unsigned char *) (CFG_CAN_BASE + off);
+
+       *(base + 0x17) = 'T';
+       *(base + 0x18) = 'Q';
+       *(base + 0x19) = 'M';
+       if ((*(base + 0x17) != 'T') ||
+           (*(base + 0x18) != 'Q') ||
+           (*(base + 0x19) != 'M')) {
+               return 0;
+       }
+       return 1;
+}
+
+static int can_config_one (unsigned long off)
+{
+       volatile unsigned char  *ctrl   = (unsigned char *) (CFG_CAN_BASE + off);
+       volatile unsigned char  *cpu_if = (unsigned char *) (CFG_CAN_BASE + off + 0x02);
+       volatile unsigned char  *clkout = (unsigned char *) (CFG_CAN_BASE + off + 0x1f);
+       unsigned char temp;
+
+       *cpu_if = 0x45;
+       temp = *ctrl;
+       temp |= 0x40;
+       *ctrl   = temp;
+       *clkout = 0x20;
+       temp = *ctrl;
+       temp &= ~0x40;
+       *ctrl   = temp;
+       return 0;
+}
+
+static int can_config (void)
+{
+       int     ret = 0;
+       can_config_one (0);
+       if (hwinf.can == 2) {
+               can_config_one (0x100);
+       }
+       /* make Test if they really there */
+       ret += can_test (0);
+       ret += can_test (0x100);
+       return ret;
+}
+
+static int init_can (void)
+{
+       volatile immap_t * immr = (immap_t *)CFG_IMMR;
+       volatile memctl8260_t *memctl = &immr->im_memctl;
+       int     count = 0;
+
+       if ((hwinf.OK) && (hwinf.can)) {
+               memctl->memc_or4 = CFG_CAN_OR;
+               memctl->memc_br4 = CFG_CAN_BR;
+               /* upm Init */
+               upmconfig (UPMC, (uint *) upmTableFast,
+                          sizeof (upmTableFast) / sizeof (uint));
+               memctl->memc_mcmr =     (MxMR_DSx_3_CYCL |
+                                       MxMR_GPL_x4DIS |
+                                       MxMR_RLFx_2X |
+                                       MxMR_WLFx_2X |
+                                       MxMR_OP_NORM);
+               /* can configure */
+               count = can_config ();
+               printf ("CAN:   %d @ %x\n", count, CFG_CAN_BASE);
+               if (hwinf.can != count) printf("!!! difference to HWIB\n");
+       } else {
+               printf ("CAN:   No\n");
+       }
+       return 0;
+}
+
+int board_early_init_r(void)
+{
+       analyse_hwib ();
+       init_can ();
+       return 0;
+}
+#endif
+
+int do_hwib_dump (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       dump_hwib ();
+       return 0;
+}
+
+U_BOOT_CMD(
+         hwib, 1,      1,      do_hwib_dump,
+         "hwib    - dump HWIB'\n",
+         "\n"
+);
+
+#ifdef CFG_UPDATE_FLASH_SIZE
+static int get_flash_timing (void)
+{
+       /* get it from the option -tf in CIB */
+       /* default is 0x00000c84 */
+       int     ret = 0x00000c84;
+       int     pos = 0;
+       int     nr = 0;
+       char    *p = (char *) CIB_INFO_START_ADDR;
+
+       while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
+               if (*p < ' ' || *p > '~') { /* ASCII strings! */
+                       return ret;
+               }
+               if (*p == '-') {
+                       if ((p[1] == 't') && (p[2] == 'f')) {
+                               p += 6;
+                               ret = 0;
+                               while (nr < 8) {
+                               if ((*p >= '0') && (*p <= '9')) {
+                                       ret *= 0x10;
+                                       ret += *p - '0';
+                                       p += 1;
+                                       nr ++;
+                               } else if ((*p >= 'A') && (*p <= 'F')) {
+                                       ret *= 10;
+                                       ret += *p - '7';
+                                       p += 1;
+                                       nr ++;
+                               } else {
+                                       if (nr < 8) return 0x00000c84;
+                                       return ret;
+                               }
+                               }
+                       }
+               }
+               p++;
+               pos++;
+       }
+       return ret;
+}
+
+/* Update the Flash_Size and the Flash Timing */
+int update_flash_size (int flash_size)
+{
+       volatile immap_t * immr = (immap_t *)CFG_IMMR;
+       volatile memctl8260_t *memctl = &immr->im_memctl;
+       unsigned long reg;
+       unsigned long tim;
+
+       /* I must use reg, otherwise the board hang */
+       reg = memctl->memc_or0;
+       reg &= ~ORxU_AM_MSK;
+       reg |= MEG_TO_AM(flash_size >> 20);
+       tim = get_flash_timing ();
+       reg &= ~0xfff;
+       reg |= (tim & 0xfff);
+       memctl->memc_or0 = reg;
+       return 0;
+}
+#endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_NAND)
+
+#include <nand.h>
+#include <linux/mtd/mtd.h>
+
+static u8 hwctl = 0;
+
+static void upmnand_hwcontrol(struct mtd_info *mtdinfo, int cmd)
+{
+       switch (cmd) {
+       case NAND_CTL_SETCLE:
+               hwctl |= 0x1;
+               break;
+       case NAND_CTL_CLRCLE:
+               hwctl &= ~0x1;
+               break;
+
+       case NAND_CTL_SETALE:
+               hwctl |= 0x2;
+               break;
+
+       case NAND_CTL_CLRALE:
+               hwctl &= ~0x2;
+               break;
+       }
+}
+
+static void upmnand_write_byte(struct mtd_info *mtdinfo, u_char byte)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       ulong base = (ulong) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
+
+       if (hwctl & 0x1) {
+               WRITE_NAND_UPM(byte, base, CFG_NAND_UPM_WRITE_CMD_OFS);
+       } else if (hwctl & 0x2) {
+               WRITE_NAND_UPM(byte, base, CFG_NAND_UPM_WRITE_ADDR_OFS);
+       } else {
+               WRITE_NAND(byte, base);
+       }
+}
+
+static u_char upmnand_read_byte(struct mtd_info *mtdinfo)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       ulong base = (ulong) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
+
+       return READ_NAND(base);
+}
+
+static int tqm8272_dev_ready(struct mtd_info *mtdinfo)
+{
+       /* constant delay (see also tR in the datasheet) */
+       udelay(12); \
+       return 1;
+}
+
+#ifndef CONFIG_NAND_SPL
+static void tqm8272_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       unsigned char *base = (unsigned char *) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
+       int     i;
+
+       for (i = 0; i< len; i++)
+               buf[i] = *base;
+}
+
+static void tqm8272_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       unsigned char *base = (unsigned char *) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
+       int     i;
+
+       for (i = 0; i< len; i++)
+               *base = buf[i];
+}
+
+static int tqm8272_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
+{
+       struct nand_chip *this = mtdinfo->priv;
+       unsigned char *base = (unsigned char *) (this->IO_ADDR_W + chipsel * CFG_NAND_CS_DIST);
+       int     i;
+
+       for (i = 0; i < len; i++)
+               if (buf[i] != *base)
+                       return -1;
+       return 0;
+}
+#endif /* #ifndef CONFIG_NAND_SPL */
+
+void board_nand_select_device(struct nand_chip *nand, int chip)
+{
+       chipsel = chip;
+}
+
+int board_nand_init(struct nand_chip *nand)
+{
+       static  int     UpmInit = 0;
+       volatile immap_t * immr = (immap_t *)CFG_IMMR;
+       volatile memctl8260_t *memctl = &immr->im_memctl;
+
+       if (hwinf.nand == 0) return -1;
+
+       /* Setup the UPM */
+       if (UpmInit == 0) {
+               switch (hwinf.busclk_real) {
+               case 100000000:
+                       upmconfig (UPMB, (uint *) upmTable100,
+                          sizeof (upmTable100) / sizeof (uint));
+                       break;
+               case 133333333:
+                       upmconfig (UPMB, (uint *) upmTable133,
+                          sizeof (upmTable133) / sizeof (uint));
+                       break;
+               default:
+                       upmconfig (UPMB, (uint *) upmTable67,
+                          sizeof (upmTable67) / sizeof (uint));
+                       break;
+               }
+               UpmInit = 1;
+       }
+
+       /* Setup the memctrl */
+       memctl->memc_or3 = CFG_NAND_OR;
+       memctl->memc_br3 = CFG_NAND_BR;
+       memctl->memc_mbmr = (MxMR_OP_NORM);
+
+       nand->eccmode = NAND_ECC_SOFT;
+
+       nand->hwcontrol  = upmnand_hwcontrol;
+       nand->read_byte  = upmnand_read_byte;
+       nand->write_byte = upmnand_write_byte;
+       nand->dev_ready  = tqm8272_dev_ready;
+
+#ifndef CONFIG_NAND_SPL
+       nand->write_buf  = tqm8272_write_buf;
+       nand->read_buf   = tqm8272_read_buf;
+       nand->verify_buf = tqm8272_verify_buf;
+#endif
+
+       /*
+        * Select required NAND chip
+        */
+       board_nand_select_device(nand, 0);
+       return 0;
+}
+
+#endif /* CFG_CMD_NAND */
+
+#ifdef CONFIG_PCI
+struct pci_controller hose;
+
+int board_early_init_f (void)
+{
+       volatile immap_t *immap = (immap_t *) CFG_IMMR;
+
+       immap->im_clkrst.car_sccr |= M826X_SCCR_PCI_MODE_EN;
+       return 0;
+}
+
+extern void pci_mpc8250_init(struct pci_controller *);
+
+void pci_init_board(void)
+{
+       pci_mpc8250_init(&hose);
+}
+#endif
diff --git a/board/tqm8272/u-boot.lds b/board/tqm8272/u-boot.lds
new file mode 100644 (file)
index 0000000..05f29c6
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * (C) Copyright 2001
+ * 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
+ */
+
+OUTPUT_ARCH(powerpc)
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = + SIZEOF_HEADERS;
+  .interp : { *(.interp) }
+  .hash          : { *(.hash)          }
+  .dynsym        : { *(.dynsym)                }
+  .dynstr        : { *(.dynstr)                }
+  .rel.text      : { *(.rel.text)              }
+  .rela.text     : { *(.rela.text)     }
+  .rel.data      : { *(.rel.data)              }
+  .rela.data     : { *(.rela.data)     }
+  .rel.rodata    : { *(.rel.rodata)    }
+  .rela.rodata   : { *(.rela.rodata)   }
+  .rel.got       : { *(.rel.got)               }
+  .rela.got      : { *(.rela.got)              }
+  .rel.ctors     : { *(.rel.ctors)     }
+  .rela.ctors    : { *(.rela.ctors)    }
+  .rel.dtors     : { *(.rel.dtors)     }
+  .rela.dtors    : { *(.rela.dtors)    }
+  .rel.bss       : { *(.rel.bss)               }
+  .rela.bss      : { *(.rela.bss)              }
+  .rel.plt       : { *(.rel.plt)               }
+  .rela.plt      : { *(.rela.plt)              }
+  .init          : { *(.init)  }
+  .plt : { *(.plt) }
+  .text      :
+  {
+    cpu/mpc8260/start.o        (.text)
+    *(.text)
+    common/environment.o(.text)
+    *(.fixup)
+    *(.got1)
+    . = ALIGN(16);
+    *(.rodata)
+    *(.rodata1)
+    *(.rodata.str1.4)
+    *(.eh_frame)
+  }
+  .fini      : { *(.fini)    } =0
+  .ctors     : { *(.ctors)   }
+  .dtors     : { *(.dtors)   }
+
+  /* Read-write section, merged into data segment: */
+  . = (. + 0x0FFF) & 0xFFFFF000;
+  _erotext = .;
+  PROVIDE (erotext = .);
+  .reloc   :
+  {
+    *(.got)
+    _GOT2_TABLE_ = .;
+    *(.got2)
+    _FIXUP_TABLE_ = .;
+    *(.fixup)
+  }
+  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
+  __fixup_entries = (. - _FIXUP_TABLE_) >> 2;
+
+  .data    :
+  {
+    *(.data)
+    *(.data1)
+    *(.sdata)
+    *(.sdata2)
+    *(.dynamic)
+    CONSTRUCTORS
+  }
+  _edata  =  .;
+  PROVIDE (edata = .);
+
+  . = .;
+  __u_boot_cmd_start = .;
+  .u_boot_cmd : { *(.u_boot_cmd) }
+  __u_boot_cmd_end = .;
+
+
+  . = .;
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  . = ALIGN(4096);
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(4096);
+  __init_end = .;
+
+  __bss_start = .;
+  .bss       :
+  {
+   *(.sbss) *(.scommon)
+   *(.dynbss)
+   *(.bss)
+   *(COMMON)
+  }
+  _end = . ;
+  PROVIDE (end = .);
+}
index dede996880124cc2053fc86c01a6b66fb36256ae..ace4aa2caed9f437df82d1571827de84b4465304 100644 (file)
@@ -191,16 +191,8 @@ int checkboard (void)
        return 0;
 }
 
-
-int board_early_init_r(void)
+int board_early_init_f(void)
 {
-       /*
-        * Now, when we are in RAM, enable flash write access for the
-        * detection process.  Note that CS_BOOT cannot be cleared when
-        * executing in flash.
-        */
-       *(vu_long *) MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
-
 #ifdef CONFIG_HW_WATCHDOG
        /*
         * Enable and configure the direction (output) of PSC3_9 - watchdog
@@ -210,6 +202,17 @@ int board_early_init_r(void)
        *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC3_9;
        *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC3_9;
 #endif /* CONFIG_HW_WATCHDOG */
+       return 0;
+}
+
+int board_early_init_r(void)
+{
+       /*
+        * Now, when we are in RAM, enable flash write access for the
+        * detection process.  Note that CS_BOOT cannot be cleared when
+        * executing in flash.
+        */
+       *(vu_long *) MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */
 
        /*
         * Enable GPIO_WKUP_7 to "read the status of the actual power
index 5d2cd6585f64a16bcd69d880ef1786bc71876314..a41714351f0e1e13e8446c765b9c31e975f3a10d 100644 (file)
@@ -448,7 +448,7 @@ static void dfc_gpio_init(void)
  * Members with a "?" were not set in the merged testing-NAND branch,
  * so they are not set here either.
  */
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
        unsigned long tCH, tCS, tWH, tWP, tRH, tRP, tRP_high, tR, tWHR, tAR;
 
@@ -576,6 +576,7 @@ void board_nand_init(struct nand_chip *nand)
        nand->cmdfunc = dfc_cmdfunc;
        nand->autooob = &delta_oob;
        nand->badblock_pattern = &delta_bbt_descr;
+       return 0;
 }
 
 #else
index 182e2ab9806bf806bcc84567b745fc79f3bdff58..e68f16f9da022aa805d5e5f79fec0fa7f9f229d2 100644 (file)
@@ -83,7 +83,7 @@ U_BOOT_CMD(
 extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
 U_BOOT_CMD(
-       reset, CFG_MAXARGS, 1,  do_reset,
+       reset, 1, 0,    do_reset,
        "reset   - Perform RESET of the CPU\n",
        NULL
 );
index d3f50f87f352287a1dc1a082f3593697160da5d4..9834ba65b7daa687d60128544a95dbb4136a1c3d 100644 (file)
@@ -248,7 +248,7 @@ int _do_setenv (int flag, int argc, char *argv[])
                                baudrate);
                        udelay(50000);
                        gd->baudrate = baudrate;
-#ifdef CONFIG_PPC
+#if defined(CONFIG_PPC) || defined(CONFIG_MCF52x2)
                        gd->bd->bi_baudrate = baudrate;
 #endif
 
index 19bdeb0f62a20a98ebea3f6c6c59685aa1505922..1d425a73097e90b12c0feab738ff7863563a4951 100644 (file)
@@ -61,6 +61,7 @@
      defined(CONFIG_TRAB)      || \
      defined(CONFIG_PPCHAMELEONEVB) || \
      defined(CONFIG_M5271EVB)  || \
+     defined(CONFIG_IDMR)      || \
      defined(CONFIG_NAND_U_BOOT))      && \
      defined(ENV_CRC) /* Environment embedded in U-Boot .ppcenv section */
 /* XXX - This only works with GNU C */
index f1f4077ebca48fa2aed98c1c0295c7af1e899dd8..7c9a7d2d2bd786939eb6b7db127e1481f54fd897 100644 (file)
@@ -140,11 +140,11 @@ _start:
        move.l  #(CFG_MBAR + 1), %d0            /* set IPSBAR address + valid flag */
        move.l  %d0, 0x40000000
 
-#if defined(CONFIG_M5282)
        /* Initialize RAMBAR1: locate SRAM and validate it */
        move.l  #(CFG_INIT_RAM_ADDR + 0x21), %d0
        movec   %d0, %RAMBAR1
 
+#if defined(CONFIG_M5282)
 #if (TEXT_BASE == CFG_INT_FLASH_BASE)
        /* Setup code in SRAM to initialize FLASHBAR, if start from internal Flash */
 
index 4f23012b729420ba74ce64dc4cb65d24cb73385e..94651dc4a69846731d2e8bae49645e5b2eb63c95 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_GET_CPU_STR_F)
+extern int get_cpu_str_f (char *buf);
+#endif
+
 int checkcpu (void)
 {
        volatile immap_t *immap = (immap_t *) CFG_IMMR;
@@ -81,7 +85,12 @@ int checkcpu (void)
        if ((immr & IMMR_ISB_MSK) != CFG_IMMR)
                return -1;      /* whoops! someone moved the IMMR */
 
+#if defined(CONFIG_GET_CPU_STR_F)
+       get_cpu_str_f (buf);
+       printf ("%s (HiP%d Rev %02x, Mask ", buf, k, rev);
+#else
        printf (CPU_ID_STR " (HiP%d Rev %02x, Mask ", k, rev);
+#endif
 
        /*
         * the bottom 16 bits of the immr are the Part Number and Mask Number
index 640026be5ac5d3c7aeec413de63f2a6ca87c4f9c..7dcc94999dc19ec7410718f1bded93ebbb5a002e 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+extern unsigned long board_get_cpu_clk_f (void);
+#endif
+
 static void config_8260_ioports (volatile immap_t * immr)
 {
        int portnum;
@@ -90,6 +94,7 @@ static void config_8260_ioports (volatile immap_t * immr)
        }
 }
 
+#define SET_VAL_MASK(a, b, mask) ((a & mask) | (b & ~mask))
 /*
  * Breath some life into the CPU...
  *
@@ -101,6 +106,9 @@ void cpu_init_f (volatile immap_t * immr)
 {
 #if !defined(CONFIG_COGENT)            /* done in start.S for the cogent */
        uint sccr;
+#endif
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+       unsigned long cpu_clk;
 #endif
        volatile memctl8260_t *memctl = &immr->im_memctl;
        extern void m8260_cpm_reset (void);
@@ -119,10 +127,27 @@ void cpu_init_f (volatile immap_t * immr)
        immr->im_clkrst.car_rmr = CFG_RMR;
 
        /* BCR - Bus Configuration Register (4-25) */
+#if defined(CFG_BCR_60x) && (CFG_BCR_SINGLE)
+       if (immr->im_siu_conf.sc_bcr & BCR_EBM) {
+               immr->im_siu_conf.sc_bcr = CFG_BCR_60x;
+       } else {
+               immr->im_siu_conf.sc_bcr = CFG_BCR_SINGLE;
+       }
+#else
        immr->im_siu_conf.sc_bcr = CFG_BCR;
+#endif
 
        /* SIUMCR - contains debug pin configuration (4-31) */
+#if defined(CFG_SIUMCR_LOW) && (CFG_SIUMCR_HIGH)
+       cpu_clk = board_get_cpu_clk_f ();
+       if (cpu_clk >= 100000000) {
+               immr->im_siu_conf.sc_siumcr = CFG_SIUMCR_HIGH;
+       } else {
+               immr->im_siu_conf.sc_siumcr = CFG_SIUMCR_LOW;
+       }
+#else
        immr->im_siu_conf.sc_siumcr = CFG_SIUMCR;
+#endif
 
        config_8260_ioports (immr);
 
@@ -157,7 +182,8 @@ void cpu_init_f (volatile immap_t * immr)
 #endif
 
        /* now restrict to preliminary range */
-       memctl->memc_br0 = CFG_BR0_PRELIM;
+       /* the PS came from the HRCW, don´t change it */
+       memctl->memc_br0 = SET_VAL_MASK(memctl->memc_br0 , CFG_BR0_PRELIM, BRx_PS_MSK);
        memctl->memc_or0 = CFG_OR0_PRELIM;
 
 #if defined(CFG_BR1_PRELIM) && defined(CFG_OR1_PRELIM)
index b14fc159be3efb68bca5a912fa765d9529899d3e..1edd6fb8ddd0ba138c462516d145f0ca2acd276a 100644 (file)
@@ -274,7 +274,23 @@ void pci_mpc8250_init (struct pci_controller *hose)
                                  | SIUMCR_CS10PC00
                                  | SIUMCR_BCTLC00
                                  | SIUMCR_MMR11;
-
+#elif defined(CONFIG_TQM8272)
+#if 0
+       immap->im_siu_conf.sc_siumcr = (immap->im_siu_conf.sc_siumcr &
+                                               ~SIUMCR_LBPC11 &
+                                               ~SIUMCR_CS10PC11 &
+                                               ~SIUMCR_LBPC11) |
+                                       SIUMCR_LBPC01 |
+                                       SIUMCR_CS10PC01 |
+                                       SIUMCR_APPC10;
+#else
+#if 0
+       immap->im_siu_conf.sc_siumcr = (immap->im_siu_conf.sc_siumcr |
+                                       SIUMCR_APPC10);
+#else
+       immap->im_siu_conf.sc_siumcr = 0x88000000;
+#endif
+#endif
 #else
        /*
         * Setting required to enable IRQ1-IRQ7 (SIUMCR [DPPC]),
@@ -288,6 +304,7 @@ void pci_mpc8250_init (struct pci_controller *hose)
                                        SIUMCR_CS10PC01 |
                                        SIUMCR_APPC10;
 #endif
+printf("%s siumcr: %x\n", __FUNCTION__, immap->im_siu_conf.sc_siumcr);
 
        /* Make PCI lowest priority */
        /* Each 4 bits is a device bus request  and the MS 4bits
index 360404f0cfd444807fe1a98a5c4d23f72fa948d9..38cd0d9a70fd0ecdcbc874aa25d95957bd405dcc 100644 (file)
 #include <mpc8260.h>
 #include <asm/processor.h>
 
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+extern unsigned long board_get_cpu_clk_f (void);
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 /* ------------------------------------------------------------------------- */
@@ -111,8 +115,12 @@ int get_clocks (void)
 
 #if !defined(CONFIG_8260_CLKIN)
 #error clock measuring not implemented yet - define CONFIG_8260_CLKIN
+#else
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+       clkin = board_get_cpu_clk_f ();
 #else
        clkin = CONFIG_8260_CLKIN;
+#endif
 #endif
 
        sccr = immap->im_clkrst.car_sccr;
index 8ae584f2e1dd4ddcba111a548da0f78fa6869b14..c8caa793d218a690135572104de43e45ea6ce8e4 100644 (file)
@@ -227,8 +227,17 @@ static int smc_init (void)
        sp->smc_smcm = 0;
        sp->smc_smce = 0xff;
 
-#ifdef CFG_SPC1920_SMC1_CLK4 /* clock source is PLD */
-       *((volatile uchar *) CFG_SPC1920_PLD_BASE+6) = 0xff;
+#ifdef CFG_SPC1920_SMC1_CLK4
+       /* clock source is PLD */
+       
+       /* set freq to 19200 Baud */
+       *((volatile uchar *) CFG_SPC1920_PLD_BASE+6) = 0x3;
+       /* configure clk4 as input */
+       im->im_ioport.iop_pdpar |= 0x800;
+       im->im_ioport.iop_pddir &= ~0x800;
+       
+       cp->cp_simode = 0x0000;
+        cp->cp_simode |= 0x7000;
 #else
        /* Set up the baud rate generator */
        smc_setbrg ();
index 9c5c9109b1923b30b3816200c854a0c31c07b170..57a7e8d6e21810eba0ec432108b46f4d1065674f 100644 (file)
@@ -332,24 +332,44 @@ int checkcpu (void)
                strcpy(addstr, "No Security/Kasumi support");
                break;
 
-       case PVR_440SP_RA:
-               puts("SP Rev. A");
+       case PVR_440SP_6_RAB:
+               puts("SP Rev. A/B");
+               strcpy(addstr, "RAID 6 support");
                break;
 
-       case PVR_440SP_RB:
-               puts("SP Rev. B");
+       case PVR_440SP_RAB:
+               puts("SP Rev. A/B");
+               strcpy(addstr, "No RAID 6 support");
+               break;
+
+       case PVR_440SP_6_RC:
+               puts("SP Rev. C");
+               strcpy(addstr, "RAID 6 support");
                break;
 
        case PVR_440SP_RC:
                puts("SP Rev. C");
+               strcpy(addstr, "No RAID 6 support");
+               break;
+
+       case PVR_440SPe_6_RA:
+               puts("SPe Rev. A");
+               strcpy(addstr, "RAID 6 support");
                break;
 
        case PVR_440SPe_RA:
                puts("SPe Rev. A");
+               strcpy(addstr, "No RAID 6 support");
+               break;
+
+       case PVR_440SPe_6_RB:
+               puts("SPe Rev. B");
+               strcpy(addstr, "RAID 6 support");
                break;
 
        case PVR_440SPe_RB:
                puts("SPe Rev. B");
+               strcpy(addstr, "No RAID 6 support");
                break;
 
        default:
@@ -419,7 +439,7 @@ int ppc440spe_revB() {
        unsigned int pvr;
 
        pvr = get_pvr();
-       if (pvr == PVR_440SPe_RB)
+       if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
                return 1;
        else
                return 0;
index 4b746b072eebbc81dd09f925d22541e1bfd0c133..db0559b04d202d3ffd07361fb6e4c9c42206bc2f 100644 (file)
@@ -31,9 +31,6 @@
 DECLARE_GLOBAL_DATA_PTR;
 #endif
 
-
-#define mtebc(reg, data)  mtdcr(ebccfga,reg);mtdcr(ebccfgd,data)
-
 #ifdef CFG_INIT_DCACHE_CS
 # if (CFG_INIT_DCACHE_CS == 0)
 #  define PBxAP pb0ap
index 352173128de102e9c5f951dfc81e74ba281e85b8..b198ff46ceb4a6c50141c0084eeee962e24666e6 100644 (file)
@@ -156,7 +156,7 @@ void board_nand_select_device(struct nand_chip *nand, int chip)
        out32(base + NDFC_CCR, 0x00000000 | (cs << 24));
 }
 
-void board_nand_init(struct nand_chip *nand)
+int board_nand_init(struct nand_chip *nand)
 {
        int cs = (ulong)nand->IO_ADDR_W & 0x00000003;
        ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
@@ -188,6 +188,7 @@ void board_nand_init(struct nand_chip *nand)
         */
        board_nand_select_device(nand, cs);
        out32(base + NDFC_BCFG0 + (cs << 2), 0x80002222);
+       return 0;
 }
 
 #endif
index f06038e99833203d78befb5ffec4d39285d9b415..294b89cb2a20b59f9f3b11cc4fc73768d34b3a3d 100644 (file)
@@ -380,7 +380,7 @@ long int initdram(int board_type)
                mtsdram(mem_b0cr, mb0cf[i].reg);
                mtsdram(mem_tr0, 0x41094012);
                mtsdram(mem_tr1, 0x80800800);   /* SS=T2 SL=STAGE 3 CD=1 CT=0x00*/
-               mtsdram(mem_rtr, 0x7e000000);   /* Interval 15.20µs @ 133MHz PLB*/
+               mtsdram(mem_rtr, 0x04100000);   /* Interval 7.8µs @ 133MHz PLB  */
                mtsdram(mem_cfg1, 0x00000000);  /* Self-refresh exit, disable PM*/
                udelay(400);                    /* Delay 200 usecs (min)        */
 
index 9b10220fc74520e48befc9a4d2b8664f1337494d..2699cce859af61d6d94e1446e3956c051e3561e3 100644 (file)
 #define FLASH_OFFSET_DEVICE_ID2                0x0E
 #define FLASH_OFFSET_DEVICE_ID3                0x0F
 #define FLASH_OFFSET_CFI               0x55
+#define FLASH_OFFSET_CFI_ALT           0x555
 #define FLASH_OFFSET_CFI_RESP          0x10
 #define FLASH_OFFSET_PRIMARY_VENDOR    0x13
 #define FLASH_OFFSET_EXT_QUERY_T_P_ADDR        0x15    /* extended query table primary addr */
@@ -154,6 +155,8 @@ typedef union {
 
 #define NUM_ERASE_REGIONS      4 /* max. number of erase regions */
 
+static uint flash_offset_cfi[2]={FLASH_OFFSET_CFI,FLASH_OFFSET_CFI_ALT};
+
 /* use CFG_MAX_FLASH_BANKS_DETECT if defined */
 #ifdef CFG_MAX_FLASH_BANKS_DETECT
 static ulong bank_base[CFG_MAX_FLASH_BANKS_DETECT] = CFG_FLASH_BANKS_LIST;
@@ -343,7 +346,7 @@ unsigned long flash_init (void)
                if (flash_info[i].flash_id == FLASH_UNKNOWN) {
 #ifndef CFG_FLASH_QUIET_TEST
                        printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
-                               i, flash_info[i].size, flash_info[i].size << 20);
+                               i+1, flash_info[i].size, flash_info[i].size << 20);
 #endif /* CFG_FLASH_QUIET_TEST */
                }
 #ifdef CFG_FLASH_PROTECTION
@@ -1136,6 +1139,7 @@ static void flash_read_jedec_ids (flash_info_t * info)
 */
 static int flash_detect_cfi (flash_info_t * info)
 {
+       int cfi_offset;
        debug ("flash detect cfi\n");
 
        for (info->portwidth = CFG_FLASH_CFI_WIDTH;
@@ -1144,19 +1148,22 @@ static int flash_detect_cfi (flash_info_t * info)
                     info->chipwidth <= info->portwidth;
                     info->chipwidth <<= 1) {
                        flash_write_cmd (info, 0, 0, info->cmd_reset);
-                       flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
-                       if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
-                           && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R')
-                           && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) {
-                               info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE);
-                               debug ("device interface is %d\n",
-                                      info->interface);
-                               debug ("found port %d chip %d ",
-                                      info->portwidth, info->chipwidth);
-                               debug ("port %d bits chip %d bits\n",
-                                      info->portwidth << CFI_FLASH_SHIFT_WIDTH,
-                                      info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
-                               return 1;
+                       for (cfi_offset=0; cfi_offset < sizeof(flash_offset_cfi)/sizeof(uint); cfi_offset++) {
+                               flash_write_cmd (info, 0, flash_offset_cfi[cfi_offset], FLASH_CMD_CFI);
+                               if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
+                                && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R')
+                                && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) {
+                                       info->interface = flash_read_ushort (info, 0, FLASH_OFFSET_INTERFACE);
+                                       info->cfi_offset=flash_offset_cfi[cfi_offset];
+                                       debug ("device interface is %d\n",
+                                               info->interface);
+                                       debug ("found port %d chip %d ",
+                                               info->portwidth, info->chipwidth);
+                                       debug ("port %d bits chip %d bits\n",
+                                               info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+                                               info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+                                       return 1;
+                               }
                        }
                }
        }
@@ -1193,7 +1200,7 @@ ulong flash_get_size (ulong base, int banknum)
                info->vendor = flash_read_ushort (info, 0,
                                        FLASH_OFFSET_PRIMARY_VENDOR);
                flash_read_jedec_ids (info);
-               flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI);
+               flash_write_cmd (info, 0, info->cfi_offset, FLASH_CMD_CFI);
                num_erase_regions = flash_read_uchar (info,
                                        FLASH_OFFSET_NUM_ERASE_REGIONS);
                info->ext_addr = flash_read_ushort (info, 0,
index 3899045a72c7010fc4d325703cce6ad2e3ba18b3..9fef71d62938a5cd3ca5222f0893b8d5fa42edc0 100644 (file)
@@ -39,7 +39,7 @@ static ulong base_address[CFG_MAX_NAND_DEVICE] = CFG_NAND_BASE_LIST;
 
 static const char default_nand_name[] = "nand";
 
-extern void board_nand_init(struct nand_chip *nand);
+extern int board_nand_init(struct nand_chip *nand);
 
 static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
                           ulong base_addr)
@@ -47,13 +47,16 @@ static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
        mtd->priv = nand;
 
        nand->IO_ADDR_R = nand->IO_ADDR_W = (void  __iomem *)base_addr;
-       board_nand_init(nand);
-
-       if (nand_scan(mtd, 1) == 0) {
-               if (!mtd->name)
-                       mtd->name = (char *)default_nand_name;
-       } else
+       if (board_nand_init(nand) == 0) {
+               if (nand_scan(mtd, 1) == 0) {
+                       if (!mtd->name)
+                               mtd->name = (char *)default_nand_name;
+               } else
+                       mtd->name = NULL;
+       } else {
                mtd->name = NULL;
+               mtd->size = 0;
+       }
 
 }
 
index 7fdf57b1779163975b1fb4e89293887eb7d0c927..8495829900c4a179642d80ddadbbe04ad748fad7 100644 (file)
@@ -2338,7 +2338,7 @@ int nand_scan (struct mtd_info *mtd, int maxchips)
                        mtd->oobblock = 1024 << (extid & 0x3);
                        extid >>= 2;
                        /* Calc oobsize */
-                       mtd->oobsize = (8 << (extid & 0x03)) * (mtd->oobblock / 512);
+                       mtd->oobsize = (8 << (extid & 0x01)) * (mtd->oobblock / 512);
                        extid >>= 2;
                        /* Calc blocksize. Blocksize is multiples of 64KiB */
                        mtd->erasesize = (64 * 1024)  << (extid & 0x03);
index 6619686876c522761d5bb93cf989b4e456ceb71c..f102600038bf836938eafeb47c561b3d016076ee 100644 (file)
 #define PVR_440GX_RC   0x51B21892
 #define PVR_440GX_RF   0x51B21894
 #define PVR_405EP_RB   0x51210950
-#define PVR_440SP_RA   0x53221850
-#define PVR_440SP_RB   0x53221891
-#define PVR_440SP_RC   0x53221892
-#define PVR_440SPe_RA  0x53421890
-#define PVR_440SPe_RB  0x53421891
+#define PVR_440SP_6_RAB        0x53221850 /* 440SP rev A&B with RAID 6 support enabled */
+#define PVR_440SP_RAB  0x53321850 /* 440SP rev A&B without RAID 6 support      */
+#define PVR_440SP_6_RC 0x53221891 /* 440SP rev C with RAID 6 support enabled   */
+#define PVR_440SP_RC   0x53321891 /* 440SP rev C without RAID 6 support        */
+#define PVR_440SPe_6_RA        0x53421890 /* 440SPe rev A with RAID 6 support enabled  */
+#define PVR_440SPe_RA  0x53521890 /* 440SPe rev A without RAID 6 support       */
+#define PVR_440SPe_6_RB        0x53421891 /* 440SPe rev B with RAID 6 support enabled  */
+#define PVR_440SPe_RB  0x53521891 /* 440SPe rev B without RAID 6 support       */
 #define PVR_601                0x00010000
 #define PVR_602                0x00050000
 #define PVR_603                0x00030000
index 08674ca49f5caa3ed9d43c711fca1d56d1b46297..7069b35ad60ad7864f11d375bf27a0793f1790c1 100644 (file)
                "protect on FC000000 +${filesize}\0"
 #endif
 
+#ifndef CONFIG_CAM5200
+#define CUSTOM_ENV_SETTINGS                                            \
+       "bootfile=/tftpboot/tqm5200/uImage\0"                           \
+       "u-boot=/tftpboot/tqm5200/u-boot.bin\0"
+#else
+#define CUSTOM_ENV_SETTINGS                                            \
+       "bootfile=cam5200/uImage\0"                                     \
+       "u-boot=cam5200/u-boot.bin\0"                                   \
+       "setup=tftp 200000 cam5200/setup.img; autoscr 200000\0"
+#endif
+
 #define CONFIG_EXTRA_ENV_SETTINGS                                      \
        "netdev=eth0\0"                                                 \
        "rootpath=/opt/eldk/ppc_6xx\0"                                  \
                "bootm ${kernel_addr}\0"                                \
        "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addcons;"    \
                "bootm\0"                                               \
-       "bootfile=/tftpboot/tqm5200/uImage\0"                           \
-       "u-boot=/tftpboot/tqm5200/u-boot.bin\0"                         \
+       CUSTOM_ENV_SETTINGS                                             \
        "load=tftp 200000 ${u-boot}\0"                                  \
        ENV_UPDT                                                        \
        ""
  */
 #define CFG_FLASH_BASE         0xFC000000
 
-#ifndef CONFIG_CAM5200
-/* use CFI flash driver */
-#define CFG_FLASH_CFI          1       /* Flash is CFI conformant */
-#define CFG_FLASH_CFI_DRIVER   1       /* Use the common driver */
-#define CFG_FLASH_BANKS_LIST   { CFG_BOOTCS_START }
-#define CFG_MAX_FLASH_BANKS    1       /* max num of flash banks
-                                          (= chip selects) */
-#define CFG_MAX_FLASH_SECT     512     /* max num of sects on one chip */
-#else /* CONFIG_CAM5200 */
+#if defined(CONFIG_CAM5200) && defined(CONFIG_CAM5200_NIOSFLASH)
 #define CFG_MAX_FLASH_BANKS    2       /* max num of flash banks
                                           (= chip selects) */
 #define CFG_FLASH_WORD_SIZE    unsigned int /* main flash device with */
 #define CFG_FLASH_ADDR1                0x2AA
 #define CFG_FLASH_2ND_16BIT_DEV        1       /* NIOS flash is a 16bit device */
 #define CFG_MAX_FLASH_SECT     128
-#endif /* ifndef CONFIG_CAM5200 */
+#else
+/* use CFI flash driver */
+#define CFG_FLASH_CFI          1       /* Flash is CFI conformant */
+#define CFG_FLASH_CFI_DRIVER   1       /* Use the common driver */
+#define CFG_FLASH_BANKS_LIST   { CFG_BOOTCS_START }
+#define CFG_MAX_FLASH_BANKS    1       /* max num of flash banks
+                                          (= chip selects) */
+#define CFG_MAX_FLASH_SECT     512     /* max num of sects on one chip */
+#endif
 
 #define CFG_FLASH_EMPTY_INFO
 #define CFG_FLASH_SIZE         0x04000000 /* 64 MByte */
diff --git a/include/configs/TQM8272.h b/include/configs/TQM8272.h
new file mode 100644 (file)
index 0000000..925bf34
--- /dev/null
@@ -0,0 +1,754 @@
+/*
+ * (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
+ */
+
+/*
+ * board/config.h - configuration options, board specific
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+
+#define CONFIG_MPC8260         1       /* This is a MPC8260 CPU                */
+#define CONFIG_MPC8272_FAMILY   1
+#define CONFIG_TQM8272         1
+
+#define        CONFIG_GET_CPU_STR_F    1       /* Get the CPU ID STR */
+#define CONFIG_BOARD_GET_CPU_CLK_F     1 /* Get the CLKIN from board fct */
+
+#define        STK82xx_150             1       /* on a STK82xx.150 */
+
+#define CONFIG_CPM2            1       /* Has a CPM2 */
+
+#define CONFIG_82xx_CONS_SMC1  1       /* console on SMC1              */
+
+#define CONFIG_BOOTDELAY       5       /* autoboot after 5 seconds     */
+
+#define CONFIG_BOARD_EARLY_INIT_R      1
+
+#if defined(CONFIG_CONS_NONE) || defined(CONFIG_CONS_USE_EXTC)
+#define CONFIG_BAUDRATE                230400
+#else
+#define CONFIG_BAUDRATE                115200
+#endif
+
+#define CONFIG_PREBOOT "echo;echo Type \"run flash_nfs\" to mount root filesystem over NFS;echo"
+
+#undef CONFIG_BOOTARGS
+
+#define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "netdev=eth0\0"                                                 \
+       "consdev=ttyCPM0\0"                                             \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
+       "hostname=tqm8272\0"                                            \
+       "addip=setenv bootargs ${bootargs} "                            \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
+               ":${hostname}:${netdev}:off panic=1\0"                  \
+       "addcons=setenv bootargs ${bootargs} "                          \
+               "console=$(consdev),$(baudrate)\0"                      \
+       "flash_nfs=run nfsargs addip addcons;"                          \
+               "bootm ${kernel_addr}\0"                                \
+       "flash_self=run ramargs addip addcons;"                         \
+               "bootm ${kernel_addr} ${ramdisk_addr}\0"                \
+       "net_nfs=tftp 300000 ${bootfile};"                              \
+               "run nfsargs addip addcons;bootm\0"                     \
+       "rootpath=/opt/eldk/ppc_82xx\0"                                 \
+       "bootfile=/tftpboot/tqm8272/uImage\0"                           \
+       "kernel_addr=40080000\0"                                        \
+       "ramdisk_addr=40100000\0"                                       \
+       "load=tftp 300000 /tftpboot/tqm8272/u-boot.bin\0"               \
+       "update=protect off 40000000 4003ffff;era 40000000 4003ffff;"   \
+               "cp.b 300000 40000000 40000;"                           \
+               "setenv filesize;saveenv\0"                             \
+       "cphwib=cp.b 4003fc00 33fc00 400\0"                             \
+       "upd=run load;run cphwib;run update\0"                          \
+       ""
+#define CONFIG_BOOTCOMMAND     "run flash_self"
+
+#define CONFIG_I2C     1
+
+#if CONFIG_I2C
+/* enable I2C and select the hardware/software driver */
+#undef  CONFIG_HARD_I2C                        /* I2C with hardware support    */
+#define CONFIG_SOFT_I2C                1       /* I2C bit-banged               */
+#define ADD_CMD_I2C            CFG_CMD_I2C     | \
+                               CFG_CMD_DATE    |\
+                               CFG_CMD_DTT     |\
+                               CFG_CMD_EEPROM
+#define CFG_I2C_SPEED          400000  /* I2C speed and slave address  */
+#define CFG_I2C_SLAVE          0x7F
+
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define I2C_PORT       3               /* Port A=0, B=1, C=2, D=3 */
+#define I2C_ACTIVE     (iop->pdir |=  0x00010000)
+#define I2C_TRISTATE   (iop->pdir &= ~0x00010000)
+#define I2C_READ       ((iop->pdat & 0x00010000) != 0)
+#define I2C_SDA(bit)   if(bit) iop->pdat |=  0x00010000; \
+                       else    iop->pdat &= ~0x00010000
+#define I2C_SCL(bit)   if(bit) iop->pdat |=  0x00020000; \
+                       else    iop->pdat &= ~0x00020000
+#define I2C_DELAY      udelay(5)       /* 1/4 I2C clock duration */
+
+#define CONFIG_I2C_X
+
+/* EEPROM */
+#define CFG_I2C_EEPROM_ADDR_LEN 2
+#define CFG_EEPROM_PAGE_WRITE_BITS     4
+#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 10      /* and takes up to 10 msec */
+#define CFG_EEPROM_PAGE_WRITE_ENABLE   /* necessary for the LM75 chip */
+#define CFG_I2C_MULTI_EEPROMS          1       /* more than one eeprom */
+
+/* I2C RTC */
+#define CONFIG_RTC_DS1337              /* Use ds1337 rtc via i2c       */
+#define CFG_I2C_RTC_ADDR       0x68    /* at address 0x68              */
+
+/* I2C SYSMON (LM75) */
+#define CONFIG_DTT_LM75                1               /* ON Semi's LM75       */
+#define CONFIG_DTT_SENSORS     {0}             /* Sensor addresses     */
+#define CFG_DTT_MAX_TEMP       70
+#define CFG_DTT_LOW_TEMP       -30
+#define CFG_DTT_HYSTERESIS     3
+
+#else
+#undef CONFIG_HARD_I2C
+#undef CONFIG_SOFT_I2C
+#define ADD_CMD_I2C            0
+#endif
+
+/*
+ * select serial console configuration
+ *
+ * if either CONFIG_CONS_ON_SMC or CONFIG_CONS_ON_SCC is selected, then
+ * CONFIG_CONS_INDEX must be set to the channel number (1-2 for SMC, 1-4
+ * for SCC).
+ *
+ * if CONFIG_CONS_NONE is defined, then the serial console routines must
+ * defined elsewhere (for example, on the cogent platform, there are serial
+ * ports on the motherboard which are used for the serial console - see
+ * cogent/cma101/serial.[ch]).
+ */
+#define CONFIG_CONS_ON_SMC             /* define if console on SMC */
+#undef  CONFIG_CONS_ON_SCC             /* define if console on SCC */
+#undef  CONFIG_CONS_NONE               /* define if console on something else*/
+#ifdef CONFIG_82xx_CONS_SMC1
+#define CONFIG_CONS_INDEX      1       /* which serial channel for console */
+#endif
+#ifdef CONFIG_82xx_CONS_SMC2
+#define CONFIG_CONS_INDEX      2       /* which serial channel for console */
+#endif
+
+#undef  CONFIG_CONS_USE_EXTC           /* SMC/SCC use ext clock not brg_clk */
+#define CONFIG_CONS_EXTC_RATE  3686400 /* SMC/SCC ext clk rate in Hz */
+#define CONFIG_CONS_EXTC_PINSEL        0       /* pin select 0=CLK3/CLK9 */
+
+/*
+ * select ethernet configuration
+ *
+ * if either CONFIG_ETHER_ON_SCC or CONFIG_ETHER_ON_FCC is selected, then
+ * CONFIG_ETHER_INDEX must be set to the channel number (1-4 for SCC, 1-3
+ * for FCC)
+ *
+ * if CONFIG_ETHER_NONE is defined, then either the ethernet routines must be
+ * defined elsewhere (as for the console), or CFG_CMD_NET must be removed
+ * from CONFIG_COMMANDS to remove support for networking.
+ *
+ * (On TQM8272 either SCC1 or FCC2 may be chosen: SCC1 is hardwired to the
+ * X.29 connector, and FCC2 is hardwired to the X.1 connector)
+ */
+#define CFG_FCC_ETHERNET
+
+#if defined(CFG_FCC_ETHERNET)
+#undef CONFIG_ETHER_ON_SCC             /* define if ether on SCC       */
+#define        CONFIG_ETHER_ON_FCC             /* define if ether on FCC       */
+#undef CONFIG_ETHER_NONE               /* define if ether on something else */
+#define        CONFIG_ETHER_INDEX    2         /* which SCC/FCC channel for ethernet */
+#else
+#define        CONFIG_ETHER_ON_SCC             /* define if ether on SCC       */
+#undef CONFIG_ETHER_ON_FCC             /* define if ether on FCC       */
+#undef CONFIG_ETHER_NONE               /* define if ether on something else */
+#define        CONFIG_ETHER_INDEX    1         /* which SCC/FCC channel for ethernet */
+#endif
+
+#if defined(CONFIG_ETHER_ON_SCC) && (CONFIG_ETHER_INDEX == 1)
+
+/*
+ *  - RX clk is CLK11
+ *  - TX clk is CLK12
+ */
+# define CFG_CMXSCR_VALUE      (CMXSCR_RS1CS_CLK11 | CMXSCR_TS1CS_CLK12)
+
+#elif defined(CONFIG_ETHER_ON_FCC) && (CONFIG_ETHER_INDEX == 2)
+
+/*
+ * - Rx-CLK is CLK13
+ * - Tx-CLK is CLK14
+ * - RAM for BD/Buffers is on the 60x Bus (see 28-13)
+ * - Enable Full Duplex in FSMR
+ */
+# define CFG_CMXFCR_MASK       (CMXFCR_FC2|CMXFCR_RF2CS_MSK|CMXFCR_TF2CS_MSK)
+# define CFG_CMXFCR_VALUE      (CMXFCR_RF2CS_CLK13|CMXFCR_TF2CS_CLK14)
+# define CFG_CPMFCR_RAMTYPE    0
+# define CFG_FCC_PSMR          (FCC_PSMR_FDE|FCC_PSMR_LPB)
+
+#endif /* CONFIG_ETHER_ON_FCC, CONFIG_ETHER_INDEX */
+
+#define CONFIG_MII                     /* MII PHY management           */
+#define CONFIG_BITBANGMII              /* bit-bang MII PHY management  */
+/*
+ * GPIO pins used for bit-banged MII communications
+ */
+#define MDIO_PORT      2               /* Port C */
+
+#if STK82xx_150
+#define CFG_MDIO_PIN   0x00008000      /* PC16 */
+#define CFG_MDC_PIN    0x00004000      /* PC17 */
+#endif
+
+#if STK82xx_100
+#define CFG_MDIO_PIN   0x00000002      /* PC30 */
+#define CFG_MDC_PIN    0x00000001      /* PC31 */
+#endif
+
+#if 1
+#define MDIO_ACTIVE    (iop->pdir |=  CFG_MDIO_PIN)
+#define MDIO_TRISTATE  (iop->pdir &= ~CFG_MDIO_PIN)
+#define MDIO_READ      ((iop->pdat &  CFG_MDIO_PIN) != 0)
+
+#define MDIO(bit)      if(bit) iop->pdat |=  CFG_MDIO_PIN; \
+                       else    iop->pdat &= ~CFG_MDIO_PIN
+
+#define MDC(bit)       if(bit) iop->pdat |=  CFG_MDC_PIN; \
+                       else    iop->pdat &= ~CFG_MDC_PIN
+#else
+#define MDIO_ACTIVE    ({unsigned long tmp; tmp = iop->pdir; tmp |=  CFG_MDIO_PIN; iop->pdir = tmp;})
+#define MDIO_TRISTATE  ({unsigned long tmp; tmp = iop->pdir; tmp &= ~CFG_MDIO_PIN; iop->pdir = tmp;})
+#define MDIO_READ      ((iop->pdat &  CFG_MDIO_PIN) != 0)
+
+#define MDIO(bit)      if(bit) {unsigned long tmp; tmp = iop->pdat; tmp |=  CFG_MDIO_PIN; iop->pdat = tmp;}\
+                       else    {unsigned long tmp; tmp = iop->pdat; tmp &= ~CFG_MDIO_PIN; iop->pdat = tmp;}
+
+#define MDC(bit)       if(bit) {unsigned long tmp; tmp = iop->pdat; tmp |=  CFG_MDC_PIN; iop->pdat = tmp;}\
+                       else    {unsigned long tmp; tmp = iop->pdat; tmp &= ~CFG_MDC_PIN; iop->pdat = tmp;}
+#endif
+
+#define MIIDELAY       udelay(1)
+
+
+/* system clock rate (CLKIN) - equal to the 60x and local bus speed */
+#define CONFIG_8260_CLKIN      66666666        /* in Hz */
+
+#define CONFIG_LOADS_ECHO      1       /* echo on for serial download  */
+#undef CFG_LOADS_BAUD_CHANGE           /* don't allow baudrate change  */
+
+#undef CONFIG_WATCHDOG                 /* watchdog disabled            */
+
+#define        CONFIG_TIMESTAMP                /* Print image info with timestamp */
+
+#define CONFIG_BOOTP_MASK      (CONFIG_BOOTP_DEFAULT|CONFIG_BOOTP_BOOTFILESIZE)
+
+#define CONFIG_COMMANDS               (CONFIG_CMD_DFL  | \
+                               CFG_CMD_NAND    | \
+                               CFG_CMD_DHCP    | \
+                               CFG_CMD_PING    | \
+                               ADD_CMD_I2C     | \
+                               CFG_CMD_NFS     | \
+                               CFG_CMD_MII     | \
+                               CFG_CMD_PCI     | \
+                               CFG_CMD_SNTP    )
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+/*
+ * Miscellaneous configurable options
+ */
+#define        CFG_LONGHELP                    /* undef to save memory         */
+#define        CFG_PROMPT      "=> "           /* Monitor Command Prompt       */
+
+#if 0
+#define CONFIG_CMDLINE_EDITING 1       /* add command line history     */
+#define CFG_HUSH_PARSER                1       /* Use the HUSH parser          */
+#ifdef CFG_HUSH_PARSER
+#define        CFG_PROMPT_HUSH_PS2     "> "
+#endif
+#endif
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define        CFG_CBSIZE      1024            /* Console I/O Buffer Size      */
+#else
+#define        CFG_CBSIZE      256             /* Console I/O Buffer Size      */
+#endif
+#define        CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* 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      0x0400000       /* memtest works on     */
+#define CFG_MEMTEST_END        0x0C00000       /* 4 ... 12 MB in DRAM  */
+
+#define        CFG_LOAD_ADDR   0x300000        /* default load address */
+
+#define        CFG_HZ          1000            /* decrementer freq: 1 ms ticks */
+
+#define CFG_BAUDRATE_TABLE     { 9600, 19200, 38400, 57600, 115200 }
+
+#define        CFG_RESET_ADDRESS 0x40000104    /* "bad" address                */
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CFG_BOOTMAPSZ        (8 << 20)       /* Initial Memory map for Linux */
+
+/*-----------------------------------------------------------------------
+ * CAN stuff
+ *-----------------------------------------------------------------------
+ */
+#define CFG_CAN_BASE   0x51000000
+#define        CFG_CAN_SIZE    1
+#define CFG_CAN_BR     ((CFG_CAN_BASE & BRx_BA_MSK)    |\
+                        BRx_PS_8                       |\
+                        BRx_MS_UPMC                    |\
+                        BRx_V)
+
+#define CFG_CAN_OR     (MEG_TO_AM(CFG_CAN_SIZE)        |\
+                        ORxU_BI)
+
+
+/* What should the base address of the main FLASH be and how big is
+ * it (in MBytes)? This must contain TEXT_BASE from board/tqm8272/config.mk
+ * The main FLASH is whichever is connected to *CS0.
+ */
+#define CFG_FLASH0_BASE 0x40000000
+#define CFG_FLASH0_SIZE 32     /* 32 MB */
+
+/* Flash bank size (for preliminary settings)
+ */
+#define CFG_FLASH_SIZE CFG_FLASH0_SIZE
+
+/*-----------------------------------------------------------------------
+ * FLASH organization
+ */
+#define CFG_MAX_FLASH_BANKS    1       /* max num of memory banks      */
+#define CFG_MAX_FLASH_SECT     128     /* max num of sects on one chip */
+
+#define CFG_FLASH_CFI                          /* flash is CFI compat. */
+#define CFG_FLASH_CFI_DRIVER                   /* Use common CFI driver*/
+#define CFG_FLASH_EMPTY_INFO           /* print 'E' for empty sector   */
+#define CFG_FLASH_QUIET_TEST   1       /* don't warn upon unknown flash*/
+
+#define CFG_FLASH_ERASE_TOUT   240000  /* Flash Erase Timeout (in ms)  */
+#define CFG_FLASH_WRITE_TOUT   500     /* Flash Write Timeout (in ms)  */
+
+#define CFG_UPDATE_FLASH_SIZE
+
+#define CFG_ENV_IS_IN_FLASH    1
+#define CFG_ENV_ADDR           (CFG_FLASH_BASE + 0x40000)
+#define CFG_ENV_SIZE           0x20000
+#define CFG_ENV_SECT_SIZE      0x20000
+#define CFG_ENV_ADDR_REDUND    (CFG_ENV_ADDR + CFG_ENV_SIZE)
+#define CFG_ENV_SIZE_REDUND    0x20000
+
+/* Where is the Hardwareinformation Block (from Monitor Sources) */
+#define MON_RES_LENGTH         (0x0003FC00)
+#define HWIB_INFO_START_ADDR    (CFG_FLASH_BASE + MON_RES_LENGTH)
+#define HWIB_INFO_LEN           512
+#define CIB_INFO_START_ADDR     (CFG_FLASH_BASE + MON_RES_LENGTH + HWIB_INFO_LEN)
+#define CIB_INFO_LEN            512
+
+#define CFG_HWINFO_OFFSET      0x3fc00 /* offset of HW Info block */
+#define CFG_HWINFO_SIZE                0x00000060      /* size   of HW Info block */
+#define CFG_HWINFO_MAGIC       0x54514D38      /* 'TQM8' */
+
+/*-----------------------------------------------------------------------
+ * NAND-FLASH stuff
+ *-----------------------------------------------------------------------
+ */
+#if (CONFIG_COMMANDS & CFG_CMD_NAND)
+
+#define CFG_NAND_CS_DIST               0x80
+#define CFG_NAND_UPM_WRITE_CMD_OFS     0x20
+#define CFG_NAND_UPM_WRITE_ADDR_OFS    0x40
+
+#define CFG_NAND_BR    ((CFG_NAND0_BASE & BRx_BA_MSK)  |\
+                        BRx_PS_8                       |\
+                        BRx_MS_UPMB                    |\
+                        BRx_V)
+
+#define CFG_NAND_OR    (MEG_TO_AM(CFG_NAND_SIZE)       |\
+                        ORxU_BI                        |\
+                        ORxU_EHTR_8IDLE)
+
+#define CFG_NAND_SIZE  1
+#define CFG_NAND0_BASE 0x50000000
+#define CFG_NAND1_BASE (CFG_NAND0_BASE + CFG_NAND_CS_DIST)
+#define CFG_NAND2_BASE (CFG_NAND1_BASE + CFG_NAND_CS_DIST)
+#define CFG_NAND3_BASE (CFG_NAND2_BASE + CFG_NAND_CS_DIST)
+
+#define CFG_MAX_NAND_DEVICE     4       /* Max number of NAND devices           */
+#define NAND_MAX_CHIPS 1
+
+#define CFG_NAND_BASE_LIST { CFG_NAND0_BASE, \
+                            CFG_NAND1_BASE, \
+                            CFG_NAND2_BASE, \
+                            CFG_NAND3_BASE, \
+                          }
+
+#define WRITE_NAND(d, adr) do{ *(volatile __u8 *)((unsigned long)(adr)) = (__u8)d; } while(0)
+#define READ_NAND(adr) ((volatile unsigned char)(*(volatile __u8 *)(unsigned long)(adr)))
+#define WRITE_NAND_UPM(d, adr, off) do \
+{ \
+       volatile unsigned char *addr = (unsigned char *) (adr + off); \
+       WRITE_NAND(d, addr); \
+} while(0)
+
+#endif /* CFG_CMD_NAND */
+
+#define        CONFIG_PCI
+#ifdef CONFIG_PCI
+#define CONFIG_BOARD_EARLY_INIT_F 1    /* Call board_early_init_f      */
+#define CONFIG_PCI_PNP
+#define CONFIG_EEPRO100
+#define CFG_RX_ETH_BUFFER      8               /* use 8 rx buffer on eepro100  */
+#define CONFIG_PCI_SCAN_SHOW
+#endif
+
+/*-----------------------------------------------------------------------
+ * Hard Reset Configuration Words
+ *
+ * if you change bits in the HRCW, you must also change the CFG_*
+ * defines for the various registers affected by the HRCW e.g. changing
+ * HRCW_DPPCxx requires you to also change CFG_SIUMCR.
+ */
+#if 0
+#define        __HRCW__ALL__           (HRCW_CIP | HRCW_ISB111 | HRCW_BMS)
+
+#  define CFG_HRCW_MASTER      (__HRCW__ALL__ | HRCW_MODCK_H0111)
+#else
+#define CFG_HRCW_MASTER        (HRCW_BPS11 | HRCW_ISB111 | HRCW_BMS | HRCW_MODCK_H0111)
+#endif
+
+/* no slaves so just fill with zeros */
+#define CFG_HRCW_SLAVE1                0
+#define CFG_HRCW_SLAVE2                0
+#define CFG_HRCW_SLAVE3                0
+#define CFG_HRCW_SLAVE4                0
+#define CFG_HRCW_SLAVE5                0
+#define CFG_HRCW_SLAVE6                0
+#define CFG_HRCW_SLAVE7                0
+
+/*-----------------------------------------------------------------------
+ * Internal Memory Mapped Register
+ */
+#define CFG_IMMR               0xFFF00000
+
+/*-----------------------------------------------------------------------
+ * Definitions for initial stack pointer and data area (in DPRAM)
+ */
+#define CFG_INIT_RAM_ADDR      CFG_IMMR
+#define CFG_INIT_RAM_END       0x2000  /* End of used area in DPRAM    */
+#define CFG_GBL_DATA_SIZE      128 /* size in bytes reserved for initial data*/
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+/*-----------------------------------------------------------------------
+ * Start addresses for the final memory configuration
+ * (Set up by the startup code)
+ * Please note that CFG_SDRAM_BASE _must_ start at 0
+ */
+#define CFG_SDRAM_BASE         0x00000000
+#define CFG_FLASH_BASE         CFG_FLASH0_BASE
+#define CFG_MONITOR_BASE       TEXT_BASE
+#define CFG_MONITOR_LEN                (192 << 10)     /* Reserve 192 kB for Monitor */
+#define CFG_MALLOC_LEN         (128 << 10)     /* Reserve 128 kB for malloc()*/
+
+/*
+ * Internal Definitions
+ *
+ * Boot Flags
+ */
+#define BOOTFLAG_COLD          0x01    /* Normal Power-On: Boot from FLASH*/
+#define BOOTFLAG_WARM          0x02    /* Software reboot                 */
+
+/*-----------------------------------------------------------------------
+ * Cache Configuration
+ */
+#define CFG_CACHELINE_SIZE      32      /* For MPC8260 CPU              */
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+# define CFG_CACHELINE_SHIFT   5       /* log base 2 of the above value */
+#endif
+
+/*-----------------------------------------------------------------------
+ * HIDx - Hardware Implementation-dependent Registers                    2-11
+ *-----------------------------------------------------------------------
+ * HID0 also contains cache control - initially enable both caches and
+ * invalidate contents, then the final state leaves only the instruction
+ * cache enabled. Note that Power-On and Hard reset invalidate the caches,
+ * but Soft reset does not.
+ *
+ * HID1 has only read-only information - nothing to set.
+ */
+#define CFG_HID0_INIT   (HID0_ICE|HID0_DCE|HID0_ICFI|HID0_DCI|\
+                               HID0_IFEM|HID0_ABE)
+#define CFG_HID0_FINAL  (HID0_IFEM|HID0_ABE)
+#define CFG_HID2        0
+
+/*-----------------------------------------------------------------------
+ * RMR - Reset Mode Register                                     5-5
+ *-----------------------------------------------------------------------
+ * turn on Checkstop Reset Enable
+ */
+#define CFG_RMR         RMR_CSRE
+
+/*-----------------------------------------------------------------------
+ * BCR - Bus Configuration                                       4-25
+ *-----------------------------------------------------------------------
+ */
+#define CFG_BCR_60x         (BCR_EBM|BCR_NPQM0|BCR_NPQM2)      /* 60x mode  */
+#define BCR_APD01      0x10000000
+#define CFG_BCR_SINGLE         (BCR_APD01|BCR_ETM)     /* 8260 mode */
+
+/*-----------------------------------------------------------------------
+ * SIUMCR - SIU Module Configuration                             4-31
+ *-----------------------------------------------------------------------
+ */
+#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
+#define CFG_SIUMCR_LOW         (SIUMCR_DPPC00)
+#define CFG_SIUMCR_HIGH                (SIUMCR_DPPC00 | SIUMCR_ABE)
+#else
+#define CFG_SIUMCR             (SIUMCR_DPPC00)
+#endif
+
+/*-----------------------------------------------------------------------
+ * SYPCR - System Protection Control                             4-35
+ * SYPCR can only be written once after reset!
+ *-----------------------------------------------------------------------
+ * Watchdog & Bus Monitor Timer max, 60x Bus Monitor enable
+ */
+#if defined(CONFIG_WATCHDOG)
+#define CFG_SYPCR       (SYPCR_SWTC|SYPCR_BMT|SYPCR_PBME|SYPCR_LBME|\
+                        SYPCR_SWRI|SYPCR_SWP|SYPCR_SWE)
+#else
+#define CFG_SYPCR       (SYPCR_SWTC|SYPCR_BMT|SYPCR_PBME|SYPCR_LBME|\
+                        SYPCR_SWRI|SYPCR_SWP)
+#endif /* CONFIG_WATCHDOG */
+
+/*-----------------------------------------------------------------------
+ * TMCNTSC - Time Counter Status and Control                     4-40
+ *-----------------------------------------------------------------------
+ * Clear once per Second and Alarm Interrupt Status, Set 32KHz timersclk,
+ * and enable Time Counter
+ */
+#define CFG_TMCNTSC     (TMCNTSC_SEC|TMCNTSC_ALR|TMCNTSC_TCF|TMCNTSC_TCE)
+
+/*-----------------------------------------------------------------------
+ * PISCR - Periodic Interrupt Status and Control                 4-42
+ *-----------------------------------------------------------------------
+ * Clear Periodic Interrupt Status, Set 32KHz timersclk, and enable
+ * Periodic timer
+ */
+#define CFG_PISCR       (PISCR_PS|PISCR_PTF|PISCR_PTE)
+
+/*-----------------------------------------------------------------------
+ * SCCR - System Clock Control                                   9-8
+ *-----------------------------------------------------------------------
+ * Ensure DFBRG is Divide by 16
+ */
+#define CFG_SCCR        SCCR_DFBRG01
+
+/*-----------------------------------------------------------------------
+ * RCCR - RISC Controller Configuration                         13-7
+ *-----------------------------------------------------------------------
+ */
+#define CFG_RCCR        0
+
+/*
+ * Init Memory Controller:
+ *
+ * Bank Bus     Machine PortSz  Device
+ * ---- ---     ------- ------  ------
+ *  0   60x     GPCM    32 bit  FLASH
+ *  1   60x     SDRAM   64 bit  SDRAM
+ *  2   60x    UPMB     8 bit  NAND
+ *  3   60x    UPMC     8 bit  CAN
+ *
+ */
+
+/* Initialize SDRAM
+        */
+#undef CFG_INIT_LOCAL_SDRAM            /* No SDRAM on Local Bus */
+
+#define SDRAM_MAX_SIZE 0x20000000      /* max. 512 MB          */
+
+/* Minimum mask to separate preliminary
+ * address ranges for CS[0:2]
+ */
+#define CFG_GLOBAL_SDRAM_LIMIT (512<<20)       /* less than 512 MB */
+
+#define CFG_MPTPR       0x4000
+
+/*-----------------------------------------------------------------------------
+ * Address for Mode Register Set (MRS) command
+ *-----------------------------------------------------------------------------
+ * In fact, the address is rather configuration data presented to the SDRAM on
+ * its address lines. Because the address lines may be mux'ed externally either
+ * for 8 column or 9 column devices, some bits appear twice in the 8260's
+ * address:
+ *
+ * |   (RFU)   |   (RFU)   | WBL |    TM    |     CL    |  BT | Burst Length |
+ * | BA1   BA0 | A12 : A10 |  A9 |  A8   A7 |  A6 : A4  |  A3 |   A2 :  A0   |
+ *  8 columns mux'ing:     |  A9 | A10  A21 | A22 : A24 | A25 |  A26 : A28   |
+ *  9 columns mux'ing:     |  A8 | A20  A21 | A22 : A24 | A25 |  A26 : A28   |
+ *  Settings:              |  0  |  0    0  |  0  1  0  |  0  |   0  1  0    |
+ *-----------------------------------------------------------------------------
+ */
+#define CFG_MRS_OFFS   0x00000110
+
+/* Bank 0 - FLASH
+ */
+#define CFG_BR0_PRELIM  ((CFG_FLASH_BASE & BRx_BA_MSK)  |\
+                        BRx_PS_32                      |\
+                        BRx_MS_GPCM_P                  |\
+                        BRx_V)
+
+#define CFG_OR0_PRELIM  (MEG_TO_AM(CFG_FLASH_SIZE)      |\
+                        ORxG_CSNT                      |\
+                        ORxG_ACS_DIV4                  |\
+                        ORxG_SCY_8_CLK                 |\
+                        ORxG_TRLX)
+
+/* SDRAM on TQM8272 can have either 8 or 9 columns.
+ * The number affects configuration values.
+ */
+
+/* Bank 1 - 60x bus SDRAM
+ */
+#define CFG_PSRT        0x20   /* Low Value */
+/* #define CFG_PSRT        0x10         Fast Value */
+#define CFG_LSRT        0x20   /* Local Bus */
+#ifndef CFG_RAMBOOT
+#define CFG_BR1_PRELIM  ((CFG_SDRAM_BASE & BRx_BA_MSK)  |\
+                        BRx_PS_64                      |\
+                        BRx_MS_SDRAM_P                 |\
+                        BRx_V)
+
+#define CFG_OR1_PRELIM CFG_OR1_8COL
+
+/* SDRAM initialization values for 8-column chips
+ */
+#define CFG_OR1_8COL    ((~(CFG_GLOBAL_SDRAM_LIMIT-1) & ORxS_SDAM_MSK) |\
+                        ORxS_BPD_4                     |\
+                        ORxS_ROWST_PBI1_A7             |\
+                        ORxS_NUMR_12)
+
+#define CFG_PSDMR_8COL  (PSDMR_PBI                      |\
+                        PSDMR_SDAM_A15_IS_A5           |\
+                        PSDMR_BSMA_A12_A14             |\
+                        PSDMR_SDA10_PBI1_A8            |\
+                        PSDMR_RFRC_7_CLK               |\
+                        PSDMR_PRETOACT_2W              |\
+                        PSDMR_ACTTORW_2W               |\
+                        PSDMR_LDOTOPRE_1C              |\
+                        PSDMR_WRC_2C                   |\
+                        PSDMR_EAMUX                    |\
+                        PSDMR_BUFCMD                   |\
+                        PSDMR_CL_2)
+
+
+/* SDRAM initialization values for 9-column chips
+ */
+#define CFG_OR1_9COL    ((~(CFG_GLOBAL_SDRAM_LIMIT-1) & ORxS_SDAM_MSK) |\
+                        ORxS_BPD_4                     |\
+                        ORxS_ROWST_PBI1_A5             |\
+                        ORxS_NUMR_13)
+
+#define CFG_PSDMR_9COL  (PSDMR_PBI                      |\
+                        PSDMR_SDAM_A16_IS_A5           |\
+                        PSDMR_BSMA_A12_A14             |\
+                        PSDMR_SDA10_PBI1_A7            |\
+                        PSDMR_RFRC_7_CLK               |\
+                        PSDMR_PRETOACT_2W              |\
+                        PSDMR_ACTTORW_2W               |\
+                        PSDMR_LDOTOPRE_1C              |\
+                        PSDMR_WRC_2C                   |\
+                        PSDMR_EAMUX                    |\
+                        PSDMR_BUFCMD                   |\
+                        PSDMR_CL_2)
+
+#define CFG_OR1_10COL    ((~(CFG_GLOBAL_SDRAM_LIMIT-1) & ORxS_SDAM_MSK) |\
+                        ORxS_BPD_4                     |\
+                        ORxS_ROWST_PBI1_A4             |\
+                        ORxS_NUMR_13)
+
+#define CFG_PSDMR_10COL  (PSDMR_PBI                      |\
+                        PSDMR_SDAM_A17_IS_A5           |\
+                        PSDMR_BSMA_A12_A14             |\
+                        PSDMR_SDA10_PBI1_A4            |\
+                        PSDMR_RFRC_6_CLK               |\
+                        PSDMR_PRETOACT_2W              |\
+                        PSDMR_ACTTORW_2W               |\
+                        PSDMR_LDOTOPRE_1C              |\
+                        PSDMR_WRC_2C                   |\
+                        PSDMR_EAMUX                    |\
+                        PSDMR_BUFCMD                   |\
+                        PSDMR_CL_2)
+
+#define PSDMR_RFRC_66MHZ_SINGLE         0x00028000  /* PSDMR[RFRC] at 66 MHz single mode */
+#define PSDMR_RFRC_100MHZ_SINGLE        0x00030000  /* PSDMR[RFRC] at 100 MHz single mode */
+#define PSDMR_RFRC_133MHZ_SINGLE        0x00030000  /* PSDMR[RFRC] at 133 MHz single mode */
+#define PSDMR_RFRC_66MHZ_60X            0x00030000  /* PSDMR[RFRC] at 66 MHz 60x mode */
+#define PSDMR_RFRC_100MHZ_60X           0x00028000  /* PSDMR[RFRC] at 100 MHz 60x mode */
+#define PSDMR_RFRC_DEFAULT              PSDMR_RFRC_133MHZ_SINGLE  /* PSDMR[RFRC] default value */
+
+#define PSDMR_PRETOACT_66MHZ_SINGLE     0x00002000  /* PSDMR[PRETOACT] at 66 MHz single mode */
+#define PSDMR_PRETOACT_100MHZ_SINGLE    0x00002000  /* PSDMR[PRETOACT] at 100 MHz single mode */
+#define PSDMR_PRETOACT_133MHZ_SINGLE    0x00002000  /* PSDMR[PRETOACT] at 133 MHz single mode */
+#define PSDMR_PRETOACT_66MHZ_60X        0x00001000  /* PSDMR[PRETOACT] at 66 MHz 60x mode */
+#define PSDMR_PRETOACT_100MHZ_60X       0x00001000  /* PSDMR[PRETOACT] at 100 MHz 60x mode */
+#define PSDMR_PRETOACT_DEFAULT          PSDMR_PRETOACT_133MHZ_SINGLE  /* PSDMR[PRETOACT] default value */
+
+#define PSDMR_WRC_66MHZ_SINGLE          0x00000020  /* PSDMR[WRC] at 66 MHz single mode */
+#define PSDMR_WRC_100MHZ_SINGLE         0x00000020  /* PSDMR[WRC] at 100 MHz single mode */
+#define PSDMR_WRC_133MHZ_SINGLE         0x00000010  /* PSDMR[WRC] at 133 MHz single mode */
+#define PSDMR_WRC_66MHZ_60X             0x00000010  /* PSDMR[WRC] at 66 MHz 60x mode */
+#define PSDMR_WRC_100MHZ_60X            0x00000010  /* PSDMR[WRC] at 100 MHz 60x mode */
+#define PSDMR_WRC_DEFAULT               PSDMR_WRC_133MHZ_SINGLE  /* PSDMR[WRC] default value */
+
+#define PSDMR_BUFCMD_66MHZ_SINGLE       0x00000000  /* PSDMR[BUFCMD] at 66 MHz single mode */
+#define PSDMR_BUFCMD_100MHZ_SINGLE      0x00000000  /* PSDMR[BUFCMD] at 100 MHz single mode */
+#define PSDMR_BUFCMD_133MHZ_SINGLE      0x00000004  /* PSDMR[BUFCMD] at 133 MHz single mode */
+#define PSDMR_BUFCMD_66MHZ_60X          0x00000000  /* PSDMR[BUFCMD] at 66 MHz 60x mode */
+#define PSDMR_BUFCMD_100MHZ_60X         0x00000000  /* PSDMR[BUFCMD] at 100 MHz 60x mode */
+#define PSDMR_BUFCMD_DEFAULT            PSDMR_BUFCMD_133MHZ_SINGLE  /* PSDMR[BUFCMD] default value */
+
+#endif /* CFG_RAMBOOT */
+
+#endif /* __CONFIG_H */
index bbe6b76bff5f321eff53506a6b6d53e8a84619f0..49027da5a491d877c6a98fe65744940041680829 100644 (file)
                "cp.b 100000 fffc0000 40000;"                           \
                "setenv filesize;saveenv\0"                             \
        "upd=run load;run update\0"                                     \
+       "ethprime=ppc_4xx_eth3\0"                                       \
+       "ethact=ppc_4xx_eth3\0"                                         \
+       "autoload=no\0"                                                 \
+       "ipconfig=dhcp;setenv serverip 11.0.0.152\0"                    \
+       "actkernel=kernel2\0"                                           \
+       "load_fpga=fpga load 0 ffe00000 10dd9a\0"                       \
+       "mtdargs=setenv bootargs root=/dev/mtdblock6 rw "               \
+               "rootfstype=jffs2 init=/sbin/init\0"                    \
+       "kernel1_mtd=nand read 200000 0 200000;run mtdargs addip addtty"\
+               ";bootm 200000\0"                                       \
+       "kernel2_mtd=nand read 200000 200000 200000;run mtdargs addip " \
+               "addtty;bootm 200000\0"                                 \
+       "kernel1=run ipconfig load_fpga kernel1_mtd\0"                  \
+       "kernel2=run ipconfig load_fpga kernel2_mtd\0"                  \
        ""
-#define CONFIG_BOOTCOMMAND     "run flash_self"
+
+#define CONFIG_BOOTCOMMAND     "run kernel2"
 
 #define CONFIG_BOOTDELAY       2       /* autoboot after 5 seconds     */
 
 /*-----------------------------------------------------------------------
  * Definitions for GPIO setup
  *-----------------------------------------------------------------------*/
+#define CFG_GPIO_SHUTDOWN      (0x80000000 >> 6)
+#define CFG_GPIO_SSD_EMPTY     (0x80000000 >> 9)
 #define CFG_GPIO_EREADY                (0x80000000 >> 26)
 #define CFG_GPIO_REV0          (0x80000000 >> 14)
 #define CFG_GPIO_REV1          (0x80000000 >> 15)
diff --git a/include/configs/idmr.h b/include/configs/idmr.h
new file mode 100644 (file)
index 0000000..48915b3
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * Configuration settings for the iDMR board
+ *
+ * Based on MC5272C3, r5200  and M5271EVB board configs
+ * (C) Copyright 2006 Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ * (C) Copyright 2006 Lab X Technologies <zachary.landau@labxtechnologies.com>
+ * (C) Copyright 2003 Josef Baumgartner <josef.baumgartner@telex.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
+ */
+
+#ifndef _IDMR_H
+#define _IDMR_H
+
+
+/*
+ * High Level Configuration Options (easy to change)
+ */
+
+#define CONFIG_MCF52x2         /* define processor family */
+#define CONFIG_M5271           /* define processor type */
+#define CONFIG_IDMR            /* define board type */
+
+#undef CONFIG_WATCHDOG         /* disable watchdog */
+
+/*
+ * Default environment settings
+ */
+#define CONFIG_BOOTCOMMAND     "run net_nfs"
+#define CONFIG_BOOTDELAY       5
+#define CONFIG_BAUDRATE                19200
+#define CFG_BAUDRATE_TABLE     { 9600 , 19200 , 38400 , 57600, 115200 }
+#define CONFIG_ETHADDR         00:06:3b:01:41:55
+#define CONFIG_ETHPRIME
+#define CONFIG_IPADDR          192.168.30.1
+#define CONFIG_SERVERIP                192.168.1.1
+#define CONFIG_ROOTPATH
+#define CONFIG_GATEWAYIP       192.168.1.1
+#define CONFIG_NETMASK         255.255.0.0
+#define CONFIG_HOSTNAME                idmr
+#define CONFIG_BOOTFILE                /tftpboot/idmr/uImage
+#define CONFIG_PREBOOT         "echo;echo Type \"run flash_nfs\" to mount root " \
+                               "filesystem over NFS; echo"
+
+#define CONFIG_EXTRA_ENV_SETTINGS                                      \
+       "netdev=eth0\0"                                                 \
+       "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
+       "addip=setenv bootargs $(bootargs) "                            \
+               "ip=$(ipaddr):$(serverip):$(gatewayip):"                \
+               "$(netmask):$(hostname):$(netdev):off panic=1\0"        \
+       "flash_nfs=run nfsargs addip;bootm $(kernel_addr)\0"            \
+       "flash_self=run ramargs addip;bootm $(kernel_addr) "            \
+               "$(ramdisk_addr)\0"                                     \
+       "net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0"     \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=$(serverip):$(rootpath)\0"                     \
+       "ethact=FEC ETHERNET\0"                                         \
+       "update=prot off ff800000 ff81ffff; era ff800000 ff81ffff; "    \
+               "cp.b 200000 ff800000 $(filesize);"                     \
+               "prot on ff800000 ff81ffff\0"                           \
+       "load=tftp 200000 $(u-boot)\0"                                  \
+       "u-boot=/tftpboot/idmr/u-boot.bin\0"                            \
+       ""
+
+/*
+ * Commands' definition
+ */
+#define CONFIG_COMMANDS                ((CONFIG_CMD_DFL                | \
+                                       CFG_CMD_PING            | \
+                                       CFG_CMD_NET             | \
+                                       CFG_CMD_MII)            & \
+                                       ~(CFG_CMD_LOADS         | \
+                                               CFG_CMD_LOADB))
+
+/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <cmd_confdefs.h>
+
+
+/*
+ * Low Level Configuration Settings
+ * (address mappings, register initial values, etc.)
+ * You should know what you are doing if you make changes here.
+ */
+
+/*
+ * Configuration for environment, which occupies third sector in flash.
+ */
+#ifndef CONFIG_MONITOR_IS_IN_RAM
+#define CFG_ENV_ADDR           0xff820000
+#define CFG_ENV_SECT_SIZE      0x10000
+#define CFG_ENV_SIZE           0x2000
+#define CFG_ENV_IS_IN_FLASH
+#else /* CONFIG_MONITOR_IS_IN_RAM */
+#define CFG_ENV_OFFSET         0x4000
+#define CFG_ENV_SECT_SIZE      0x2000
+#define CFG_ENV_IS_IN_FLASH
+#endif /* !CONFIG_MONITOR_IS_IN_RAM */
+
+#define CFG_PROMPT             "=> "
+#define CFG_LONGHELP                           /* undef to save memory */
+
+#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
+#define CFG_CBSIZE             1024            /* Console I/O Buffer Size */
+#else /* !(CONFIG_COMMANDS & CFG_CMD_KGDB) */
+#define CFG_CBSIZE             256             /* Console I/O Buffer Size */
+#endif /* (CONFIG_COMMANDS & CFG_CMD_KGDB) */
+
+#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
+#define CFG_MAXARGS            16              /* max number of command args */
+#define CFG_BARGSIZE           CFG_CBSIZE      /* Boot Argument Buffer Size */
+
+#define CFG_LOAD_ADDR          0x00100000
+
+#define CFG_MEMTEST_START      0x400
+#define CFG_MEMTEST_END                0x380000
+
+#define CFG_HZ                 (50000000 / 64)
+#define CFG_CLK                        100000000
+
+#define CFG_MBAR               0x40000000      /* Register Base Addrs */
+
+/*
+ * Ethernet
+ */
+#define FEC_ENET
+#define CONFIG_NET_RETRY_COUNT 5
+#define CFG_ENET_BD_BASE       0x480000
+#define CFG_DISCOVER_PHY       1
+#define CONFIG_MII             1
+
+/*
+ * Definitions for initial stack pointer and data area (in DPRAM)
+ */
+#define CFG_INIT_RAM_ADDR      0x20000000
+#define CFG_INIT_RAM_END       0x1000  /* End of used area in internal SRAM */
+#define CFG_GBL_DATA_SIZE      64      /* size in bytes reserved for initial data */
+#define CFG_GBL_DATA_OFFSET    (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
+#define CFG_INIT_SP_OFFSET     CFG_GBL_DATA_OFFSET
+
+/*
+ * Start addresses for the final memory configuration
+ * (Set up by the startup code)
+ * Please note that CFG_SDRAM_BASE _must_ start at 0
+ */
+#define CFG_SDRAM_BASE         0x00000000
+#define CFG_SDRAM_SIZE         16              /* SDRAM size in MB */
+#define CFG_FLASH_BASE         0xff800000
+
+#ifdef CONFIG_MONITOR_IS_IN_RAM
+#define CFG_MONITOR_BASE       0x20000
+#else /* !CONFIG_MONITOR_IS_IN_RAM */
+#define CFG_MONITOR_BASE       (CFG_FLASH_BASE + 0x400)
+#endif /* CONFIG_MONITOR_IS_IN_RAM */
+
+#define CFG_MONITOR_LEN                0x20000
+#define CFG_MALLOC_LEN         (256 << 10)
+#define CFG_BOOTPARAMS_LEN     (64*1024)
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 8 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization ??
+ */
+#define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
+
+/* FLASH organization */
+#define CFG_MAX_FLASH_BANKS    1       /* max number of memory banks */
+#define CFG_MAX_FLASH_SECT     128     /* max number of sectors on one chip */
+#define CFG_FLASH_ERASE_TOUT   1000
+
+#define CFG_FLASH_SIZE         0x800000
+/*
+ * #define CFG_FLASH_USE_BUFFER_WRITE  1
+ */
+
+/* Cache Configuration */
+#define CFG_CACHELINE_SIZE     16
+
+/* Port configuration */
+#define CFG_FECI2C             0xF0
+#endif /* _IDMR_H */
index 00b92220c10f417fbd7941c8dd9c88aa7ecdffea..e7f0108892c08102ecbcedd48ec2ddbdafffdf71 100644 (file)
 /*-----------------------------------------------------------------------
  * DDR SDRAM
  *----------------------------------------------------------------------*/
-#define CFG_MBYTES_SDRAM        (256)    /* 256MB                      */
+#define CFG_MBYTES_SDRAM        (256)          /* 256MB                        */
+#if !defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+#define CONFIG_DDR_DATA_EYE                    /* use DDR2 optimization        */
+#endif
 
 /*-----------------------------------------------------------------------
  * I2C
index 9d3609a67d33592167cd8392d36e8508fc27c794..09bbebdce899407d9e390c77092e05682cde7b15 100644 (file)
 #define CONFIG_BAUDRATE                19200
 
 /* use PLD CLK4 instead of brg */
-#undef CFG_SPC1920_SMC1_CLK4
+#define CFG_SPC1920_SMC1_CLK4
 
 #define CONFIG_8xx_OSCLK               10000000 /* 10 MHz oscillator on EXTCLK  */
 #define CONFIG_8xx_CPUCLK_DEFAULT      50000000
 #define CFG_8xx_CPUCLK_MIN             40000000
 #define CFG_8xx_CPUCLK_MAX             133000000
 
-#define CFG_RESET_ADDRESS              0xf8000000
+#define CFG_RESET_ADDRESS              0xC0000000
 
 #define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_LAST_STAGE_INIT
 
-
-#if 1
+#if 0
 #define CONFIG_BOOTDELAY       -1      /* autoboot disabled            */
 #else
 #define CONFIG_BOOTDELAY       5       /* autoboot after 5 seconds     */
 #ifndef CONFIG_COMMANDS
 #define CONFIG_COMMANDS        (CONFIG_CMD_DFL   \
                         | CFG_CMD_ASKENV \
+                        | CFG_CMD_DATE \
                         | CFG_CMD_ECHO   \
                         | CFG_CMD_IMMAP  \
                         | CFG_CMD_JFFS2 \
                         | CFG_CMD_PING \
                         | CFG_CMD_DHCP \
-                        | CFG_CMD_IMMAP \
+                        | CFG_CMD_I2C \
                         | CFG_CMD_MII)
                        /* & ~( CFG_CMD_NET)) */
 
 #define CFG_CACHELINE_SIZE     16      /* For all MPC8xx CPUs                  */
 #define CFG_CACHELINE_SHIFT    4       /* log base 2 of the above value        */
 
+#ifdef CFG_CMD_DATE
+# define CONFIG_RTC_DS3231
+# define CFG_I2C_RTC_ADDR      0x68
+#endif
+
 /*-----------------------------------------------------------------------
  * I2C configuration
  */
 #if (CONFIG_COMMANDS & CFG_CMD_I2C)
-#define CONFIG_HARD_I2C                1       /* I2C with hardware support */
-#define CFG_I2C_SPEED          400000  /* I2C speed and slave address defaults */
-#define CFG_I2C_SLAVE          0x7F
+/* enable I2C and select the hardware/software driver */
+#undef CONFIG_HARD_I2C                 /* I2C with hardware support    */
+#define CONFIG_SOFT_I2C                1       /* I2C bit-banged               */
+
+#define CFG_I2C_SPEED          93000   /* 93 kHz is supposed to work   */
+#define CFG_I2C_SLAVE          0xFE
+
+#ifdef CONFIG_SOFT_I2C
+/*
+ * Software (bit-bang) I2C driver configuration
+ */
+#define PB_SCL         0x00000020      /* PB 26 */
+#define PB_SDA         0x00000010      /* PB 27 */
+
+#define I2C_INIT       (immr->im_cpm.cp_pbdir |=  PB_SCL)
+#define I2C_ACTIVE     (immr->im_cpm.cp_pbdir |=  PB_SDA)
+#define I2C_TRISTATE   (immr->im_cpm.cp_pbdir &= ~PB_SDA)
+#define I2C_READ       ((immr->im_cpm.cp_pbdat & PB_SDA) != 0)
+#define I2C_SDA(bit)   if(bit) immr->im_cpm.cp_pbdat |=  PB_SDA; \
+                      else    immr->im_cpm.cp_pbdat &= ~PB_SDA
+#define I2C_SCL(bit)   if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
+                      else    immr->im_cpm.cp_pbdat &= ~PB_SCL
+#define I2C_DELAY      udelay(2)       /* 1/4 I2C clock duration */
+#endif /* CONFIG_SOFT_I2C */
 #endif
 
 /*-----------------------------------------------------------------------
  *-----------------------------------------------------------------------
  * PCMCIA config., multi-function pin tri-state
  */
-#define CFG_SIUMCR     (SIUMCR_DBGC00 | SIUMCR_DBPC00 | SIUMCR_MLRC01)
+#define CFG_SIUMCR      (SIUMCR_FRC)
 
 /*-----------------------------------------------------------------------
  * TBSCR - Time Base Status and Control                                11-26
  * FLASH timing:
  */
 #define CFG_OR_TIMING_FLASH    (OR_ACS_DIV1  | OR_TRLX | OR_CSNT_SAM | \
-                                OR_SCY_3_CLK | OR_EHTR | OR_BI)
+                                OR_SCY_6_CLK | OR_EHTR | OR_BI)
 
 #define CFG_OR0_REMAP  (CFG_REMAP_OR_AM  | CFG_OR_TIMING_FLASH)
 #define CFG_OR0_PRELIM (CFG_PRELIM_OR_AM | CFG_OR_TIMING_FLASH)
                        MBMR_TLFB_4X) /* 0x04804114 */ /* 0x10802114 */
 
 
-/* PLD CS5 */
+/*
+ * DSP Host Port Interface CS3
+ */
+#define CFG_SPC1920_HPI_BASE   0x90000000
+#define CFG_PRELIM_OR3_AM      0xF8000000
+
+#define CFG_OR3         (CFG_PRELIM_OR3_AM | \
+                                      OR_G5LS | \
+                                      OR_SCY_0_CLK | \
+                                      OR_BI)
+
+#define CFG_BR3 ((CFG_SPC1920_HPI_BASE & BR_BA_MSK) | \
+                                              BR_MS_UPMA | \
+                                              BR_PS_16 | \
+                                              BR_V);
+
+#define CFG_MAMR (MAMR_GPL_A4DIS | \
+               MAMR_RLFA_5X | \
+               MAMR_WLFA_5X)
+
+#define CONFIG_SPC1920_HPI_TEST
+
+#ifdef CONFIG_SPC1920_HPI_TEST
+#define HPI_REG(x)             (*((volatile u16 *) (CFG_SPC1920_HPI_BASE + x)))
+#define HPI_HPIC_1             HPI_REG(0)
+#define HPI_HPIC_2             HPI_REG(2)
+#define HPI_HPIA_1             HPI_REG(0x2000008)
+#define HPI_HPIA_2             HPI_REG(0x2000008 + 2)
+#define HPI_HPID_INC_1         HPI_REG(0x1000004)
+#define HPI_HPID_INC_2         HPI_REG(0x1000004 + 2)
+#define HPI_HPID_NOINC_1       HPI_REG(0x300000c)
+#define HPI_HPID_NOINC_2       HPI_REG(0x300000c + 2)
+#endif /* CONFIG_SPC1920_HPI_TEST */
+
+/*
+ * Ramtron FM18L08 FRAM 32KB on CS4
+ */
+#define CFG_SPC1920_FRAM_BASE  0x80100000
+#define CFG_PRELIM_OR4_AM      0xffff8000
+#define CFG_OR4                (CFG_PRELIM_OR4_AM | \
+                                       OR_ACS_DIV2 | \
+                                       OR_BI | \
+                                       OR_SCY_4_CLK | \
+                                       OR_TRLX)
+
+#define CFG_BR4 ((CFG_SPC1920_FRAM_BASE & BR_BA_MSK) | BR_PS_8 | BR_V);
+
+/*
+ * PLD CS5
+ */
 #define CFG_SPC1920_PLD_BASE   0x80000000
 #define CFG_PRELIM_OR5_AM      0xffff8000
 
 
 #define CFG_BR5_PRELIM ((CFG_SPC1920_PLD_BASE & BR_BA_MSK) | BR_PS_8 | BR_V);
 
-/* #define CFG_PLD_BASE   0x30000000 */
-/* #define CFG_OR5_PRELIM 0xffff1110 */
-/* #define CFG_BR5_PRELIM 0x30000401 */
-
 /*
  * Internal Definitions
  *
index 554a7a41b8e60516e88c92132c9541631184fb18..e19591d2993e7ca20c585ac74e182bd839812297 100644 (file)
@@ -39,6 +39,7 @@
 #define CONFIG_NETCONSOLE              1
 
 #define CONFIG_BOARD_EARLY_INIT_R      1       /* do board-specific init */
+#define CONFIG_BOARD_EARLY_INIT_F      1       /* do board-specific init */
 
 #define CFG_XLB_PIPELINING             1       /* gives better performance */
 
                                 CFG_CMD_IRQ    | \
                                 CFG_CMD_JFFS2  | \
                                 CFG_CMD_MII    | \
-                                CFG_CMD_SDRAMi | \
+                                CFG_CMD_SDRAM  | \
                                 CFG_CMD_DATE   | \
                                 CFG_CMD_USB    | \
                                 CFG_CMD_FAT)
        "preboot=echo;echo Type \"run flash_nfs\" to mount root "       \
                "filesystem over NFS; echo\0"                           \
        "netdev=eth0\0"                                                 \
-       "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
+       "ramargs=setenv bootargs root=/dev/ram rw wdt=off \0"           \
        "addip=setenv bootargs $(bootargs) "                            \
                "ip=$(ipaddr):$(serverip):$(gatewayip):"                \
                "$(netmask):$(hostname):$(netdev):off panic=1\0"        \
                "$(ramdisk_addr)\0"                                     \
        "net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0"     \
        "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
-               "nfsroot=$(serverip):$(rootpath)\0"                     \
+               "nfsroot=$(serverip):$(rootpath) wdt=off\0"             \
        "hostname=v38b\0"                                               \
        "ethact=FEC ETHERNET\0"                                         \
        "rootpath=/opt/eldk-3.1.1/ppc_6xx\0"                            \
index 58717f8a60cdb9d43d3e06e46584dd19955f2b7a..911a52dbcfa29200a3a8aa5c4a6dc061a7903687 100644 (file)
  */
 #define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
 
+/*-----------------------------------------------------------------------
+ * External Bus Controller (EBC) Setup
+ *----------------------------------------------------------------------*/
+#define CFG_FLASH              CFG_FLASH_BASE
+#define CFG_CPLD               0x80000000
+
+/* Memory Bank 0 (NOR-FLASH) initialization                                    */
+#define CFG_EBC_PB0AP          0x03017300
+#define CFG_EBC_PB0CR          (CFG_FLASH | 0xda000)
+
+/* Memory Bank 2 (CPLD) initialization                                         */
+#define CFG_EBC_PB2AP          0x04814500
+#define CFG_EBC_PB2CR          (CFG_CPLD | 0x18000)
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */
index 6e942abcaae90de9005cdb2da15f33bb317b484f..2cc18db9a50d7b0e816e44d3f9bc3a363a849f02 100644 (file)
  */
 #define CFG_BOOTMAPSZ          (8 << 20)       /* Initial Memory map for Linux */
 
+/*-----------------------------------------------------------------------
+ * External Bus Controller (EBC) Setup
+ *----------------------------------------------------------------------*/
+#define CFG_FLASH              CFG_FLASH_BASE
+#define CFG_CPLD               0x80000000
+
+/* Memory Bank 0 (NOR-FLASH) initialization                                    */
+#define CFG_EBC_PB0AP          0x03017300
+#define CFG_EBC_PB0CR          (CFG_FLASH | 0xda000)
+
+/* Memory Bank 2 (CPLD) initialization                                         */
+#define CFG_EBC_PB2AP          0x04814500
+#define CFG_EBC_PB2CR          (CFG_CPLD | 0x18000)
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */
index 9c57cbc427c90bd9c0a68ea80df251ae0f2cc6cb..8b7e824cca08d495379b7b528a15738ee3e9e7ec 100644 (file)
@@ -51,6 +51,7 @@ typedef struct {
        ushort  device_id2;             /* extended device id                   */
        ushort  ext_addr;               /* extended query table address         */
        ushort  cfi_version;            /* cfi version                          */
+       ushort  cfi_offset;             /* offset for cfi query                 */
 #endif
 } flash_info_t;
 
index ff52a7b38b3de59e15c60cba2aac5b0dc189a1d8..d9dd92d9a5e876b5ef0dc6f2d3ad68a4edd1ebc2 100644 (file)
 #endif
 #ifndef CPU_ID_STR
 #if defined(CONFIG_MPC8272_FAMILY)
+#ifdef CONFIG_MPC8247
+#define CPU_ID_STR     "MPC8247"
+#elif defined CONFIG_MPC8248
+#define CPU_ID_STR     "MPC8248"
+#elif defined CONFIG_MPC8271
+#define CPU_ID_STR     "MPC8271"
+#else
 #define CPU_ID_STR     "MPC8272"
+#endif
 #else
 #define CPU_ID_STR     "MPC8260"
 #endif
@@ -66,6 +74,7 @@
 #define BCR_EXDD       0x00000400      /* External Master Delay Disable*/
 #define BCR_ISPS       0x00000010      /* Internal Space Port Size     */
 
+
 /*-----------------------------------------------------------------------
  * PPC_ACR - 60x Bus Arbiter Configuration Register                     4-28
  */
 #define SIUMCR_MMR10   0x00008000      /* - " -                        */
 #define SIUMCR_MMR11   0x0000c000      /* - " -                        */
 #define SIUMCR_LPBSE   0x00002000      /* LocalBus Parity Byte Select Enable*/
+#define SIUMCR_ABE     0x00000400      /* Address output buffer impedance*/
 
 /*-----------------------------------------------------------------------
  * IMMR - Internal Memory Map Register                                  4-34
index 50f4ec403bdb3a9a82780285cb1f1d7ba239a61a..91cff414af6539ecf971b292242f34ab7fec2019 100644 (file)
 
 /* PLB4 Arbiter - PowerPC440EP Pass1 */
 #define PLB4_DCR_BASE           0x080
+#define plb4_acr                (PLB4_DCR_BASE+0x1)
 #define plb4_revid              (PLB4_DCR_BASE+0x2)
-#define plb4_acr                (PLB4_DCR_BASE+0x3)
 #define plb4_besr               (PLB4_DCR_BASE+0x4)
 #define plb4_bearl              (PLB4_DCR_BASE+0x6)
 #define plb4_bearh              (PLB4_DCR_BASE+0x7)
 
+#define PLB4_ACR_WRP           (0x80000000 >> 7)
+
 /* Nebula PLB4 Arbiter - PowerPC440EP */
 #define PLB_ARBITER_BASE   0x80
 
@@ -3284,26 +3286,26 @@ typedef struct { unsigned long  add;    /* gpio core base address */
 /*
  * Macros for accessing the indirect EBC registers
  */
-#define mtebc(reg, data)       mtdcr(ebccfga,reg);mtdcr(ebccfgd,data)
-#define mfebc(reg, data)       mtdcr(ebccfga,reg);data = mfdcr(ebccfgd)
+#define mtebc(reg, data)       { mtdcr(ebccfga,reg);mtdcr(ebccfgd,data); }
+#define mfebc(reg, data)       { mtdcr(ebccfga,reg);data = mfdcr(ebccfgd); }
 
 /*
  * Macros for accessing the indirect SDRAM controller registers
  */
-#define mtsdram(reg, data)     mtdcr(memcfga,reg);mtdcr(memcfgd,data)
-#define mfsdram(reg, data)     mtdcr(memcfga,reg);data = mfdcr(memcfgd)
+#define mtsdram(reg, data)     { mtdcr(memcfga,reg);mtdcr(memcfgd,data); }
+#define mfsdram(reg, data)     { mtdcr(memcfga,reg);data = mfdcr(memcfgd); }
 
 /*
  * Macros for accessing the indirect clocking controller registers
  */
-#define mtclk(reg, data)       mtdcr(clkcfga,reg);mtdcr(clkcfgd,data)
-#define mfclk(reg, data)       mtdcr(clkcfga,reg);data = mfdcr(clkcfgd)
+#define mtclk(reg, data)       { mtdcr(clkcfga,reg);mtdcr(clkcfgd,data); }
+#define mfclk(reg, data)       { mtdcr(clkcfga,reg);data = mfdcr(clkcfgd); }
 
 /*
  * Macros for accessing the sdr controller registers
  */
-#define mtsdr(reg, data)       mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data)
-#define mfsdr(reg, data)       mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd)
+#define mtsdr(reg, data)       { mtdcr(sdrcfga,reg);mtdcr(sdrcfgd,data); }
+#define mfsdr(reg, data)       { mtdcr(sdrcfga,reg);data = mfdcr(sdrcfgd); }
 
 
 #ifndef __ASSEMBLY__
index d45e470aeb97554bdc48ee9e53c96a58f3695ef1..12e38f0577f8e85bd2f2c4581128aa82340bf8e9 100644 (file)
@@ -153,7 +153,11 @@ void udelay(unsigned long usec)
                timerp[MCFTIMER_PMR] = 0;
                /* set period to 1 us */
                timerp[MCFTIMER_PCSR] =
+#ifdef CONFIG_M5271
+                       (6 << 8) | MCFTIMER_PCSR_EN | MCFTIMER_PCSR_OVW;
+#else /* !CONFIG_M5271 */
                        (5 << 8) | MCFTIMER_PCSR_EN | MCFTIMER_PCSR_OVW;
+#endif /* CONFIG_M5271 */
 
                timerp[MCFTIMER_PMR] = tmp;
                while (timerp[MCFTIMER_PCNTR] > 0);
@@ -171,7 +175,11 @@ void timer_init (void)
        timerp[MCFTIMER_PCSR] = MCFTIMER_PCSR_OVW;
        timerp[MCFTIMER_PMR] = lastinc = 0;
        timerp[MCFTIMER_PCSR] =
+#ifdef CONFIG_M5271
+               (6 << 8) | MCFTIMER_PCSR_EN | MCFTIMER_PCSR_OVW;
+#else /* !CONFIG_M5271 */
                (5 << 8) | MCFTIMER_PCSR_EN | MCFTIMER_PCSR_OVW;
+#endif /* CONFIG_M5271 */
 }
 
 void set_timer (ulong t)
index a11d3c0fd2a2140b06704e9a0c8170005dd36e6e..f4241219629d78a6051f8feeff1115fa43adfb39 100644 (file)
 #include <keyboard.h>
 #endif
 
+#ifdef CFG_UPDATE_FLASH_SIZE
+extern int update_flash_size (int flash_size);
+#endif
+
 #if (CONFIG_COMMANDS & CFG_CMD_DOC)
 void doc_init (void);
 #endif
@@ -730,6 +734,13 @@ void board_init_r (gd_t *id, ulong dest_addr)
 
        bd->bi_flashstart = CFG_FLASH_BASE;     /* update start of FLASH memory    */
        bd->bi_flashsize = flash_size;  /* size of FLASH memory (final value) */
+
+#if defined(CFG_UPDATE_FLASH_SIZE)
+       /* Make a update of the Memctrl. */
+       update_flash_size (flash_size);
+#endif
+
+
 # if defined(CONFIG_PCU_E) || defined(CONFIG_OXC) || defined(CONFIG_RMU)
        /* flash mapped at end of memory map */
        bd->bi_flashoffset = TEXT_BASE + flash_size;
@@ -876,6 +887,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
 #endif
 
 #if defined(CONFIG_TQM8xxL) || defined(CONFIG_TQM8260) || \
+    defined(CONFIG_TQM8272) || \
     defined(CONFIG_CCM) || defined(CONFIG_KUP4K) || defined(CONFIG_KUP4X)
        load_sernum_ethaddr ();
 #endif
index a71f583eddbeca5836339058c45204575ebc6646..b42da8cf682d96e5bb54712a47458d7f183fb3e9 100644 (file)
@@ -76,7 +76,9 @@ $(obj)init.S:
 
 $(obj)sdram.c:
        @rm -f $(obj)sdram.c
+       @rm -f $(obj)sdram.h
        ln -s $(SRCTREE)/board/amcc/sequoia/sdram.c $(obj)sdram.c
+       ln -s $(SRCTREE)/board/amcc/sequoia/sdram.h $(obj)sdram.h
 
 # from nand_spl directory
 $(obj)nand_boot.c:
index cf2b24ef0ddcc7b978c53e4b1fe81076b738cce9..cdc8ac934f94abe305cb4bdff4ef0aa82c8d9818 100644 (file)
@@ -29,7 +29,7 @@ LIB   = $(obj)librtc.a
 
 COBJS  = date.o   \
          bf533_rtc.o ds12887.o ds1302.o ds1306.o ds1307.o \
-         ds1337.o ds1374.o ds1556.o ds164x.o ds174x.o \
+         ds1337.o ds1374.o ds1556.o ds164x.o ds174x.o ds3231.o \
          m41t11.o max6900.o m48t35ax.o mc146818.o mk48t59.o \
          mpc5xxx.o mpc8xx.o pcf8563.o s3c24x0_rtc.o rs5c372.o
 
diff --git a/rtc/ds3231.c b/rtc/ds3231.c
new file mode 100644 (file)
index 0000000..50aeeb5
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * (C) Copyright 2006
+ * Markus Klotzbuecher, mk@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
+ */
+
+/*
+ * Date & Time support (no alarms) for Dallas Semiconductor (now Maxim)
+ * Extremly Accurate DS3231 Real Time Clock (RTC).
+ *
+ * copied from ds1337.c
+ */
+
+#include <common.h>
+#include <command.h>
+#include <rtc.h>
+#include <i2c.h>
+
+#if defined(CONFIG_RTC_DS3231) && (CONFIG_COMMANDS & CFG_CMD_DATE)
+
+/*---------------------------------------------------------------------*/
+#undef DEBUG_RTC
+
+#ifdef DEBUG_RTC
+#define DEBUGR(fmt,args...) printf(fmt ,##args)
+#else
+#define DEBUGR(fmt,args...)
+#endif
+/*---------------------------------------------------------------------*/
+
+/*
+ * RTC register addresses
+ */
+#define RTC_SEC_REG_ADDR       0x0
+#define RTC_MIN_REG_ADDR       0x1
+#define RTC_HR_REG_ADDR                0x2
+#define RTC_DAY_REG_ADDR       0x3
+#define RTC_DATE_REG_ADDR      0x4
+#define RTC_MON_REG_ADDR       0x5
+#define RTC_YR_REG_ADDR                0x6
+#define RTC_CTL_REG_ADDR       0x0e
+#define RTC_STAT_REG_ADDR      0x0f
+
+
+/*
+ * RTC control register bits
+ */
+#define RTC_CTL_BIT_A1IE       0x1     /* Alarm 1 interrupt enable     */
+#define RTC_CTL_BIT_A2IE       0x2     /* Alarm 2 interrupt enable     */
+#define RTC_CTL_BIT_INTCN      0x4     /* Interrupt control            */
+#define RTC_CTL_BIT_RS1                0x8     /* Rate select 1                */
+#define RTC_CTL_BIT_RS2                0x10    /* Rate select 2                */
+#define RTC_CTL_BIT_DOSC       0x80    /* Disable Oscillator           */
+
+/*
+ * RTC status register bits
+ */
+#define RTC_STAT_BIT_A1F       0x1     /* Alarm 1 flag                 */
+#define RTC_STAT_BIT_A2F       0x2     /* Alarm 2 flag                 */
+#define RTC_STAT_BIT_OSF       0x80    /* Oscillator stop flag         */
+
+
+static uchar rtc_read (uchar reg);
+static void rtc_write (uchar reg, uchar val);
+static uchar bin2bcd (unsigned int n);
+static unsigned bcd2bin (uchar c);
+
+
+/*
+ * Get the current time from the RTC
+ */
+void rtc_get (struct rtc_time *tmp)
+{
+       uchar sec, min, hour, mday, wday, mon_cent, year, control, status;
+
+       control = rtc_read (RTC_CTL_REG_ADDR);
+       status = rtc_read (RTC_STAT_REG_ADDR);
+       sec = rtc_read (RTC_SEC_REG_ADDR);
+       min = rtc_read (RTC_MIN_REG_ADDR);
+       hour = rtc_read (RTC_HR_REG_ADDR);
+       wday = rtc_read (RTC_DAY_REG_ADDR);
+       mday = rtc_read (RTC_DATE_REG_ADDR);
+       mon_cent = rtc_read (RTC_MON_REG_ADDR);
+       year = rtc_read (RTC_YR_REG_ADDR);
+
+       DEBUGR ("Get RTC year: %02x mon/cent: %02x mday: %02x wday: %02x "
+               "hr: %02x min: %02x sec: %02x control: %02x status: %02x\n",
+               year, mon_cent, mday, wday, hour, min, sec, control, status);
+
+       if (status & RTC_STAT_BIT_OSF) {
+               printf ("### Warning: RTC oscillator has stopped\n");
+               /* clear the OSF flag */
+               rtc_write (RTC_STAT_REG_ADDR,
+                          rtc_read (RTC_STAT_REG_ADDR) & ~RTC_STAT_BIT_OSF);
+       }
+
+       tmp->tm_sec  = bcd2bin (sec & 0x7F);
+       tmp->tm_min  = bcd2bin (min & 0x7F);
+       tmp->tm_hour = bcd2bin (hour & 0x3F);
+       tmp->tm_mday = bcd2bin (mday & 0x3F);
+       tmp->tm_mon  = bcd2bin (mon_cent & 0x1F);
+       tmp->tm_year = bcd2bin (year) + ((mon_cent & 0x80) ? 2000 : 1900);
+       tmp->tm_wday = bcd2bin ((wday - 1) & 0x07);
+       tmp->tm_yday = 0;
+       tmp->tm_isdst= 0;
+
+       DEBUGR ("Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
+               tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
+               tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+}
+
+
+/*
+ * Set the RTC
+ */
+void rtc_set (struct rtc_time *tmp)
+{
+       uchar century;
+
+       DEBUGR ("Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
+               tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
+               tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+
+       rtc_write (RTC_YR_REG_ADDR, bin2bcd (tmp->tm_year % 100));
+
+       century = (tmp->tm_year >= 2000) ? 0x80 : 0;
+       rtc_write (RTC_MON_REG_ADDR, bin2bcd (tmp->tm_mon) | century);
+
+       rtc_write (RTC_DAY_REG_ADDR, bin2bcd (tmp->tm_wday + 1));
+       rtc_write (RTC_DATE_REG_ADDR, bin2bcd (tmp->tm_mday));
+       rtc_write (RTC_HR_REG_ADDR, bin2bcd (tmp->tm_hour));
+       rtc_write (RTC_MIN_REG_ADDR, bin2bcd (tmp->tm_min));
+       rtc_write (RTC_SEC_REG_ADDR, bin2bcd (tmp->tm_sec));
+}
+
+
+/*
+ * Reset the RTC.  We also enable the oscillator output on the
+ * SQW/INTB* pin and program it for 32,768 Hz output. Note that
+ * according to the datasheet, turning on the square wave output
+ * increases the current drain on the backup battery from about
+ * 600 nA to 2uA.
+ */
+void rtc_reset (void)
+{
+       rtc_write (RTC_CTL_REG_ADDR, RTC_CTL_BIT_RS1 | RTC_CTL_BIT_RS2);
+}
+
+
+/*
+ * Helper functions
+ */
+
+static
+uchar rtc_read (uchar reg)
+{
+       return (i2c_reg_read (CFG_I2C_RTC_ADDR, reg));
+}
+
+
+static void rtc_write (uchar reg, uchar val)
+{
+       i2c_reg_write (CFG_I2C_RTC_ADDR, reg, val);
+}
+
+static unsigned bcd2bin (uchar n)
+{
+       return ((((n >> 4) & 0x0F) * 10) + (n & 0x0F));
+}
+
+static unsigned char bin2bcd (unsigned int n)
+{
+       return (((n / 10) << 4) | (n % 10));
+}
+
+#endif /* (CONFIG_RTC_DS3231) && (CONFIG_COMMANDS & CFG_CMD_DATE) */