From 7ade0c634a979c32fa91a74e8f5775f24651fbe6 Mon Sep 17 00:00:00 2001
From: Stefan Roese <sr@denx.de>
Date: Tue, 24 Oct 2006 18:06:48 +0200
Subject: [PATCH] Fix bug in PPC440 NAND driver cpu/ppc4xx/ndfc.c Patch by
 Stefan Roese, 24 Oct 2006

---
 CHANGELOG         |  3 +++
 cpu/ppc4xx/ndfc.c | 13 +++++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index ed6396df8f..b9dd4469a5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,9 @@ Changes for U-Boot 1.1.5:
 
 * Fix sequoia separate object direcory building problems.
 
+* Fix bug in PPC440 NAND driver cpu/ppc4xx/ndfc.c
+  Patch by Stefan Roese, 24 Oct 2006
+
 * Cleanup compile warnings. Prepare for release 1.1.5
 
 * Fix compile problem in include/configs/ep82xxm.h
diff --git a/cpu/ppc4xx/ndfc.c b/cpu/ppc4xx/ndfc.c
index 2c44111da6..352173128d 100644
--- a/cpu/ppc4xx/ndfc.c
+++ b/cpu/ppc4xx/ndfc.c
@@ -144,16 +144,21 @@ static int ndfc_verify_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
 
 void board_nand_select_device(struct nand_chip *nand, int chip)
 {
+	/*
+	 * Don't use "chip" to address the NAND device,
+	 * generate the cs from the address where it is encoded.
+	 */
+	int cs = (ulong)nand->IO_ADDR_W & 0x00000003;
 	ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
 
 	/* Set NandFlash Core Configuration Register */
 	/* 1col x 2 rows */
-	out32(base + NDFC_CCR, 0x00000000 | (chip << 24));
+	out32(base + NDFC_CCR, 0x00000000 | (cs << 24));
 }
 
 void board_nand_init(struct nand_chip *nand)
 {
-	int chip = (ulong)nand->IO_ADDR_W & 0x00000003;
+	int cs = (ulong)nand->IO_ADDR_W & 0x00000003;
 	ulong base = (ulong)nand->IO_ADDR_W & 0xfffffffc;
 
 	nand->eccmode = NAND_ECC_SOFT;
@@ -181,8 +186,8 @@ void board_nand_init(struct nand_chip *nand)
 	/*
 	 * Select required NAND chip in NDFC
 	 */
-	board_nand_select_device(nand, chip);
-	out32(base + NDFC_BCFG0 + (chip << 2), 0x80002222);
+	board_nand_select_device(nand, cs);
+	out32(base + NDFC_BCFG0 + (cs << 2), 0x80002222);
 }
 
 #endif
-- 
GitLab