From 6876609446980c3055bbd32c195a63330e21d8e6 Mon Sep 17 00:00:00 2001
From: wdenk <wdenk>
Date: Thu, 29 Jan 2004 09:22:58 +0000
Subject: [PATCH] * Implement adaptive SDRAM timing configuration based on
 actual CPU   clock frequency for INCA-IP; fix problem with board hanging when
   switching from 150MHz to 100MHz

* Add PCMCIA CS support for BMS2003 board
---
 CHANGELOG                 |   6 ++
 board/incaip/memsetup.S   | 131 +++++++++++++++++++++++++++-----------
 cpu/mips/incaip_clock.c   |   4 +-
 doc/README.MPC866         |  19 ++++++
 include/configs/TQM866M.h |   8 +--
 include/configs/bms2003.h |   1 +
 6 files changed, 126 insertions(+), 43 deletions(-)
 create mode 100644 doc/README.MPC866

diff --git a/CHANGELOG b/CHANGELOG
index b5a918dc44..316e47f992 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,12 @@
 Changes since U-Boot 1.0.1:
 ======================================================================
 
+* Implement adaptive SDRAM timing configuration based on actual CPU
+  clock frequency for INCA-IP; fix problem with board hanging when
+  switching from 150MHz to 100MHz
+
+* Add PCMCIA CS support for BMS2003 board
+
 * Add variable CPU clock for MPC859/866 systems (so far only TQM866M):
   see doc/README.MPC866 for details;
   implement workaround for "SIU4" and "SIU9" silicon bugs on MPC866;
diff --git a/board/incaip/memsetup.S b/board/incaip/memsetup.S
index b438484643..10c4e840e3 100644
--- a/board/incaip/memsetup.S
+++ b/board/incaip/memsetup.S
@@ -174,63 +174,120 @@ cgu_init:
 	.end	cgu_init
 
 
-	.globl	memsetup
-	.ent	memsetup
-memsetup:
+/*
+ * void sdram_init(long)
+ *
+ * a0 has the clock value
+ */
+	.globl	sdram_init
+	.ent	sdram_init
+sdram_init:
 
-	/* EBU and CGU Initialization.
-	 */
-	li	a0, CPU_CLOCK_RATE
-	move	t0, ra
+	li	t1, MC_MODUL_BASE
 
-	/* We rely on the fact that neither ebu_init() nor cgu_init()
-	 * modify t0 and a0.
-	 */
-	bal	ebu_init
+	/* Disable memory controller before changing any of its registers */
+	sw	zero, MC_CTRLENA(t1)
+
+	li	t2, 100000000
+	beq	a0, t2, 1f
 	nop
-	bal	cgu_init
+	li	t2, 133000000
+	beq	a0, t2, 2f
+	nop
+	li	t2, 150000000
+	beq	a0, t2, 3f
+	nop
+	b	5f
 	nop
-	move	ra, t0
 
-	/* SDRAM Initialization.
-	 */
-	li	t0, MC_MODUL_BASE
+	/* 100 MHz clock */
+1:
+	/* Set clock ratio (clkrat=1:1, rddel=3) */
+	li	t2, 0x00000003
+	sw	t2, MC_IOGP(t1)
 
-	/* Clear Error log registers */
-	sw	zero, MC_ERRCAUSE(t0)
-	sw	zero, MC_ERRADDR(t0)
+	/* Set sdram refresh rate (4K/64ms @ 100MHz) */
+	li	t2, 0x0000061A
+	b	4f
+	sw	t2, MC_TREFRESH(t1)
+
+	/* 133 MHz clock */
+2:
+	/* Set clock ratio (clkrat=1:1, rddel=3) */
+	li	t2, 0x00000003
+	sw	t2, MC_IOGP(t1)
+
+	/* Set sdram refresh rate (4K/64ms @ 133MHz) */
+	li	t2, 0x00000822
+	b	4f
+	sw	t2, MC_TREFRESH(t1)
+
+	/* 150 MHz clock */
+3:
+	/* Set clock ratio (clkrat=3:2, rddel=4) */
+	li	t2, 0x00000014
+	sw	t2, MC_IOGP(t1)
+
+	/* Set sdram refresh rate (4K/64ms @ 150MHz) */
+	li	t2, 0x00000927
+	sw	t2, MC_TREFRESH(t1)
 
-	/* Set clock ratio to 1:1 */
-	li	t1, 0x03		/* clkrat=1:1, rddel=3 */
-	sw	t1, MC_IOGP(t0)
+4:
+	/* Clear Error log registers */
+	sw	zero, MC_ERRCAUSE(t1)
+	sw	zero, MC_ERRADDR(t1)
 
 	/* Clear Power-down registers */
-	sw	zero, MC_SELFRFSH(t0)
+	sw	zero, MC_SELFRFSH(t1)
 
 	/* Set CAS Latency */
-	li	t1, 0x00000020		/* CL = 2 */
-	sw	t1, MC_MRSCODE(t0)
+	li	t2, 0x00000020		/* CL = 2 */
+	sw	t2, MC_MRSCODE(t1)
 
 	/* Set word width to 16 bit */
-	li	t1, 0x2
-	sw	t1, MC_CFGDW(t0)
+	li	t2, 0x2
+	sw	t2, MC_CFGDW(t1)
 
 	/* Set CS0 to SDRAM parameters */
-	li	t1, 0x000014C9
-	sw	t1, MC_CFGPB0(t0)
+	li	t2, 0x000014C9
+	sw	t2, MC_CFGPB0(t1)
 
 	/* Set SDRAM latency parameters */
-	li	t1, 0x00026325		/* BC PC100 */
-	sw	t1, MC_LATENCY(t0)
-
-	/* Set SDRAM refresh rate */
-	li	t1, 0x00000C30		/* 4K/64ms @ 100MHz */
-	sw	t1, MC_TREFRESH(t0)
+	li	t2, 0x00026325		/* BC PC100 */
+	sw	t2, MC_LATENCY(t1)
 
+5:
 	/* Finally enable the controller */
-	li	t1, 1
-	sw	t1, MC_CTRLENA(t0)
+	li	t2, 0x00000001
+	sw	t2, MC_CTRLENA(t1)
 
 	j	ra
 	nop
+
+	.end	sdram_init
+
+
+	.globl	memsetup
+	.ent	memsetup
+memsetup:
+
+	/* EBU, CGU and SDRAM Initialization.
+	 */
+	li	a0, CPU_CLOCK_RATE
+	move	t0, ra
+
+	/* We rely on the fact that neither ebu_init() nor cgu_init() nor sdram_init()
+	 * modify t0 and a0.
+	 */
+	bal	cgu_init
+	nop
+	bal	ebu_init
+	nop
+	bal	sdram_init
+	nop
+	move	ra, t0
+
+	j	ra
+	nop
+
 	.end	memsetup
diff --git a/cpu/mips/incaip_clock.c b/cpu/mips/incaip_clock.c
index 9f327594f4..65ee8472d0 100644
--- a/cpu/mips/incaip_clock.c
+++ b/cpu/mips/incaip_clock.c
@@ -101,13 +101,15 @@ int incaip_set_cpuclk (void)
 {
 	extern void ebu_init(long);
 	extern void cgu_init(long);
+	extern void sdram_init(long);
 	uchar tmp[64];
 	ulong cpuclk;
 
 	if (getenv_r ("cpuclk", tmp, sizeof (tmp)) > 0) {
 		cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
-		ebu_init (cpuclk);
 		cgu_init (cpuclk);
+		ebu_init (cpuclk);
+		sdram_init (cpuclk);
 	}
 
 	return 0;
diff --git a/doc/README.MPC866 b/doc/README.MPC866
new file mode 100644
index 0000000000..1464a408ca
--- /dev/null
+++ b/doc/README.MPC866
@@ -0,0 +1,19 @@
+The current implementation allows the user to specify the desired CPU
+clock value, in MHz, via an environment variable "cpuclk".
+
+Three compile-time constants are used:
+
+	CFG_866_OSCCLK            - input quartz clock
+	CFG_866_CPUCLK_MIN        - minimum allowed CPU clock
+	CFG_866_CPUCLK_MAX        - maximum allowed CPU clock
+	CFG_866_CPUCLK_DEFAULT    - default CPU clock value
+
+If the "cpuclk" environment variable value is within the CPUCLK_MIN /
+CPUCLK_MAX limits, the specified value is used. Otherwise, the
+default CPU clock value is set.
+
+Please note that for now the new clock-handling code has been enabled
+for the TQM866M board only, even though it should be pretty much
+common for other MPC859 / MPC866 based boards also. Our intention
+here was to move in small steps and not to break the existing code
+for other boards.
diff --git a/include/configs/TQM866M.h b/include/configs/TQM866M.h
index 31f6d735a5..a5a759f2d7 100644
--- a/include/configs/TQM866M.h
+++ b/include/configs/TQM866M.h
@@ -36,16 +36,14 @@
 #define CONFIG_MPC866		1	/* This is a MPC866 CPU		*/
 #define CONFIG_TQM866M		1	/* ...on a TQM8xxM module	*/
 
-#define CFG_866_OSCCLK		10000000	/*  10 MHz - PLL input clock		*/
-#define CFG_866_CPUCLK_MIN	40000000	/*  40 MHz - CPU minimum clock		*/
+#define CFG_866_OSCCLK		 10000000	/*  10 MHz - PLL input clock		*/
+#define CFG_866_CPUCLK_MIN	 10000000	/*  10 MHz - CPU minimum clock		*/
 #define CFG_866_CPUCLK_MAX	133000000	/* 133 MHz - CPU maximum clock		*/
-#define CFG_866_CPUCLK_DEFAULT	100000000	/* 100 MHz - CPU default clock		*/
+#define CFG_866_CPUCLK_DEFAULT	 50000000	/*  50 MHz - CPU default clock		*/
 						/* (it will be used if there is no	*/
 						/* 'cpuclk' variable with valid value)	*/
 
 #define CONFIG_8xx_CONS_SMC1	1	/* Console is on SMC1		*/
-#undef	CONFIG_8xx_CONS_SMC2
-#undef	CONFIG_8xx_CONS_NONE
 
 #define CONFIG_BAUDRATE		115200	/* console baudrate = 115kbps	*/
 
diff --git a/include/configs/bms2003.h b/include/configs/bms2003.h
index 18170d4438..8a76a286e0 100644
--- a/include/configs/bms2003.h
+++ b/include/configs/bms2003.h
@@ -346,6 +346,7 @@
 #define CFG_PCMCIA_ATTRB_SIZE	( 64 << 20 )
 #define CFG_PCMCIA_IO_ADDR	(0xEC100000)
 #define CFG_PCMCIA_IO_SIZE	( 64 << 20 )
+#define PCMCIA_MEM_WIN_NO	5
 #define NSCU_OE_INV		1		/* PCMCIA_GCRX_CXOE is inverted */
 #endif
 
-- 
2.39.5